이더리움 지분증명(2) - 블록 제안

이한길·2024년 7월 12일
0

이더리움

목록 보기
4/6

1. 제안자 선정

검증자 활성화가 되고나면, 매 슬롯에서 한 명의 검증자가 제안자로 선정되어 블록을 생성할 수 있게 되고, 나머지 검증자들은 증명자가 되어 제안자 및 다른 노드로부터 새로운 블록을 받을 수 있게 된다.

2. 실행블록 생성

블록 제안자가 새로운 블록을 제안할 때, 합의 클라이언트는 실행 클라이언트에게 채택한 트랜잭션들을 로컬 멤풀에서 수집하게 하고, 트랜잭션을 실행하여 상태전이를 계산하게 하고, 이 정보를 다시 자신에게 전달하도록 요청한다. 요청을 받은 실행 클라이언트는 트랜잭션들을 실행 페이로드로 묶어 로컬에서 실행하여 상태전이를 생성하고 이 정보를 로컬 RPC 연결을 통해 합의 클라이언트로 전달한다.

실행 페이로드(ExecutionPayload):

class ExecutionPayload(Container):
    # Execution block header fields
    parent_hash: Hash32
    fee_recipient: ExecutionAddress  # 'beneficiary' in the yellow paper
    state_root: Bytes32
    receipts_root: Bytes32
    logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM]
    prev_randao: Bytes32  # 'difficulty' in the yellow paper
    block_number: uint64  # 'number' in the yellow paper
    gas_limit: uint64
    gas_used: uint64
    timestamp: uint64
    extra_data: ByteList[MAX_EXTRA_DATA_BYTES]
    base_fee_per_gas: uint256
    # Extra payload fields
    block_hash: Hash32  # Hash of execution block
    transactions: List[Transaction, MAX_TRANSACTIONS_PER_PAYLOAD]
    withdrawals: List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD]
    blob_gas_used: uint64  # [New in Deneb:EIP4844]
    excess_blob_gas: uint64  # [New in Deneb:EIP4844]

기본 정보

이전 블록 해시(parent_hash): 이전 블록의 헤더의 해시 값.

블록넘버(block_number): 현재 블록의 번호, 즉 상위 블록의 개수.

수수료 수령자(fee_recipient): 거래 수수료를 지불하기 위한 계좌 주소.

보상수령자(Beneficiary): 블록 보상금을 수령할 계정의 주소.?

타임스탬프(timestamp): 유닉스 시간 기준 블록 생성 시각.

기본 수수료(base_fee_per_gas): 기본 수수료 가치

실행블록 해시(block_hash): 실행 블록의 해시

로그 블룸(logs_bloom): 이벤트 로그를 포함하는 데이터 구조

이전 랜다오값(prev_randao): 무작위 검증자 선택에 사용되는 값

PoW 시절 논스를 찾을 때 사용된 시드 값을 나타내는 믹스해시(Mix Hash) 필드였으나, PoS 전환으로 EIP-3675에 의해 고정값 0x0000000000000000000000000000000000000000000000000000000000000000으로 대체되었다가, EIP-4399에 의해 이전 랜다오값을 나타내는 현재 필드로 변경되어 재사용됨.

기타 데이터(extra_data): 임의의 추가 데이터를 원시 바이트로 표현

루트 해시

상태 루트 해시(state_root): 이 블록에서 변경 사항을 적용한 후 글로벌 상태 데이터에 대한 루트 해시.

영수증 루트 해시(receipts_root): 트랜잭션 실행 후 결과를 요약한영수증 트라이의 해시

트랜잭션 루트 해시(transactions_root): 페이로드의 트랜잭션 루트 해시.

출금 루트 해시(withdrawal_root): 페이로드의 출금에 대한 루트 해시.

  • PoS 전환으로 EIP-4895에 의해 추가됨.

가스 관련 정보

가스제한(Gas Limit): 이 블록에서 허용되는 트랜잭션들의 최대 가스 총량

가스사용량(gas_used): 이 블록에서 실제로 사용된 트랜잭션들의 가스 총량

바디

트랜잭션 목록(transactions): 실행할 트랜잭션 목록, 즉 해당 블록의 트랜잭션 목록.

출금 목록(withdrawals): 출금자 목록

  • PoS 전환으로 EIP-4895에 의해 추가됨.

  • 출금계정주소(address): 출금한 계좌 주소

  • 출금액(amount): 출금 금액

  • 출금 인덱스(index): 출금 인덱스

  • 검증자 인덱스(validator Index): 검증자 인덱스 값

withdrawal_0 = [index_0, validator_index_0, address_0, amount_0]
withdrawal_1 = [index_1, validator_index_1, address_1, amount_1]

withdrawals = [withdrawal_0, withdrawal_1]

더미 데이터

난이도(Difficulty): PoW 시절 블록 생성 난이도를 나타내는 값이었으나, PoS 전환으로 EIP-3675에 의해 필드가 고정값 0으로 대체됨.

논스(Nonce): PoW 시절 논스값이었으나, PoS 전환으로 EIP-3675에 의해 필드가 고정값 0x0000000000000000으로 대체됨.

엉클블록 해시(ommers hash): PoW 시절 엉클블록 목록의 해시값이었으나, PoS 전환으로 EIP-3675에 의해 필드가 Keccak256(RLP([]))의 결과인 고정값 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347로 대체됨.

3. 상태전이

실행 페이로드 헤더(Execution Payload Header):

class ExecutionPayloadHeader(Container):
    # Execution block header fields
    parent_hash: Hash32
    fee_recipient: ExecutionAddress
    state_root: Bytes32
    receipts_root: Bytes32
    logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM]
    prev_randao: Bytes32
    block_number: uint64
    gas_limit: uint64
    gas_used: uint64
    timestamp: uint64
    extra_data: ByteList[MAX_EXTRA_DATA_BYTES]
    base_fee_per_gas: uint256
    # Extra payload fields
    block_hash: Hash32  # Hash of execution block
    transactions_root: Root
    withdrawals_root: Root
    blob_gas_used: uint64  # [New in Deneb:EIP4844]
    excess_blob_gas: uint64  # [New in Deneb:EIP4844]
profile
블록체인, 통계학, 수학, 인공지능 공부하고 있습니다

0개의 댓글