이더리움 디앱 스터디 책 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와 직접 통신하려면
- geth 콘솔에서 실행중인 geth의 인스턴스 중지
- —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 |