본문 바로가기

BlockChain

콜, 트랜잭션, 윈도우 geth사용하기

이더리움 디앱 스터디 책 117p ~ 143p

콜과 트랜잭션

일반적으로 컨트랙트 멤버 변수를 호출한다.

콜 메세지는 블록체인에 저장되지 않고 다음과 같은 특성을 지녔다.

  • 상태 변경 X, 읽기 전용 O
  • 가스 소모 X
  • 동기 처리
  • 반환값 즉시 리턴
  • 이더를 다른 컨트랙트 계정으로 옮길 수 없음

트랜잭션

블록체인에 저장되는 메세지를 통해 전송된다.

채굴 과정에서 직렬화 된다.

필드:

Sender address 송신자 주소

Recipient address 수신자 주소
Value 전송할 이더 수량 (선택)
Data 입력값. 메세지가 함수 호출에 사용되는 경우 (선택)
StartGa 최대 가스양. 최대 가스양 초과시 evm에서는 예외처리→ 메시지 상태 롤백 시킴
Digital signature 송신자 신원 증명
GasPrice 트랜잭션 처리하기 위한 가스 비용

트랜잭션 실행 특징 :

  • 블록체인 상태 변경 O
  • 가스 소모 O (이더로 비용 지불)
  • 비동기 처리. 채굴 과정중에 실행되며 새로운 블록에 포함된 뒤 네트워크에 전파.
  • 트랜잭션 ID반환
  • 이더를 컨트랙트 계정으로 전송 O

EVM

Ethereum Virtual Machine은 스택 기반의 추상 컴퓨팅 머신으로 자바 가산머신(JVM), 닷넷의 CLR(공용 언어 런타임)과 비슷하게 기능한다.

컴퓨터가 이더리움 앱을 실행할 수 있게 한다.

두개의 메모리 영역으로 구성된다.

  • 휘발성 메모리 / 메모리
    • 메모리는 주소 바이트 배열의 단어이다.
    • 메시지를 호출할 때마다 컨트랙트에 할당된다.
    • 읽기 : 256비트 단어.
    • 쓰기 : 8 / 256 비트
  • 스토리지
    • 키와 값의 크기가 모두 256인 키 이다.
    • 각 계정에 할당되며 블록체인에 저장됨.
    • CA는 자기 자신의 스토리지에만 접근할 수 있다.

EVM opcode(연산부호)는 bool, 비트 연산, 산술 비교와 점프(조건/무조건 부)연산을 포함한다.

컨트랙트를 생성, 호출 하는 주요 opcode :

  • Create : 새로운 컨트랙트 인스턴스 생성
  • Call : 자기 자신이나 다른 컨트랙트를 호출할 때 사용
  • DelegateCall : 호출 계약에서 외부 계약으로 메시지를 보냄. 호출자의 컨텍스트에서 관련 코드를 실행할 수도 있음. 여러 계약에서 액세스할 수 있는 공유 코드 라이브러리를 만드는 데 특히 유용하다.

EVM은 샌드박스 처럼 되어있다.

컨트랙트는 네트워크나 파일 시스템 리소스에 접근할 수 없고 다른 컨트랙트만 접근할 수 있다.

geth로 이더리움 네트워크 접속

이더리움 네트워크는 p2p네트워크. 네트워크를 조정하는 중앙 마스터 또는 서버 노드가 존재하지 않음. = 모든 노드가 서로에게 클라이언트인 것.

또한 와이어라는 정의된 프로토콜에 기반하여 정확히 동일한 방식으로 노드간에 통신 및 작동 하도록 설계됐음.

모든 노드는 채굴이 활성화되면 블록체인에 새로운 블록을 추가할 수 있어야 한다.

블록에 네트워크 전체로 전파되는 동안 트랜잭션을 검증할 수도 있어야 한다.

두가지 노드 형태 :

  • 채굴 노드
    • 최신 트랜잭션을 처리하여 블록체인에 저장.
    • 합의 알고리즘을 성공적으로 수행시 거래 수수료 + 채굴 보상을 받음.
    • 블록체인에 추가한 블록을 네트워크의 다른 피어에게 전파.
    • 생산자 역할을 한다.
    • 채굴 노드는 많이 보상받기 위해 트랜잭션 처리, 블록 생성, 작업 증명에 최적화된 클라이언트를 실행한다.
    • ethminer는 C++로 작성되고 NVIDIA의 CUDA와 같은 GPU라이브러리를 사용하여 GPU에서 실행, 뛰어난 채굴 성능을 보여줌.
  • 전체 노드
    • 인접한 피어가 보낸 블록의 유효선 검증 후 나머지 네트워크로 블록을 재 전파.
    • 소비자 역할을 한다.
    • 높은 성능 필요하지 않음 ⇒ 다양한 프로그래밍 언어로 구현되어 있는 클라이언트

ethernodes.org/network/1에 보고된 현재 사용되는 주요 클라이언트 (인지도 순서) :

 

Go Ethereum (Geth) Go
Parity Rust
Cpp-ethereum(eth) C++
Ethereum(J) Java
Pyethapp Python
ethereumjs-lib JavaScript
ruby-ethereum Ruby
ethereumH Haskell

그래틱 브라우저나 지갑 제공하는 클라이언트도 있음

1. geth 시작하기

geth 웹사이트 들어가서 설치하기.

geth와 상호작용 할 수 있는 두가지 방식 :

  • 사용자 친화적인 geth 대화형 자바스크립트 콘솔
  • HTTP를 통한 저수준 JSON-RPC 호출

2. geth 대화형 콘솔 시작하기

geth는 자바스크립트 문법을 사용할 수 있는 대화형 콘솔을 제공함.

이더리움 클라이언트를 활용할 수 있는 Web3.js를 내장하고 있음.

프로그래밍 언어 IDE에서 지원하는 REPL 콘솔과 비슷함.

지금까지 맥을 썼었는데 이 책은 윈도우로 설명한다고 하니 윈도우로 해보자

geth console

근데 동기화 중이라서 시간이 오래걸린데요….

그래서

geth --syncmode "light"

로 싱크를 빠르게 진행해 주었다.

geth attach ipc:\\\\.\\pipe\\geth.ipc

이 명령어는 맥에서 사용이 안됨… 왜 인지는 모르겠음

web3 버전 확인

> web3.version

web3.api 버전확인

> web3.version.api

변수 등록

> let apiVersion = web3.version.api
> let nodeVersion = web3.version.node

콘솔로 찍어보면 등록된 변수들이 잘 찍힘

연결상태 확인

> net

listening - geth가 이더리움과 연결되어있는지 bool값으로 리턴

peerCount - 연결되어있는 peer 숫자

노드에 대한 자세한 정보 호출

> admin.nodeInfo   //노드 상세 정보
> admin.peers  //연결된 피어들 상세 정보

길다… ㅎ

블록체인에 접속하기

web3.eth는 클라이언트와 블록체인의 실시간 정보를 가지고옴.

현재 실행 중인 geth 프로세스의 콘솔을 보면 새 블록이 어떻게 실시간으로 블록체인에 추가되는지를 볼 수 있음.

가장 최근에 추가된 블록 번호를 기록하고, 자바스크립트 콘솔에 eth.blockNumber 속성을 사용해 최신 블록정보를 비교 확인할 수 있다.

> let latestBlockNum = eth.blockNumber
> console.log(latestBlockNum) //15457935
> eth.getBlock(latestBlockNum)

get.getTransactionFromBlock(latestBlockNum, 0)

이더 단위 변환

web3 api는 이더를 wei로, wei를 이더로 변환할 수 있는 기능을 ㅔㅈ공함.

> let amountInWei = 12000000
> let amountInSzabo = web3.fromWei(amountInWei,'szabo')
> console.log(amountInwei, amountInSzabo )

“toWei”로 이더를 wei로 변경도 가능함

JSON-RPC 사용하기

json-rpc 호출을 통해 geth를 활용해보자.

geth는 RPC 인터페이스를 제공한다.

노드의 기능을 사용할 수 있고 web3 API가 제공하는 것보다 훨씬 정교하게 블록체인 데이터에 접근할 수 있다. (web3가 이더리움 플랫폼에서 가장 낮은 수준인 API RPC바로 다음이래용…)

web3.js = 저수준 json-rpc를 쉽게 사용할 수 있도록 감싸는 고수준 자바스크립트 api.

json-rpc를 통해 geth와 직접 통신하려면

  1. geth 콘솔에서 실행중인 geth의 인스턴스 중지
  2. —rpc및 —rpcapi옵션을 사용하여 rpc모드에서 geth를 시작한다.

'BlockChain' 카테고리의 다른 글

Wallet 호환 Token 만들기  (0) 2022.04.25
부트스트랩 노드  (1) 2022.03.28
[EVM] 이더리움 가상머신  (0) 2022.03.21
머클 패트리시아 트리  (0) 2022.03.14
openethereum 메인넷 구축  (1) 2021.11.30