diff --git a/consensus/merge/merge.go b/consensus/merge/merge.go index 2d0c7e12d6b..44d1cd544c8 100644 --- a/consensus/merge/merge.go +++ b/consensus/merge/merge.go @@ -203,7 +203,7 @@ func (s *Merge) Finalize(config *chain.Config, header *types.Header, state *stat consolidations := misc.DequeueConsolidationRequests7251(syscall) rs = append(rs, consolidations...) if requestsInBlock != nil || header.RequestsRoot != nil { - rh := types.DeriveSha(rs) + rh := rs.Hash() if *header.RequestsRoot != rh { return nil, nil, nil, fmt.Errorf("error: invalid requests root hash in header, expected: %v, got :%v", header.RequestsRoot, rh) } diff --git a/core/types/deposit_request.go b/core/types/deposit_request.go index 33638921322..a31134b8973 100644 --- a/core/types/deposit_request.go +++ b/core/types/deposit_request.go @@ -28,9 +28,7 @@ import ( "github.com/erigontech/erigon-lib/common/hexutil" "github.com/erigontech/erigon-lib/common/hexutility" - rlp2 "github.com/erigontech/erigon-lib/rlp" "github.com/erigontech/erigon/accounts/abi" - "github.com/erigontech/erigon/rlp" ) const ( @@ -70,37 +68,42 @@ type DepositRequestJson struct { func (d *DepositRequest) RequestType() byte { return DepositRequestType } func (d *DepositRequest) EncodeRLP(w io.Writer) (err error) { - var buf bytes.Buffer - bb := make([]byte, 10) - if err = rlp.Encode(&buf, d.Pubkey); err != nil { + b := []byte{} + b = append(b, DepositRequestType) + b = append(b, d.Pubkey[:]...) + b = append(b, d.WithdrawalCredentials.Bytes()...) + b = binary.LittleEndian.AppendUint64(b, d.Amount) + b = append(b, d.Signature[:]...) + b = binary.LittleEndian.AppendUint64(b, d.Index) + + if _, err = w.Write(b); err != nil { return err } - if err = rlp.Encode(&buf, d.WithdrawalCredentials); err != nil { - return err - } - if err = rlp.EncodeInt(d.Amount, &buf, bb); err != nil { - return err - } - if err = rlp.Encode(&buf, d.Signature); err != nil { - return err - } - if err = rlp.EncodeInt(d.Index, &buf, bb); err != nil { - return err - } - rlp2.EncodeListPrefix(buf.Len(), bb) - if _, err = w.Write([]byte{DepositRequestType}); err != nil { - return err - } - if _, err = w.Write(bb[0:2]); err != nil { - return err - } - if _, err = w.Write(buf.Bytes()); err != nil { - return err - } - return } -func (d *DepositRequest) DecodeRLP(input []byte) error { return rlp.DecodeBytes(input[1:], d) } +func (d *DepositRequest) DecodeRLP(input []byte) error { + if len(input) != d.EncodingSize() { + return errors.New("Error decoding Deposit Request RLP - size mismatch in input") + } + i := 1 + d.Pubkey = [BLSPubKeyLen]byte(input[i : i+BLSPubKeyLen]) + i += BLSPubKeyLen + d.WithdrawalCredentials = libcommon.Hash(input[i : i+WithdrawalCredentialsLen]) + i += WithdrawalCredentialsLen + d.Amount = binary.LittleEndian.Uint64(input[i : i+8]) + i += 8 + d.Signature = [BLSSigLen]byte(input[i : i+BLSSigLen]) + i += BLSSigLen + d.Index = binary.LittleEndian.Uint64(input[i : i+8]) + return nil +} + +func (d *DepositRequest) Encode() []byte { + b := bytes.NewBuffer([]byte{}) + d.EncodeRLP(b) + return b.Bytes() +} + func (d *DepositRequest) copy() Request { return &DepositRequest{ Pubkey: d.Pubkey, @@ -112,15 +115,7 @@ func (d *DepositRequest) copy() Request { } func (d *DepositRequest) EncodingSize() (encodingSize int) { - encodingSize++ - encodingSize += rlp.IntLenExcludingHead(d.Amount) - encodingSize++ - encodingSize += rlp.IntLenExcludingHead(d.Index) - - encodingSize += 180 // 1 + 48 + 1 + 32 + 1 + 1 + 96 (0x80 + pLen, 0x80 + wLen, 0xb8 + 2 + sLen) - encodingSize += rlp2.ListPrefixLen(encodingSize) - encodingSize += 1 //RequestType - return + return 1 + BLSPubKeyLen + WithdrawalCredentialsLen + 8 + BLSSigLen + 8 // } func (d *DepositRequest) MarshalJSON() ([]byte, error) { diff --git a/core/types/request.go b/core/types/request.go index d033ee1cdcb..34f046ddd05 100644 --- a/core/types/request.go +++ b/core/types/request.go @@ -24,7 +24,10 @@ import ( "math/bits" "github.com/erigontech/erigon-lib/common" + libcommon "github.com/erigontech/erigon-lib/common" rlp2 "github.com/erigontech/erigon-lib/rlp" + "github.com/erigontech/erigon/crypto" + "github.com/erigontech/erigon/crypto/cryptopool" "github.com/erigontech/erigon/rlp" ) @@ -38,6 +41,7 @@ type Request interface { EncodeRLP(io.Writer) error DecodeRLP([]byte) error RequestType() byte + Encode() []byte copy() Request EncodingSize() int } @@ -99,6 +103,7 @@ func (r *Requests) DecodeRLP(s *rlp.Stream) (err error) { } } + func (r *Requests) EncodeRLP(w io.Writer) { if r == nil { return @@ -130,6 +135,16 @@ func (r *Requests) EncodingSize() int { return c } +func (r *Requests) Hash() (h libcommon.Hash) { + sha := crypto.NewKeccakState() + for _, req := range *r { + sha.Write(crypto.Keccak256(req.Encode())) + } + sha.Read(h[:]) //nolint:errcheck + cryptopool.ReturnToPoolKeccak256(sha) + return h +} + func (r Requests) Deposits() DepositRequests { deposits := make(DepositRequests, 0, len(r)) for _, req := range r { diff --git a/erigon-lib/gointerfaces/typesproto/types.pb.go b/erigon-lib/gointerfaces/typesproto/types.pb.go index 6b7a6c5d0cd..2a6a5e5cffd 100644 --- a/erigon-lib/gointerfaces/typesproto/types.pb.go +++ b/erigon-lib/gointerfaces/typesproto/types.pb.go @@ -1503,7 +1503,7 @@ func file_types_types_proto_rawDescGZIP() []byte { } var file_types_types_proto_msgTypes = make([]protoimpl.MessageInfo, 17) -var file_types_types_proto_goTypes = []any{ +var file_types_types_proto_goTypes = []interface{}{ (*H128)(nil), // 0: types.H128 (*H160)(nil), // 1: types.H160 (*H256)(nil), // 2: types.H256 @@ -1565,7 +1565,7 @@ func file_types_types_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_types_types_proto_msgTypes[0].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*H128); i { case 0: return &v.state @@ -1577,7 +1577,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[1].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*H160); i { case 0: return &v.state @@ -1589,7 +1589,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[2].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*H256); i { case 0: return &v.state @@ -1601,7 +1601,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[3].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*H512); i { case 0: return &v.state @@ -1613,7 +1613,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[4].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*H1024); i { case 0: return &v.state @@ -1625,7 +1625,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[5].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*H2048); i { case 0: return &v.state @@ -1637,7 +1637,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[6].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VersionReply); i { case 0: return &v.state @@ -1649,7 +1649,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[7].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExecutionPayload); i { case 0: return &v.state @@ -1661,7 +1661,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[8].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DepositRequest); i { case 0: return &v.state @@ -1673,7 +1673,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[9].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WithdrawalRequest); i { case 0: return &v.state @@ -1685,7 +1685,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[10].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConsolidationRequest); i { case 0: return &v.state @@ -1697,7 +1697,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[11].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Withdrawal); i { case 0: return &v.state @@ -1709,7 +1709,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[12].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BlobsBundleV1); i { case 0: return &v.state @@ -1721,7 +1721,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[13].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeInfoPorts); i { case 0: return &v.state @@ -1733,7 +1733,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[14].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeInfoReply); i { case 0: return &v.state @@ -1745,7 +1745,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[15].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeerInfo); i { case 0: return &v.state @@ -1757,7 +1757,7 @@ func file_types_types_proto_init() { return nil } } - file_types_types_proto_msgTypes[16].Exporter = func(v any, i int) any { + file_types_types_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExecutionPayloadBodyV1); i { case 0: return &v.state @@ -1770,7 +1770,7 @@ func file_types_types_proto_init() { } } } - file_types_types_proto_msgTypes[7].OneofWrappers = []any{} + file_types_types_proto_msgTypes[7].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/tests/exec_spec_test.go b/tests/exec_spec_test.go index 974f3106c99..aa6cf700c48 100644 --- a/tests/exec_spec_test.go +++ b/tests/exec_spec_test.go @@ -37,6 +37,9 @@ func TestExecutionSpec(t *testing.T) { bt.skipLoad(`^prague/eip2935_historical_block_hashes_from_state/block_hashes/block_hashes_history.json`) bt.skipLoad(`^prague/eip7251_consolidations/`) bt.skipLoad(`^prague/eip7685_general_purpose_el_requests/`) + bt.skipLoad(`^prague/eip6110_deposits/`) + bt.skipLoad(`^prague/eip7002_el_triggerable_withdrawals/`) + bt.skipLoad(`^prague/eip6110_deposits/`) bt.skipLoad(`^prague/eip7002_el_triggerable_withdrawals/`) checkStateRoot := true