Transaction
트랜잭션은 EOA에 의해 서명된 메시지 이더리움의 상태를 변경하거나 컨트랙트를 실행 시키고, 블록체인에 데이터를 저장한다.
- 구성요소
- Nonce: 메시지 재사용을 방지하는 메시지의 일련번호
- gas price: 발신자가 지급하는 가스의 가격
- gas limit: 구입할 가스의 최대량
- recipient: 목적지 이더리움 주소
- value: 보내는 이더의 양
- data: 가볍 길이 바이너리 데이터 페이로드
- v, r, s: ECDSA 디지털 서명의 구성요소
- 이 정보로부터 발신자 데이터를 얻을 수 있다.
- RLP(recursive length prefix) 인코딩을 통해서 시리얼라이즈 된다.
Transaction Nonce
해당 주소에서 보낸 트랜잭션의 건수 또는 연결된 코드가 있는 계정의 경우 이 계정에서 만든 컨트랙트 생성 선수와 동일한 스칼라 값
-
발신 주소의 속성 (해당 주소에서 발생한 트랜잭션 건수를 세어서 동적으로 계산됨)
-
usecase
- 트랜잭션의 처리 순서 보장
- nonce가 4인 트랜잭션은 nonce가 0-3인 트랜잭션이 모두 처리 된 후 처리된다.
- 트랜잭션 중복 적용 방지
- 디지털 서명과 결함되어 트랜잭션은 한번만 실행된다.
- 트랜잭션의 처리 순서 보장
-
아래 코드를 통해서 nonce를 얻을 수 있다.
web3.eth.getTransactionCount({ETH_ADDRESS})
Concurrency 문제
nonce에서 동시 문제가 발생한다.
- 해결법
- 하나의 컴퓨터에서 nonce를 발급 받는다.
- 단점: 하나의 실패 지점이 생긴다.
- 트랜잭션을 만들고 논스를 할당하지 않는다.
- 그러고 하나의 대기열에 올려서 논스를 할당하고 서명을 한다.
- 단점: 병목현상이 생길 수 있다.
- 하나의 컴퓨터에서 nonce를 발급 받는다.
Transaction Gas
이더리움의 연료
- 이더에 대한 자체 환율을 가진 가상 화폐
gasPrice
-
gas price가 높을 수록 트랜잭션이 빠르게 받아들여진다.
- gas price에 대한 제한은 없다. (0으로 할 수도 있는데 안 받아들여질 수 있다.)
-
아래 코드를 통해 gas의 중간 가격을 제안한다.
web3.eth.getGasPrice(console.log)
gasLimit
- 지불할 gas의 최대량을 지정한다.
- 필요한 gas의 양은 예상은 할 수 있어도 정확히 결정할 순 없다.
- gas limit이 적어서 transaction을 완료하지 못 하면, gas와 transaction 둘다 날린다.
Transaction Recipient
- 20바이트의 이더리움 주소
- 검증은 따로 안 한다. (그래서 잘못된 주소로 갈 수 있고, 보내진 이더는 되찾을 수 없다.)
Transaction Value & Payload
value, payload는 둘다 optional이다.
// 지급
web3.eth.sendTrasaction({from: src, to: dst, value: web3.toWei(0.01, "ether"), data: ""})
// 지급과 호출
web3.eth.sendTrasaction({from: src, to: dst, value: web3.toWei(0.01, "ether"), data: "0x1234"})
// 호출
web3.eth.sendTrasaction({from: src, to: dst, value: 0, data: "0x1234"})
web3.eth.sendTrasaction({from: src, to: dst, value: 0, data: ""})
- 값 전달
- EOA에 지급을 통해서 ETH를 보낼 수 있다.
- contract에 지급을 하면 EVM은 fallback function을 호출한다.
- data payload 전달
- 지갑은 보통 데이터를 무시한다.
- contract를 호출 하면 데이터를 함수 호출에 사용한다.
Contract 호출
데이터는 함수 선택기, 함수 인수를 16 진수로 시리얼라이즈한 인코딩이다.
- 함수 선택기
- 함수 프로토타입의 Keccak-256 Hashdml 처음 4바이트
- 함수 인수
- ABI 사양에 정의된 규칙에 따라 인코딩
Trasaction 전파
이더리움에서는 flood routing protocol을 사용
- 트랜잭션 전파는 서명된 트랜잭션을 생성한 이더리움 노드에서 시작
- 트랜잭션을 검증한 후 이웃들에게 전송
- 이웃 노드도 트랜잭션을 유효성 검사
- 타당하면 사본을 저장한 후, 이웃들에게 전송
블록체인에 기록
-
이더리움 노드 중 일부는 PoS에 참여
- 32ETH를 예치 함으로써 참여 가능
-
이전엔 채굴을 했음
- 채굴 컴퓨터는 트랜잭션을 후보 블록에 추가하고 후보 블록을 유효하게 만드는 작업 증명을 찾음
- 유효한 트랜잭션이 결국 트랜잭션 블록에 포함되어 이더리움 블록체인에 기록
- 계정 잔액이 수정되거나 싱글톤 상태를 수정하는 등의 변경 사항은 영수증 형식으로 트랜잭션과 함께 기록됨