diff --git a/eth/common/blocks.nim b/eth/common/blocks.nim index 6d539f9..9dd4fd0 100644 --- a/eth/common/blocks.nim +++ b/eth/common/blocks.nim @@ -18,49 +18,16 @@ type address* : Address amount* : uint64 - DepositRequest* = object # EIP-6110 - pubkey* : Bytes48 - withdrawalCredentials*: Bytes32 - amount* : uint64 - signature* : Bytes96 - index* : uint64 - - WithdrawalRequest* = object # EIP-7002 - sourceAddress* : Address - validatorPubkey*: Bytes48 - amount* : uint64 - - ConsolidationRequest* = object # EIP-7251 - sourceAddress*: Address - sourcePubkey* : Bytes48 - targetPubkey* : Bytes48 - - RequestType* = enum - DepositRequestType # EIP-6110 - WithdrawalRequestType # EIP-7002 - ConsolidationRequestType # EIP-7251 - - Request* = object - case requestType*: RequestType - of DepositRequestType: - deposit*: DepositRequest - of WithdrawalRequestType: - withdrawal*: WithdrawalRequest - of ConsolidationRequestType: - consolidation*: ConsolidationRequest - BlockBody* = object transactions*: seq[Transaction] uncles*: seq[Header] withdrawals*: Opt[seq[Withdrawal]] # EIP-4895 - requests*: Opt[seq[Request]] # EIP-7865 Block* = object header* : Header transactions*: seq[Transaction] uncles* : seq[Header] withdrawals*: Opt[seq[Withdrawal]] # EIP-4895 - requests*: Opt[seq[Request]] # EIP-7865 const EMPTY_UNCLE_HASH* = hash32"1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" @@ -77,15 +44,3 @@ func init*(T: type Block, header: Header, body: BlockBody): T = template txs*(blk: Block): seq[Transaction] = # Legacy name emulation blk.transactions - -func `==`*(a, b: Request): bool = - if a.requestType != b.requestType: - return false - - case a.requestType - of DepositRequestType: - a.deposit == b.deposit - of WithdrawalRequestType: - a.withdrawal == b.withdrawal - of ConsolidationRequestType: - a.consolidation == b.consolidation diff --git a/eth/common/blocks_rlp.nim b/eth/common/blocks_rlp.nim index 3769768..f5416e3 100644 --- a/eth/common/blocks_rlp.nim +++ b/eth/common/blocks_rlp.nim @@ -12,146 +12,3 @@ import ./[addresses_rlp, blocks, base_rlp, hashes_rlp], ../rlp from stew/objects import checkedEnumAssign export addresses_rlp, blocks, base_rlp, hashes_rlp, rlp - -proc append*(rlpWriter: var RlpWriter, request: DepositRequest) = - rlpWriter.appendRawBytes([DepositRequestType.byte]) - rlpWriter.startList(5) - rlpWriter.append(request.pubkey) - rlpWriter.append(request.withdrawalCredentials) - rlpWriter.append(request.amount) - rlpWriter.append(request.signature) - rlpWriter.append(request.index) - -proc read*(rlp: var Rlp, T: type DepositRequest): T {.raises: [RlpError].} = - if not rlp.hasData: - raise (ref MalformedRlpError)( - msg: "DepositRequestType expected but source RLP is empty" - ) - let reqType = rlp.readRawByte() - if reqType != DepositRequestType: - raise (ref UnsupportedRlpError)(msg: "Unexpected DepositRequestType: " & $reqType) - - var res: DepositRequest - rlp.tryEnterList() - rlp.read(res.pubkey) - rlp.read(res.withdrawalCredentials) - rlp.read(res.amount) - rlp.read(res.signature) - rlp.read(res.index) - if rlp.hasData: - raise (ref MalformedRlpError)(msg: "Extra data after DepositRequest") - res - -proc append*(rlpWriter: var RlpWriter, request: WithdrawalRequest) = - rlpWriter.appendRawBytes([WithdrawalRequestType.byte]) - rlpWriter.startList(3) - rlpWriter.append(request.sourceAddress) - rlpWriter.append(request.validatorPubkey) - rlpWriter.append(request.amount) - -proc read*(rlp: var Rlp, T: type WithdrawalRequest): T {.raises: [RlpError].} = - if not rlp.hasData: - raise (ref MalformedRlpError)( - msg: "WithdrawalRequestType expected but source RLP is empty" - ) - let reqType = rlp.readRawByte() - if reqType != WithdrawalRequestType: - raise - (ref UnsupportedRlpError)(msg: "Unexpected WithdrawalRequestType: " & $reqType) - - var res: WithdrawalRequest - rlp.tryEnterList() - rlp.read(res.sourceAddress) - rlp.read(res.validatorPubkey) - rlp.read(res.amount) - if rlp.hasData: - raise (ref MalformedRlpError)(msg: "Extra data after WithdrawalRequest") - res - -proc append*(rlpWriter: var RlpWriter, request: ConsolidationRequest) = - rlpWriter.appendRawBytes([ConsolidationRequestType.byte]) - rlpWriter.startList(3) - rlpWriter.append(request.sourceAddress) - rlpWriter.append(request.sourcePubkey) - rlpWriter.append(request.targetPubkey) - -proc read*(rlp: var Rlp, T: type ConsolidationRequest): T {.raises: [RlpError].} = - if not rlp.hasData: - raise (ref MalformedRlpError)( - msg: "ConsolidationRequestType expected but source RLP is empty" - ) - let reqType = rlp.readRawByte() - if reqType != ConsolidationRequestType: - raise - (ref UnsupportedRlpError)(msg: "Unexpected ConsolidationRequestType: " & $reqType) - - var res: ConsolidationRequest - rlp.tryEnterList() - rlp.read(res.sourceAddress) - rlp.read(res.sourcePubkey) - rlp.read(res.targetPubkey) - if rlp.hasData: - raise (ref MalformedRlpError)(msg: "Extra data after ConsolidationRequest") - res - -proc append*(rlpWriter: var RlpWriter, request: Request) = - case request.requestType - of DepositRequestType: - rlpWriter.append(request.deposit) - of WithdrawalRequestType: - rlpWriter.append(request.withdrawal) - of ConsolidationRequestType: - rlpWriter.append(request.consolidation) - -proc append*(rlpWriter: var RlpWriter, reqs: seq[Request] | openArray[Request]) = - rlpWriter.startList(reqs.len) - for req in reqs: - rlpWriter.append(rlp.encode(req)) - -proc read*(rlp: var Rlp, T: type Request): T {.raises: [RlpError].} = - if not rlp.hasData: - raise newException(MalformedRlpError, "Request expected but source RLP is empty") - if not rlp.isSingleByte: - raise newException( - MalformedRlpError, "RequestType byte is out of range, must be 0x00 to 0x7f" - ) - - let reqType = rlp.getByteValue - rlp.position += 1 - - var reqVal: RequestType - if checkedEnumAssign(reqVal, reqType): - result = Request(requestType: reqVal) - rlp.tryEnterList() - case reqVal - of DepositRequestType: - rlp.read(result.deposit.pubkey) - rlp.read(result.deposit.withdrawalCredentials) - rlp.read(result.deposit.amount) - rlp.read(result.deposit.signature) - rlp.read(result.deposit.index) - of WithdrawalRequestType: - rlp.read(result.withdrawal.sourceAddress) - rlp.read(result.withdrawal.validatorPubkey) - rlp.read(result.withdrawal.amount) - of ConsolidationRequestType: - rlp.read(result.consolidation.sourceAddress) - rlp.read(result.consolidation.sourcePubkey) - rlp.read(result.consolidation.targetPubkey) - else: - raise (ref UnsupportedRlpError)(msg: "Unexpected RequestType: " & $reqType) - -proc read*( - rlp: var Rlp, T: (type seq[Request]) | (type openArray[Request]) -): seq[Request] {.raises: [RlpError].} = - if not rlp.isList: - raise newException( - RlpTypeMismatch, "Requests list expected, but source RLP is not a list" - ) - - var reqs: seq[Request] - for item in rlp: - var rr = rlpFromBytes(rlp.read(seq[byte])) - reqs.add rr.read(Request) - - reqs diff --git a/eth/common/eth_types.nim b/eth/common/eth_types.nim index 00460b7..e8086fb 100644 --- a/eth/common/eth_types.nim +++ b/eth/common/eth_types.nim @@ -33,14 +33,11 @@ type EthAccount* = Account EthAddress* = Address EthBlock* = Block - EthConsolidationRequest* = ConsolidationRequest - EthDepositRequest* = DepositRequest EthHash32* = Hash32 EthHeader* = Header EthTransaction* = Transaction EthReceipt* = Receipt EthWithdrawal* = Withdrawal - EthWithdrawalRequest* = WithdrawalRequest func init*(T: type BlockHashOrNumber, str: string): T {.raises: [ValueError].} = if str.startsWith "0x": diff --git a/eth/common/eth_types_rlp.nim b/eth/common/eth_types_rlp.nim index 07b1f19..7ce4e37 100644 --- a/eth/common/eth_types_rlp.nim +++ b/eth/common/eth_types_rlp.nim @@ -6,13 +6,13 @@ import "."/[ - accounts_rlp, addresses_rlp, base_rlp, blocks_rlp, eth_types, hashes_rlp, + accounts_rlp, addresses_rlp, base_rlp, eth_types, hashes_rlp, headers_rlp, receipts_rlp, times_rlp, transactions_rlp, ], ../rlp export - accounts_rlp, addresses_rlp, base_rlp, blocks_rlp, eth_types, hashes_rlp, + accounts_rlp, addresses_rlp, base_rlp, eth_types, hashes_rlp, headers_rlp, receipts_rlp, times_rlp, transactions_rlp, rlp proc append*(rlpWriter: var RlpWriter, value: BlockHashOrNumber) = diff --git a/tests/common/test_eth_types_rlp.nim b/tests/common/test_eth_types_rlp.nim index f11cbcb..30fd3d8 100644 --- a/tests/common/test_eth_types_rlp.nim +++ b/tests/common/test_eth_types_rlp.nim @@ -246,53 +246,3 @@ template genTestOpt(TT) = genTestOpt(BlockBodyOpt) genTestOpt(EthBlockOpt) - -suite "EIP-7865 tests": - const reqs = [ - Request( - requestType: DepositRequestType, - deposit: DepositRequest( - pubkey : bytes48"0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - withdrawalCredentials: bytes32"0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", - amount : 1, - signature : bytes96"0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - index : 3, - ) - ), - Request( - requestType: WithdrawalRequestType, - withdrawal: WithdrawalRequest( - sourceAddress : address"0xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", - validatorPubkey: bytes48"0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - amount : 7, - ) - ), - Request( - requestType: ConsolidationRequestType, - consolidation: ConsolidationRequest( - sourceAddress: address"0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", - sourcePubkey : bytes48"0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - targetPubkey : bytes48"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", - ) - ) - ] - - test "rlp roundtrip": - let - body = BlockBody( - withdrawals: Opt.some(@[Withdrawal()]), - requests: Opt.some(@reqs) - ) - - blk = EthBlock( - withdrawals: Opt.some(@[Withdrawal()]), - requests: Opt.some(@reqs) - ) - - encodedBody = rlp.encode(body) - encodedBlock = rlp.encode(blk) - decodedBody = rlp.decode(encodedBody, BlockBody) - decodedBlk = rlp.decode(encodedBlock, EthBlock) - - check decodedBody == body - check decodedBlk == blk