검증자 활성화가 되고나면, 매 슬롯에서 한 명의 검증자가 제안자로 선정되어 블록을 생성할 수 있게 되고, 나머지 검증자들은 증명자가 되어 제안자 및 다른 노드로부터 새로운 블록을 받을 수 있게 된다.
블록 제안자가 새로운 블록을 제안할 때, 합의 클라이언트는 실행 클라이언트에게 채택한 트랜잭션들을 로컬 멤풀에서 수집하게 하고, 트랜잭션을 실행하여 상태전이를 계산하게 하고, 이 정보를 다시 자신에게 전달하도록 요청한다. 요청을 받은 실행 클라이언트는 트랜잭션들을 실행 페이로드로 묶어 로컬에서 실행하여 상태전이를 생성하고 이 정보를 로컬 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): 페이로드의 출금에 대한 루트 해시.
가스제한(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
로 대체됨.
실행 페이로드 헤더(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]