transaction

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를 발급 받는다.
      • 단점: 하나의 실패 지점이 생긴다.
    • 트랜잭션을 만들고 논스를 할당하지 않는다.
      • 그러고 하나의 대기열에 올려서 논스를 할당하고 서명을 한다.
      • 단점: 병목현상이 생길 수 있다.

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을 사용

  1. 트랜잭션 전파는 서명된 트랜잭션을 생성한 이더리움 노드에서 시작
  2. 트랜잭션을 검증한 후 이웃들에게 전송
  3. 이웃 노드도 트랜잭션을 유효성 검사
  4. 타당하면 사본을 저장한 후, 이웃들에게 전송

블록체인에 기록

  • 이더리움 노드 중 일부는 PoS에 참여

    • 32ETH를 예치 함으로써 참여 가능
  • 이전엔 채굴을 했음

    • 채굴 컴퓨터는 트랜잭션을 후보 블록에 추가하고 후보 블록을 유효하게 만드는 작업 증명을 찾음
    • 유효한 트랜잭션이 결국 트랜잭션 블록에 포함되어 이더리움 블록체인에 기록
    • 계정 잔액이 수정되거나 싱글톤 상태를 수정하는 등의 변경 사항은 영수증 형식으로 트랜잭션과 함께 기록됨