diff --git a/cmd/shisui/main.go b/cmd/shisui/main.go index 7f252ab083..b2f033f617 100644 --- a/cmd/shisui/main.go +++ b/cmd/shisui/main.go @@ -290,7 +290,7 @@ func initState(config Config, server *rpc.Server, conn discover.UDPConn, localNo if err != nil { return err } - historyNetwork := state.NewStateNetwork(protocol) + historyNetwork := state.NewStateNetwork(protocol, server) return historyNetwork.Start() } diff --git a/go.mod b/go.mod index e8cef6cf06..a011059d10 100644 --- a/go.mod +++ b/go.mod @@ -78,6 +78,7 @@ require ( golang.org/x/tools v0.20.0 google.golang.org/protobuf v1.34.2 gopkg.in/natefinch/lumberjack.v2 v2.2.1 + gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -148,7 +149,6 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.24.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/portalnetwork/history/types.go b/portalnetwork/history/types.go index 38a494247c..82de425074 100644 --- a/portalnetwork/history/types.go +++ b/portalnetwork/history/types.go @@ -58,8 +58,23 @@ func (p *BlockHeaderProof) MarshalSSZ() ([]byte, error) { return ssz.MarshalSSZ(p) } -func (p *BlockHeaderProof) MarshalSSZTo(_ []byte) (dst []byte, err error) { - return ssz.MarshalSSZ(p) +func (p *BlockHeaderProof) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + dst = append(dst, byte(p.Selector)) + if p.Selector != none { + if len(p.Proof) != 15 { + err = ssz.ErrBytesLengthFn("proofs size should be", len(p.Proof), 15) + return + } + for _, item := range p.Proof { + if len(item) != 32 { + err = ssz.ErrBytesLengthFn("single proof size should be", len(item), 32) + return + } + dst = append(dst, item...) + } + } + return } func (p *BlockHeaderProof) UnmarshalSSZ(buf []byte) (err error) { diff --git a/portalnetwork/state/network.go b/portalnetwork/state/network.go index 8e793dc26c..3a497fff9b 100644 --- a/portalnetwork/state/network.go +++ b/portalnetwork/state/network.go @@ -1,10 +1,23 @@ package state import ( + "bytes" "context" + "errors" + "fmt" + "time" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/portalnetwork/history" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/trie" + "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/zrnt/eth2/configs" + "github.com/protolambda/ztyp/codec" ) type StateNetwork struct { @@ -12,16 +25,22 @@ type StateNetwork struct { closeCtx context.Context closeFunc context.CancelFunc log log.Logger + spec *common.Spec + client *rpc.Client } -func NewStateNetwork(portalProtocol *discover.PortalProtocol) *StateNetwork { +func NewStateNetwork(portalProtocol *discover.PortalProtocol, rpcServer *rpc.Server) *StateNetwork { ctx, cancel := context.WithCancel(context.Background()) + client := rpc.DialInProc(rpcServer) + return &StateNetwork{ portalProtocol: portalProtocol, closeCtx: ctx, closeFunc: cancel, log: log.New("sub-protocol", "state"), + spec: configs.Mainnet, + client: client, } } @@ -72,6 +91,143 @@ func (h *StateNetwork) processContentLoop(ctx context.Context) { } func (h *StateNetwork) validateContents(contentKeys [][]byte, contents [][]byte) error { - // TODO - panic("implement me") + for i, content := range contents { + contentKey := contentKeys[i] + err := h.validateContent(contentKey, content) + if err != nil { + h.log.Error("content validate failed", "contentKey", hexutil.Encode(contentKey), "content", hexutil.Encode(content), "err", err) + return fmt.Errorf("content validate failed with content key %x and content %x", contentKey, content) + } + contentId := h.portalProtocol.ToContentId(contentKey) + _ = h.portalProtocol.Put(contentKey, contentId, content) + } + return nil +} + +func (h *StateNetwork) validateContent(contentKey []byte, content []byte) error { + keyType := contentKey[0] + switch keyType { + case AccountTrieNodeType: + return h.validateAccountTrieNode(contentKey[1:], content) + case ContractStorageTrieNodeType: + return validateContractStorageTrieNode(h.spec, contentKey[1:], content) + case ContractByteCodeType: + return validateContractByteCode(h.spec, contentKey[1:], content) + } + return errors.New("unknown content type") +} + +func (h *StateNetwork) validateAccountTrieNode(contentKey []byte, content []byte) error { + accountKey := &AccountTrieNodeKey{} + err := accountKey.Deserialize(codec.NewDecodingReader(bytes.NewReader(contentKey), uint64(len(contentKey)))) + if err != nil { + return err + } + accountData := &AccountTrieNodeWithProof{} + err = accountData.Deserialize(codec.NewDecodingReader(bytes.NewReader(content), uint64(len(content)))) + if err != nil { + return err + } + // get HeaderWithProof in history network + stateRoot, err := h.getStateRoot(accountData.BlockHash) + + if err != nil { + return err + } + err = validateNodeTrieProof(stateRoot, accountKey.NodeHash, &accountKey.Path, &accountData.Proof) + return err +} + +func validateContractStorageTrieNode(spec *common.Spec, contentKey []byte, content []byte) error { + return nil +} + +func validateContractByteCode(spec *common.Spec, contentKey []byte, content []byte) error { + return nil +} + +func (h *StateNetwork) getStateRoot(blockHash common.Bytes32) (common.Bytes32, error) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) + defer cancel() + contentKey := make([]byte, 0) + contentKey = append(contentKey, byte(history.BlockHeaderType)) + contentKey = append(contentKey, blockHash[:]...) + + arg := hexutil.Encode(contentKey) + res := &discover.ContentInfo{} + err := h.client.CallContext(ctx, res, "portal_historyRecursiveFindContent", arg) + if err != nil { + return common.Bytes32{}, err + } + data, err := hexutil.Decode(res.Content) + if err != nil { + return common.Bytes32{}, err + } + headerWithProof, err := history.DecodeBlockHeaderWithProof(data) + if err != nil { + return common.Bytes32{}, err + } + header := new(types.Header) + err = rlp.DecodeBytes(headerWithProof.Header, header) + if err != nil { + return common.Bytes32{}, err + } + return common.Bytes32(header.Root), nil +} + +func validateNodeTrieProof(rootHash common.Bytes32, nodeHash common.Bytes32, path *Nibbles, proof *TrieProof) error { + lastNode, p, err := validateTrieProof(rootHash, path.Nibbles, proof) + if err != nil { + return err + } + if len(p) != 0 { + return errors.New("path is too long") + } + err = checkNodeHash(&lastNode, nodeHash[:]) + if err != nil { + return err + } + return nil +} + +func validateTrieProof(rootHash common.Bytes32, path []byte, proof *TrieProof) (EncodedTrieNode, []byte, error) { + if len(*proof) == 0 { + return nil, nil, errors.New("proof should be empty") + } + firstNode := []EncodedTrieNode(*proof)[0] + err := checkNodeHash(&firstNode, rootHash[:]) + if err != nil { + return nil, nil, err + } + + node := firstNode + remainingPath := path + + for _, nextNode := range []EncodedTrieNode(*proof)[1:] { + n, err := trie.DecodeTrieNode(nil, node) + if err != nil { + return nil, nil, err + } + hashNode, p, err := trie.TraverseTrieNode(n, remainingPath) + if err != nil { + return nil, nil, err + } + err = checkNodeHash(&nextNode, hashNode) + + if err != nil { + return nil, nil, err + } + + node = nextNode + remainingPath = p + } + return node, remainingPath, nil +} + +func checkNodeHash(node *EncodedTrieNode, hash []byte) error { + nodeHash := node.NodeHash() + if !bytes.Equal(nodeHash[:], hash[:]) { + return fmt.Errorf("node hash is not equal, expect: %v, actual: %v", hash, nodeHash) + } + return nil } diff --git a/portalnetwork/state/network_test.go b/portalnetwork/state/network_test.go new file mode 100644 index 0000000000..3ec2e54fda --- /dev/null +++ b/portalnetwork/state/network_test.go @@ -0,0 +1,72 @@ +package state + +import ( + "fmt" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/portalnetwork/history" + "github.com/ethereum/go-ethereum/rpc" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v2" +) + +type TestCase struct { + BlockHeader string `yaml:"block_header"` + ContentKey string `yaml:"content_key"` + ContentValueOffer string `yaml:"content_value_offer"` + ContentValueRetrieval string `yaml:"content_value_retrieval"` +} + +func getTestCases(filename string) ([]TestCase, error) { + file, err := os.ReadFile(fmt.Sprintf("./testdata/%s", filename)) + if err != nil { + return nil, err + } + res := make([]TestCase, 0) + err = yaml.Unmarshal(file, &res) + if err != nil { + return nil, err + } + return res, nil +} + +type MockAPI struct { + header string +} + +func (p *MockAPI) HistoryRecursiveFindContent(contentKeyHex string) (*discover.ContentInfo, error) { + headerWithProof := &history.BlockHeaderWithProof{ + Header: hexutil.MustDecode(p.header), + Proof: &history.BlockHeaderProof{ + Selector: 0, + Proof: [][]byte{}, + }, + } + data, err := headerWithProof.MarshalSSZ() + if err != nil { + return nil, err + } + return &discover.ContentInfo{ + Content: hexutil.Encode(data), + UtpTransfer: false, + }, nil +} + +func TestValidateAccountTrieNode(t *testing.T) { + cases, err := getTestCases("account_trie_node.yaml") + require.NoError(t, err) + + for _, tt := range cases { + server := rpc.NewServer() + api := &MockAPI{ + header: tt.BlockHeader, + } + server.RegisterName("portal", api) + bn := NewStateNetwork(nil, server) + err = bn.validateContent(hexutil.MustDecode(tt.ContentKey), hexutil.MustDecode(tt.ContentValueOffer)) + require.NoError(t, err) + } +} diff --git a/portalnetwork/state/testdata/account_trie_node.yaml b/portalnetwork/state/testdata/account_trie_node.yaml new file mode 100644 index 0000000000..ca22f426ed --- /dev/null +++ b/portalnetwork/state/testdata/account_trie_node.yaml @@ -0,0 +1,43 @@ +# Test data for the Account Trie Node +# Each data is extracted from the mainnet, described with a comment before the data itself + +# Block 19,000,000 +# Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 (WETH) +# Leaf node (account state) +- block_header: '0xf90232a0759e27a5069535949f0a7247ebc999367dbd77964d77ed004ffc8db3d4940248a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a01ad7b80af0c28bc1489513346d2706885be90abb07f23ca28e50482adb392d61a0410d8efe973613f9463bb25a0c71ccb52b264842f4874510d70dd748fbbeb0b6a044dbbbb92e053ec5030657cf7e854062602a7dbad7890fb43c01009d1d39faf5b9010081a101008600144d8040180c8c2840027104a0d80031c6f9028b61055022063e4556d43e84a0087802a00608378509003a83ca9cfd1420245eed68d217280b016086100945109e1bbc614b28a248a1a2d881e19700c408aa02803d30c92d02c07c811d100200ab4f05e9502102240842a0890868a80084cbc96009d3040c4d09221d83da8911054c305c62422a0cd128b75240834312c6dea00110c04a18b034062068801bc02880899010c00a535d98753580c830ae81003d8529741108825b525030de0a082448090a8846480f991013e1820a448024551559205e44b5a0020050a9014a14d0a0004c20780aa08c31745eb688421c50540418c04361424c4d80840121eac08401c9c3808392afc98465a2e1c38f6265617665726275696c642e6f7267a0b45e3fdbc1a41216ad07ac931215c5d6df190217efade280d1825c4a667ad2038800000000000000008504abff88bca05ef785b1e235d0641dded9d2c3fd5c501002d353101ed0f53434881d5ca49286' + content_key: '0x20240000006225fcc63b22b80301d9f2582014e450e91f9b329b7cc87ad16894722fff5296008679e8ed' + content_value_offer: '0x24000000cf384012b91b081230cdf17a3f7dd370d8e67056058af6b272b3d54aa2714fac24000000380200004c0400006006000074080000880a00009c0c00008f0d0000e20d0000f90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780f90211a0be51f8518274d3e1beeaaa8cebe00428d5fd388e5a2a50404a4278e4dbb822b8a0c89fe8e16d89a82d5dcde02ef4a861c49549f23caa89c6772cd3e046924170a2a09d3e56c85bde8ff3e48f1029a3ed19f6cc1657ea7148396264117128916bf192a0dfe966436ccd76314d1ff27c3f314ba4bd67cdbb84bf6e7aa838407acd31f8c2a02a4659357dbb06d71dc46b900459e5bff6f3e49e4ef001cf4c8a2c62a7a227f9a02db2fff7623b55bef3e3e97d4596d35bf648209ed27a1dfa4574a950e76e9866a0e9b7cec39e827b538d84d697c774c2415d4c779b4633e3512b1b3b037e5be466a024a73f497d6080270bd263da5eb8c65a8495202d23880bb332a5fc7c4b18c4a8a08461ab3f12ab5d327b9496351467b25b27fab2e83c0c05618eb1fc20611f1958a022c7ff9562e90fee635a098995fb60330f313c683bf387b16e36f3ed01df69cca068c8d94e7b4b8a512cc108fd5fc723c53524f18d15c5aa354a5ed4076d5818a6a0d8162bc7fbbc17e616c126ba764cc4117ff3ec948a3bd588ea3287f8b901c4a7a0292d04df2f33b68e0033209c36035212c23581c8be47c5e0ea67e18fe8521f58a0e7ae2ece7c4c44a19a4d576904e39574030d6f739b450e75f36c59c83ae91829a0d577206430b32c22323816ba5309a85e5f71954e2bf5c755f5e33ee00f0de899a0f1f58b86f4addc6c095586a5333d6816b9b8a6d97b486798442863ea9615ae1380f90211a0256e27eecd0670e56ade58d99348a11f6fa4985d1f7b23143c61ee0a04a5a053a050b3d0ae7fdcad74ee9e322bb5b5fedb329db8b5bb95b281ee6d5b090314520ea07800c5365602d0c6eed658ee1056a0a2576809372757b1a42bafcc98438aebdba09bb7c947da462574a0fc0ae5608c25ac3272bb8fe3f2e619b20a10ced54738cfa0f73e7c44ce8ab0bc3495eba1aa7e2a0db44505d690e9d2daf4fab856cff999e2a022820f57846aa9ca4d0ebab020327b14178da53c2e006aaf5a22cc6648bc055ca0989235e562ad6e89656e7b8ccb301c300138d1eceddc2cfb724799a13f089783a0aa9b63d694d348219c0fb7f77b45e0e6835c99cda60a8f2030f0f712716b3751a0a34922189d09d23f5e0c8ff2f0b2407ff98a308cb3e8a9239cd4c776cee1e23ea06af9c10b566519fbbeb36dd1b3458b23fd25aeef27275a88df2d7662c2084ca9a05ce8b9e271738c6c52b1078ec04566681c8f11f679eeb2e83197431798cae230a05bfd293e2680e5c45fba826bb768e4d2cad9ab1451a712e98b0cdfba4d31b3f7a0f3ca96a33140e3e0e6ed23e857b6e5c5c7bdb77d7ef520aa4e10213d525bae84a003de0c0d867465dbb29e938fe08f3a508b26abacf7fdf8e02ffb485229195f14a0141a995d94148f08196179583fc853e65f18c338b1afe93b948701b795720960a01a35da701f908a90c16c4cc97de451ac2c35d52b019a58a078e61afe0b9a1cd480f90211a019c38310558d06bcbb4da68f64e61f2e6ee0f9bf3f6d643099e2e5c537294f6ba03a2ea461fdc547b6f72bc5d0b6f0a350aea0cb4b8ce1b036d123a5a00ec58b4aa07804bb6a71cf8c1153df5aa4ef84a409f26dd96c376e793da8cf9bcc802b4c26a076b61be012d6c7494b54c77a2dc6fcfe5568eef756d7a9b827c71ff25849dd87a0c8e8448bf1fbb0511823f5a92ff0febd7cad713967b5bbd0a4603d4ef2b9ef01a04c6d270a17b8fc136e0741940349c43d1e4ca894f191eefa13851da489de99d5a01076e9645c48dfed84933a8fae6016be4d47946f8105ccbc892ab0ae6ccf837aa0c6fea6b5dd5a7bae7e3c2ffae6841b292b613bf4c7421bdb90226f53e9eebc51a073b6c1de7658ec6f66fd52f1d66ac278ed0f3db37201981a9ca4b64a951fc52ba00bc5ecf44d423b4b6e0030d057939b739b85981c2bf2b4ad4f968bebd83cba7da0ed7e7a51c44fc09f230853a018c49eb711fbfa439904fd5ceb99c00b166f3ac7a005bf4f540bbc5bd6731dd89f4ff0a28c8ad8ee39d9611ef4bda0e2016bbd644ea0a1e0d3c4b952dce2233de45cca6e6c771e3f552ff6ff0194ff3d1b44d620683ea081e8d789f13dac46de04320c3a9c7d3e488ec667a619c21a020f95a41093e338a0dc9b8851a29da9247a4423fdcc689ae44c7843d31a891a067509780a2664c0a6a064f75b0a17b502154c6d316e7244bfde51a39b211484d311be73b80fbb93fd9c80f90211a09c0680faf2d7a9a79b5eedf6a8f846b95431cf91391973f6d1a6ec66dc7c3c24a02fd29886972cc78eab95ef19fd5cdd434e8d60c79b7d7aaff5b183469b848892a0cd246c92230812e63f13e8fddf2d0a0a976fde22e78256f9f3c7fd8219c71494a0f1d0b771957fe8d4c908d4ca730deca96c4ead47a9cde9648dd371da93bedbfca0de3910f22bd6ac087a1f778dfb20c7df43f7b3177e1abfe89d76d094dbd5753ba034b9341a9dad17687f5c22155e87ddbfea86dc0374e2071c6fac2a34fed5d7eea015eb41b2ece7cffbeaa040429aea2c73cf1c97a79282522f9eb25fcad1379b03a032214af47db0deb697b79ab12adc1b92cbace8395c8772544e803f33496c8073a01ac13a790f63114ce9bde82925bb5be8f4a09ee8ecf086d7675517248f8b8d4da04fe95c1a0f329cbf6b40efb608497e1d35f86919270a1c3b0a5b8f5c4675fbd6a0649e3ea0c951c4a16658f463755df800dd83f331f25a37275476877ce2eed44ea0157f094338c21f03a13a16793af96cc11a8f8a4a23b1f6105816833f603eabd0a086913ed8ad6c2c5d3d1e37b18bf7522aa080c04f3acd32a521efc7297653b658a0ed086a76c87f4654a164d1c4ec2626743cfa89bc1c4af41eba7369b42708c690a0c6730ce5e1df17601ac55b243bcba90a9f49dc835044bda9e2d7a76885b36598a0368943b40d006cdd58e0f576314c626fae7bc832d9451c5758a15c03e0bd08f680f90211a0515cb567f896e05d10003f6fff6b848448ecdfa82d6f854a8bf0058a57f53563a03661a6bd0c24511a05b40f8ae74c737f47d0df70bbf3c7a0816810ed90a84426a0c4d94bcf7df0b9c6707deb12770d992c1e60724ec2f40633a02ef1c4375326bba06af61ac19cd4496fb6d376dc38a8165a2561022866ce6fef41f8ade0fd2a407ba003a8b55e6cf12c06d0962f587bc293bca33303b7cc747f4ffbd17332cdbb33dda04f96708c335dd6364f8c5b4fc62edf32f5fd9a7107a99be1e9f6914b4093b88ca0e3981f17dbc1a00258432c0e34232f267d05e271590ee7a9783a51870f9873c8a03f2b45b47cdc12f020c55f6da3f7a348ec409de53a618b9cda4523c97d754b82a0935bc9189b81bb782d6b4d1451ab3d165b94a6fc4de4ab275528c06d9a128729a0c07c4048481c07b118748b2a30e851cf5c6c87af6212257f8845eb9ce07a02e4a0012fab999f402d6b302a07d3f7973ee8c357d5db8c7991903bd54d54d507cc23a05923155adc8cd3aceaf27c07858d290a3b85fc378fdd98e9f4f7f70d157f28baa0c55b2981a6fe08260cb6a076c76858d56aafdf255d0a12a2c50abe35d468c7e7a0e85b45f9a72f3abf2758687f2bdc33deab733aa4ef769bd5648f6a55ae1fb123a06ef38fec665b8eb25934622af1112b9a9d52408c94d2c0124d6e24b7ff4296c0a0867f6119f66c88787520dc8899d07d0e49598fa8dde1f33e611871eff6cd049680f8f1a0ca06c2b4c97d9941e56c3c752abe4c2b0b2cd162e22a5d25f61774dc453deedfa0344f34e01710ba897da06172844f373b281598b859086cf00c546594b955b87080a09bc4a42b6376f15f2639c98ad195b6fb948459cca93c568eacb33574b826a7af80a0525e7dd1bf391cf7df9ffaaa07093363a2c7a1c7d467d01403e368bd8c1f4e56808080808080a0758bf45f49922e3f1273d3e589753038a18ce3bbd961e3493f276eb7c5d04a3fa0235db60b9fecfc721d53cb6624da22433e765569a8312e86a6f0b47faf4a2a23a02f35f91fe878f56f1dd0b738bd12d9c8ed0f9b0f6be4146b66ae2c5625cc156b8080f85180a07f152c1e0fbe4b406b9a774b132347f174f02f3c2d6d1d4ad005c979996754b28080808080808080808080a06225fcc63b22b80301d9f2582014e450e91f9b329b7cc87ad16894722fff5296808080f8719d20a65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002b851f84f018b02b4f32ee2f03d31ee3fbba046d5eb15d44b160805e80d05e2a47d434053e6c4b3ef9d1111773039e9586661a0d0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23' + content_value_retrieval: '0x04000000f8719d20a65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002b851f84f018b02b4f32ee2f03d31ee3fbba046d5eb15d44b160805e80d05e2a47d434053e6c4b3ef9d1111773039e9586661a0d0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23' + +# Block 19,000,000 +# Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 (WETH) +# Branch node, corresponding to the path: 8679e8e (parent of the leaf node) +- block_header: '0xf90232a0759e27a5069535949f0a7247ebc999367dbd77964d77ed004ffc8db3d4940248a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a01ad7b80af0c28bc1489513346d2706885be90abb07f23ca28e50482adb392d61a0410d8efe973613f9463bb25a0c71ccb52b264842f4874510d70dd748fbbeb0b6a044dbbbb92e053ec5030657cf7e854062602a7dbad7890fb43c01009d1d39faf5b9010081a101008600144d8040180c8c2840027104a0d80031c6f9028b61055022063e4556d43e84a0087802a00608378509003a83ca9cfd1420245eed68d217280b016086100945109e1bbc614b28a248a1a2d881e19700c408aa02803d30c92d02c07c811d100200ab4f05e9502102240842a0890868a80084cbc96009d3040c4d09221d83da8911054c305c62422a0cd128b75240834312c6dea00110c04a18b034062068801bc02880899010c00a535d98753580c830ae81003d8529741108825b525030de0a082448090a8846480f991013e1820a448024551559205e44b5a0020050a9014a14d0a0004c20780aa08c31745eb688421c50540418c04361424c4d80840121eac08401c9c3808392afc98465a2e1c38f6265617665726275696c642e6f7267a0b45e3fdbc1a41216ad07ac931215c5d6df190217efade280d1825c4a667ad2038800000000000000008504abff88bca05ef785b1e235d0641dded9d2c3fd5c501002d353101ed0f53434881d5ca49286' + content_key: '0x20240000002f35f91fe878f56f1dd0b738bd12d9c8ed0f9b0f6be4146b66ae2c5625cc156b18679e8e' + content_value_offer: '0x24000000cf384012b91b081230cdf17a3f7dd370d8e67056058af6b272b3d54aa2714fac2000000034020000480400005c06000070080000840a0000980c00008b0d0000f90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780f90211a0be51f8518274d3e1beeaaa8cebe00428d5fd388e5a2a50404a4278e4dbb822b8a0c89fe8e16d89a82d5dcde02ef4a861c49549f23caa89c6772cd3e046924170a2a09d3e56c85bde8ff3e48f1029a3ed19f6cc1657ea7148396264117128916bf192a0dfe966436ccd76314d1ff27c3f314ba4bd67cdbb84bf6e7aa838407acd31f8c2a02a4659357dbb06d71dc46b900459e5bff6f3e49e4ef001cf4c8a2c62a7a227f9a02db2fff7623b55bef3e3e97d4596d35bf648209ed27a1dfa4574a950e76e9866a0e9b7cec39e827b538d84d697c774c2415d4c779b4633e3512b1b3b037e5be466a024a73f497d6080270bd263da5eb8c65a8495202d23880bb332a5fc7c4b18c4a8a08461ab3f12ab5d327b9496351467b25b27fab2e83c0c05618eb1fc20611f1958a022c7ff9562e90fee635a098995fb60330f313c683bf387b16e36f3ed01df69cca068c8d94e7b4b8a512cc108fd5fc723c53524f18d15c5aa354a5ed4076d5818a6a0d8162bc7fbbc17e616c126ba764cc4117ff3ec948a3bd588ea3287f8b901c4a7a0292d04df2f33b68e0033209c36035212c23581c8be47c5e0ea67e18fe8521f58a0e7ae2ece7c4c44a19a4d576904e39574030d6f739b450e75f36c59c83ae91829a0d577206430b32c22323816ba5309a85e5f71954e2bf5c755f5e33ee00f0de899a0f1f58b86f4addc6c095586a5333d6816b9b8a6d97b486798442863ea9615ae1380f90211a0256e27eecd0670e56ade58d99348a11f6fa4985d1f7b23143c61ee0a04a5a053a050b3d0ae7fdcad74ee9e322bb5b5fedb329db8b5bb95b281ee6d5b090314520ea07800c5365602d0c6eed658ee1056a0a2576809372757b1a42bafcc98438aebdba09bb7c947da462574a0fc0ae5608c25ac3272bb8fe3f2e619b20a10ced54738cfa0f73e7c44ce8ab0bc3495eba1aa7e2a0db44505d690e9d2daf4fab856cff999e2a022820f57846aa9ca4d0ebab020327b14178da53c2e006aaf5a22cc6648bc055ca0989235e562ad6e89656e7b8ccb301c300138d1eceddc2cfb724799a13f089783a0aa9b63d694d348219c0fb7f77b45e0e6835c99cda60a8f2030f0f712716b3751a0a34922189d09d23f5e0c8ff2f0b2407ff98a308cb3e8a9239cd4c776cee1e23ea06af9c10b566519fbbeb36dd1b3458b23fd25aeef27275a88df2d7662c2084ca9a05ce8b9e271738c6c52b1078ec04566681c8f11f679eeb2e83197431798cae230a05bfd293e2680e5c45fba826bb768e4d2cad9ab1451a712e98b0cdfba4d31b3f7a0f3ca96a33140e3e0e6ed23e857b6e5c5c7bdb77d7ef520aa4e10213d525bae84a003de0c0d867465dbb29e938fe08f3a508b26abacf7fdf8e02ffb485229195f14a0141a995d94148f08196179583fc853e65f18c338b1afe93b948701b795720960a01a35da701f908a90c16c4cc97de451ac2c35d52b019a58a078e61afe0b9a1cd480f90211a019c38310558d06bcbb4da68f64e61f2e6ee0f9bf3f6d643099e2e5c537294f6ba03a2ea461fdc547b6f72bc5d0b6f0a350aea0cb4b8ce1b036d123a5a00ec58b4aa07804bb6a71cf8c1153df5aa4ef84a409f26dd96c376e793da8cf9bcc802b4c26a076b61be012d6c7494b54c77a2dc6fcfe5568eef756d7a9b827c71ff25849dd87a0c8e8448bf1fbb0511823f5a92ff0febd7cad713967b5bbd0a4603d4ef2b9ef01a04c6d270a17b8fc136e0741940349c43d1e4ca894f191eefa13851da489de99d5a01076e9645c48dfed84933a8fae6016be4d47946f8105ccbc892ab0ae6ccf837aa0c6fea6b5dd5a7bae7e3c2ffae6841b292b613bf4c7421bdb90226f53e9eebc51a073b6c1de7658ec6f66fd52f1d66ac278ed0f3db37201981a9ca4b64a951fc52ba00bc5ecf44d423b4b6e0030d057939b739b85981c2bf2b4ad4f968bebd83cba7da0ed7e7a51c44fc09f230853a018c49eb711fbfa439904fd5ceb99c00b166f3ac7a005bf4f540bbc5bd6731dd89f4ff0a28c8ad8ee39d9611ef4bda0e2016bbd644ea0a1e0d3c4b952dce2233de45cca6e6c771e3f552ff6ff0194ff3d1b44d620683ea081e8d789f13dac46de04320c3a9c7d3e488ec667a619c21a020f95a41093e338a0dc9b8851a29da9247a4423fdcc689ae44c7843d31a891a067509780a2664c0a6a064f75b0a17b502154c6d316e7244bfde51a39b211484d311be73b80fbb93fd9c80f90211a09c0680faf2d7a9a79b5eedf6a8f846b95431cf91391973f6d1a6ec66dc7c3c24a02fd29886972cc78eab95ef19fd5cdd434e8d60c79b7d7aaff5b183469b848892a0cd246c92230812e63f13e8fddf2d0a0a976fde22e78256f9f3c7fd8219c71494a0f1d0b771957fe8d4c908d4ca730deca96c4ead47a9cde9648dd371da93bedbfca0de3910f22bd6ac087a1f778dfb20c7df43f7b3177e1abfe89d76d094dbd5753ba034b9341a9dad17687f5c22155e87ddbfea86dc0374e2071c6fac2a34fed5d7eea015eb41b2ece7cffbeaa040429aea2c73cf1c97a79282522f9eb25fcad1379b03a032214af47db0deb697b79ab12adc1b92cbace8395c8772544e803f33496c8073a01ac13a790f63114ce9bde82925bb5be8f4a09ee8ecf086d7675517248f8b8d4da04fe95c1a0f329cbf6b40efb608497e1d35f86919270a1c3b0a5b8f5c4675fbd6a0649e3ea0c951c4a16658f463755df800dd83f331f25a37275476877ce2eed44ea0157f094338c21f03a13a16793af96cc11a8f8a4a23b1f6105816833f603eabd0a086913ed8ad6c2c5d3d1e37b18bf7522aa080c04f3acd32a521efc7297653b658a0ed086a76c87f4654a164d1c4ec2626743cfa89bc1c4af41eba7369b42708c690a0c6730ce5e1df17601ac55b243bcba90a9f49dc835044bda9e2d7a76885b36598a0368943b40d006cdd58e0f576314c626fae7bc832d9451c5758a15c03e0bd08f680f90211a0515cb567f896e05d10003f6fff6b848448ecdfa82d6f854a8bf0058a57f53563a03661a6bd0c24511a05b40f8ae74c737f47d0df70bbf3c7a0816810ed90a84426a0c4d94bcf7df0b9c6707deb12770d992c1e60724ec2f40633a02ef1c4375326bba06af61ac19cd4496fb6d376dc38a8165a2561022866ce6fef41f8ade0fd2a407ba003a8b55e6cf12c06d0962f587bc293bca33303b7cc747f4ffbd17332cdbb33dda04f96708c335dd6364f8c5b4fc62edf32f5fd9a7107a99be1e9f6914b4093b88ca0e3981f17dbc1a00258432c0e34232f267d05e271590ee7a9783a51870f9873c8a03f2b45b47cdc12f020c55f6da3f7a348ec409de53a618b9cda4523c97d754b82a0935bc9189b81bb782d6b4d1451ab3d165b94a6fc4de4ab275528c06d9a128729a0c07c4048481c07b118748b2a30e851cf5c6c87af6212257f8845eb9ce07a02e4a0012fab999f402d6b302a07d3f7973ee8c357d5db8c7991903bd54d54d507cc23a05923155adc8cd3aceaf27c07858d290a3b85fc378fdd98e9f4f7f70d157f28baa0c55b2981a6fe08260cb6a076c76858d56aafdf255d0a12a2c50abe35d468c7e7a0e85b45f9a72f3abf2758687f2bdc33deab733aa4ef769bd5648f6a55ae1fb123a06ef38fec665b8eb25934622af1112b9a9d52408c94d2c0124d6e24b7ff4296c0a0867f6119f66c88787520dc8899d07d0e49598fa8dde1f33e611871eff6cd049680f8f1a0ca06c2b4c97d9941e56c3c752abe4c2b0b2cd162e22a5d25f61774dc453deedfa0344f34e01710ba897da06172844f373b281598b859086cf00c546594b955b87080a09bc4a42b6376f15f2639c98ad195b6fb948459cca93c568eacb33574b826a7af80a0525e7dd1bf391cf7df9ffaaa07093363a2c7a1c7d467d01403e368bd8c1f4e56808080808080a0758bf45f49922e3f1273d3e589753038a18ce3bbd961e3493f276eb7c5d04a3fa0235db60b9fecfc721d53cb6624da22433e765569a8312e86a6f0b47faf4a2a23a02f35f91fe878f56f1dd0b738bd12d9c8ed0f9b0f6be4146b66ae2c5625cc156b8080f85180a07f152c1e0fbe4b406b9a774b132347f174f02f3c2d6d1d4ad005c979996754b28080808080808080808080a06225fcc63b22b80301d9f2582014e450e91f9b329b7cc87ad16894722fff5296808080' + content_value_retrieval: '0x04000000f85180a07f152c1e0fbe4b406b9a774b132347f174f02f3c2d6d1d4ad005c979996754b28080808080808080808080a06225fcc63b22b80301d9f2582014e450e91f9b329b7cc87ad16894722fff5296808080' + +# Block 19,000,000 +# Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 (WETH) +# Root node (account state) +- block_header: '0xf90232a0759e27a5069535949f0a7247ebc999367dbd77964d77ed004ffc8db3d4940248a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a01ad7b80af0c28bc1489513346d2706885be90abb07f23ca28e50482adb392d61a0410d8efe973613f9463bb25a0c71ccb52b264842f4874510d70dd748fbbeb0b6a044dbbbb92e053ec5030657cf7e854062602a7dbad7890fb43c01009d1d39faf5b9010081a101008600144d8040180c8c2840027104a0d80031c6f9028b61055022063e4556d43e84a0087802a00608378509003a83ca9cfd1420245eed68d217280b016086100945109e1bbc614b28a248a1a2d881e19700c408aa02803d30c92d02c07c811d100200ab4f05e9502102240842a0890868a80084cbc96009d3040c4d09221d83da8911054c305c62422a0cd128b75240834312c6dea00110c04a18b034062068801bc02880899010c00a535d98753580c830ae81003d8529741108825b525030de0a082448090a8846480f991013e1820a448024551559205e44b5a0020050a9014a14d0a0004c20780aa08c31745eb688421c50540418c04361424c4d80840121eac08401c9c3808392afc98465a2e1c38f6265617665726275696c642e6f7267a0b45e3fdbc1a41216ad07ac931215c5d6df190217efade280d1825c4a667ad2038800000000000000008504abff88bca05ef785b1e235d0641dded9d2c3fd5c501002d353101ed0f53434881d5ca49286' + content_key: '0x20240000001ad7b80af0c28bc1489513346d2706885be90abb07f23ca28e50482adb392d6100' + content_value_offer: '0x24000000cf384012b91b081230cdf17a3f7dd370d8e67056058af6b272b3d54aa2714fac04000000f90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780' + content_value_retrieval: '0x04000000f90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780' + +# Has an extension node in the proof +# Block 0 +# Address: 0x1584a2c066b7a455dbd6ae2807a7334e83c35fa5 +# Leaf node (account state) +- block_header: '0xf90214a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0d7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850400000000808213888080a011bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82faa00000000000000000000000000000000000000000000000000000000000000000880000000000000042' + content_key: '0x20240000000cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b66911a97fd' + content_value_offer: '0x24000000d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3180000002c0200004004000014060000370600008a060000f90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80f90211a068c361d52a1ae36e33155313cd4e838c539d946d85925e5867b747e66995279ea04bfcad7bfdf0fb113e6bf0ebe4d55543688888bd6ad277de20aa0f8a85808808a086816b98cc35e76d6e811646f6c37a73d148a23420bcc03493090639bb8393eca0af4b0b8fcf790b63a8bbc3711f091758d3e4dd424cdc4ded526015c42ca50dcaa0158ecf58c068c4d0452dba821665bbdc6c9c57d6016e53abc18832e9ccfc0b86a016a6ebfa551718656d0b514f948a859964f83d3717e0f055f996772d2f228c2da0a9fd3ba226e84a434bc8d5b974b5131faccdefa6a58a02ddff829fa3d4bb27d5a0cf039eb80d70511d207a7e25160061689d9267630b66d2aaedac436872ae415ba0f24a488dd566079b384e558779c105af0d8f8c8ed564aeab9c7564f393bea56ea05132b24ec0dcf33ec24cb4678aa90b2622141c94345a5dceff21b22284c26251a0c093497e0aeeb4bd0bc461643cf003f87dde10cc1c9925a0b23a409f2048b8e2a0c03b6353e1dcdd3707caa20cd4d6a5c3c59da9f7424bba97ba643f17d42b8b86a0177fd57a9ee5d2d47d712d2daf75f5162a33b604b72766a98daad5509f607b45a09c7945f1f9517363d0cc19dde9ad91222f9d3c0162061182eb114e39a9f605c7a0a8440ef6e36d273b58c65344edab0583a03f09912d22e723dae51cc1d716d786a01df56337e1161f3fe7318ad10bd8e5c42f741c0652bd70d1292c7d0f2f7b88cb80f901d1a01a42abb27509a631169ab7e765e13dec0de47dac9cc7bba9cbc03d9086a0db71a0a0978af82352385b3ed1d0cd6c37a5b2613a989ea01df570edb06df32fdefaff80a0d1cf5bc45e21fa3960d172fe189be5978adab50ca77d11d1c2953eebbbd2d312a005b8054e0db723ad20cc31b1be4d987ae6c6c37c334207120b1f67506f84ad43a0430e5e56596211fcf7b7875da97ac1b1f6ba13189dce330bcaebb9e6d5569f01a003353e7e139443c7b994c347eb7636dcae5b3eac6ba09b3bbb8c588c2e41a958a0cf966488cfb696ed5ac8f67923e4c0912eef7656df7f7586ba2b7ad7072b34b6a0652fb2d2acc28fc9360ac63f29d7886abf602ccbc0cf865061b653415256f357a062d4f171bb087621727a87a01a29d4c8b20864fcb45eb6d60eb929af76aa3485a0dbf844359c229020360ae86751fed8ea41d985ee245da8a27893cc5e1cf55d6fa03ada43c4de6154b5f5567fc27f3a659c3028b321a8040c8713d8b347d7634d3080a0728693f4b5a3f28187456de3217e2985662d52979bfae5a49da65153c50ada8da03c0a8e099ac8060b14d7946c6abc5a0a428defe61781e2cb0736a20ad086e442a07ca441b942818197c8fa360f6d32113277c734eedac7a4539f62e5a27ce404e880e21fa00ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff0f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080f8709e3025e6e5c53e4ab7780669d1cc96b5de195b294346f3a2403969f3042f2cb84ff84d8089070c1cc73b00c80000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' + content_value_retrieval: '0x04000000f8709e3025e6e5c53e4ab7780669d1cc96b5de195b294346f3a2403969f3042f2cb84ff84d8089070c1cc73b00c80000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' + +# Block 0 +# Address: 0x1584a2c066b7a455dbd6ae2807a7334e83c35fa5 (WETH) +# Branch node, corresponding to the path: a97f (parent of the leaf node) +- block_header: '0xf90214a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0d7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850400000000808213888080a011bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82faa00000000000000000000000000000000000000000000000000000000000000000880000000000000042' + content_key: '0x20240000000ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff000a97f' + content_value_offer: '0x24000000d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa314000000280200003c0400001006000033060000f90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80f90211a068c361d52a1ae36e33155313cd4e838c539d946d85925e5867b747e66995279ea04bfcad7bfdf0fb113e6bf0ebe4d55543688888bd6ad277de20aa0f8a85808808a086816b98cc35e76d6e811646f6c37a73d148a23420bcc03493090639bb8393eca0af4b0b8fcf790b63a8bbc3711f091758d3e4dd424cdc4ded526015c42ca50dcaa0158ecf58c068c4d0452dba821665bbdc6c9c57d6016e53abc18832e9ccfc0b86a016a6ebfa551718656d0b514f948a859964f83d3717e0f055f996772d2f228c2da0a9fd3ba226e84a434bc8d5b974b5131faccdefa6a58a02ddff829fa3d4bb27d5a0cf039eb80d70511d207a7e25160061689d9267630b66d2aaedac436872ae415ba0f24a488dd566079b384e558779c105af0d8f8c8ed564aeab9c7564f393bea56ea05132b24ec0dcf33ec24cb4678aa90b2622141c94345a5dceff21b22284c26251a0c093497e0aeeb4bd0bc461643cf003f87dde10cc1c9925a0b23a409f2048b8e2a0c03b6353e1dcdd3707caa20cd4d6a5c3c59da9f7424bba97ba643f17d42b8b86a0177fd57a9ee5d2d47d712d2daf75f5162a33b604b72766a98daad5509f607b45a09c7945f1f9517363d0cc19dde9ad91222f9d3c0162061182eb114e39a9f605c7a0a8440ef6e36d273b58c65344edab0583a03f09912d22e723dae51cc1d716d786a01df56337e1161f3fe7318ad10bd8e5c42f741c0652bd70d1292c7d0f2f7b88cb80f901d1a01a42abb27509a631169ab7e765e13dec0de47dac9cc7bba9cbc03d9086a0db71a0a0978af82352385b3ed1d0cd6c37a5b2613a989ea01df570edb06df32fdefaff80a0d1cf5bc45e21fa3960d172fe189be5978adab50ca77d11d1c2953eebbbd2d312a005b8054e0db723ad20cc31b1be4d987ae6c6c37c334207120b1f67506f84ad43a0430e5e56596211fcf7b7875da97ac1b1f6ba13189dce330bcaebb9e6d5569f01a003353e7e139443c7b994c347eb7636dcae5b3eac6ba09b3bbb8c588c2e41a958a0cf966488cfb696ed5ac8f67923e4c0912eef7656df7f7586ba2b7ad7072b34b6a0652fb2d2acc28fc9360ac63f29d7886abf602ccbc0cf865061b653415256f357a062d4f171bb087621727a87a01a29d4c8b20864fcb45eb6d60eb929af76aa3485a0dbf844359c229020360ae86751fed8ea41d985ee245da8a27893cc5e1cf55d6fa03ada43c4de6154b5f5567fc27f3a659c3028b321a8040c8713d8b347d7634d3080a0728693f4b5a3f28187456de3217e2985662d52979bfae5a49da65153c50ada8da03c0a8e099ac8060b14d7946c6abc5a0a428defe61781e2cb0736a20ad086e442a07ca441b942818197c8fa360f6d32113277c734eedac7a4539f62e5a27ce404e880e21fa00ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff0f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080' + content_value_retrieval: '0x04000000f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080' diff --git a/portalnetwork/state/testdata/contract_bytecode.yaml b/portalnetwork/state/testdata/contract_bytecode.yaml new file mode 100644 index 0000000000..ff6d26f1de --- /dev/null +++ b/portalnetwork/state/testdata/contract_bytecode.yaml @@ -0,0 +1,9 @@ +# Test data for the Contract Bytecode +# Each data is extracted from the mainnet, described with a comment before the data itself + +# Block 19,000,000 +# Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 (WETH) +- block_header: '0xf90232a0759e27a5069535949f0a7247ebc999367dbd77964d77ed004ffc8db3d4940248a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a01ad7b80af0c28bc1489513346d2706885be90abb07f23ca28e50482adb392d61a0410d8efe973613f9463bb25a0c71ccb52b264842f4874510d70dd748fbbeb0b6a044dbbbb92e053ec5030657cf7e854062602a7dbad7890fb43c01009d1d39faf5b9010081a101008600144d8040180c8c2840027104a0d80031c6f9028b61055022063e4556d43e84a0087802a00608378509003a83ca9cfd1420245eed68d217280b016086100945109e1bbc614b28a248a1a2d881e19700c408aa02803d30c92d02c07c811d100200ab4f05e9502102240842a0890868a80084cbc96009d3040c4d09221d83da8911054c305c62422a0cd128b75240834312c6dea00110c04a18b034062068801bc02880899010c00a535d98753580c830ae81003d8529741108825b525030de0a082448090a8846480f991013e1820a448024551559205e44b5a0020050a9014a14d0a0004c20780aa08c31745eb688421c50540418c04361424c4d80840121eac08401c9c3808392afc98465a2e1c38f6265617665726275696c642e6f7267a0b45e3fdbc1a41216ad07ac931215c5d6df190217efade280d1825c4a667ad2038800000000000000008504abff88bca05ef785b1e235d0641dded9d2c3fd5c501002d353101ed0f53434881d5ca49286' + content_key: '0x228679e8eda65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002d0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23' + content_value_offer: '0x280000005c0c0000cf384012b91b081230cdf17a3f7dd370d8e67056058af6b272b3d54aa2714fac6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a002924000000380200004c0400006006000074080000880a00009c0c00008f0d0000e20d0000f90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780f90211a0be51f8518274d3e1beeaaa8cebe00428d5fd388e5a2a50404a4278e4dbb822b8a0c89fe8e16d89a82d5dcde02ef4a861c49549f23caa89c6772cd3e046924170a2a09d3e56c85bde8ff3e48f1029a3ed19f6cc1657ea7148396264117128916bf192a0dfe966436ccd76314d1ff27c3f314ba4bd67cdbb84bf6e7aa838407acd31f8c2a02a4659357dbb06d71dc46b900459e5bff6f3e49e4ef001cf4c8a2c62a7a227f9a02db2fff7623b55bef3e3e97d4596d35bf648209ed27a1dfa4574a950e76e9866a0e9b7cec39e827b538d84d697c774c2415d4c779b4633e3512b1b3b037e5be466a024a73f497d6080270bd263da5eb8c65a8495202d23880bb332a5fc7c4b18c4a8a08461ab3f12ab5d327b9496351467b25b27fab2e83c0c05618eb1fc20611f1958a022c7ff9562e90fee635a098995fb60330f313c683bf387b16e36f3ed01df69cca068c8d94e7b4b8a512cc108fd5fc723c53524f18d15c5aa354a5ed4076d5818a6a0d8162bc7fbbc17e616c126ba764cc4117ff3ec948a3bd588ea3287f8b901c4a7a0292d04df2f33b68e0033209c36035212c23581c8be47c5e0ea67e18fe8521f58a0e7ae2ece7c4c44a19a4d576904e39574030d6f739b450e75f36c59c83ae91829a0d577206430b32c22323816ba5309a85e5f71954e2bf5c755f5e33ee00f0de899a0f1f58b86f4addc6c095586a5333d6816b9b8a6d97b486798442863ea9615ae1380f90211a0256e27eecd0670e56ade58d99348a11f6fa4985d1f7b23143c61ee0a04a5a053a050b3d0ae7fdcad74ee9e322bb5b5fedb329db8b5bb95b281ee6d5b090314520ea07800c5365602d0c6eed658ee1056a0a2576809372757b1a42bafcc98438aebdba09bb7c947da462574a0fc0ae5608c25ac3272bb8fe3f2e619b20a10ced54738cfa0f73e7c44ce8ab0bc3495eba1aa7e2a0db44505d690e9d2daf4fab856cff999e2a022820f57846aa9ca4d0ebab020327b14178da53c2e006aaf5a22cc6648bc055ca0989235e562ad6e89656e7b8ccb301c300138d1eceddc2cfb724799a13f089783a0aa9b63d694d348219c0fb7f77b45e0e6835c99cda60a8f2030f0f712716b3751a0a34922189d09d23f5e0c8ff2f0b2407ff98a308cb3e8a9239cd4c776cee1e23ea06af9c10b566519fbbeb36dd1b3458b23fd25aeef27275a88df2d7662c2084ca9a05ce8b9e271738c6c52b1078ec04566681c8f11f679eeb2e83197431798cae230a05bfd293e2680e5c45fba826bb768e4d2cad9ab1451a712e98b0cdfba4d31b3f7a0f3ca96a33140e3e0e6ed23e857b6e5c5c7bdb77d7ef520aa4e10213d525bae84a003de0c0d867465dbb29e938fe08f3a508b26abacf7fdf8e02ffb485229195f14a0141a995d94148f08196179583fc853e65f18c338b1afe93b948701b795720960a01a35da701f908a90c16c4cc97de451ac2c35d52b019a58a078e61afe0b9a1cd480f90211a019c38310558d06bcbb4da68f64e61f2e6ee0f9bf3f6d643099e2e5c537294f6ba03a2ea461fdc547b6f72bc5d0b6f0a350aea0cb4b8ce1b036d123a5a00ec58b4aa07804bb6a71cf8c1153df5aa4ef84a409f26dd96c376e793da8cf9bcc802b4c26a076b61be012d6c7494b54c77a2dc6fcfe5568eef756d7a9b827c71ff25849dd87a0c8e8448bf1fbb0511823f5a92ff0febd7cad713967b5bbd0a4603d4ef2b9ef01a04c6d270a17b8fc136e0741940349c43d1e4ca894f191eefa13851da489de99d5a01076e9645c48dfed84933a8fae6016be4d47946f8105ccbc892ab0ae6ccf837aa0c6fea6b5dd5a7bae7e3c2ffae6841b292b613bf4c7421bdb90226f53e9eebc51a073b6c1de7658ec6f66fd52f1d66ac278ed0f3db37201981a9ca4b64a951fc52ba00bc5ecf44d423b4b6e0030d057939b739b85981c2bf2b4ad4f968bebd83cba7da0ed7e7a51c44fc09f230853a018c49eb711fbfa439904fd5ceb99c00b166f3ac7a005bf4f540bbc5bd6731dd89f4ff0a28c8ad8ee39d9611ef4bda0e2016bbd644ea0a1e0d3c4b952dce2233de45cca6e6c771e3f552ff6ff0194ff3d1b44d620683ea081e8d789f13dac46de04320c3a9c7d3e488ec667a619c21a020f95a41093e338a0dc9b8851a29da9247a4423fdcc689ae44c7843d31a891a067509780a2664c0a6a064f75b0a17b502154c6d316e7244bfde51a39b211484d311be73b80fbb93fd9c80f90211a09c0680faf2d7a9a79b5eedf6a8f846b95431cf91391973f6d1a6ec66dc7c3c24a02fd29886972cc78eab95ef19fd5cdd434e8d60c79b7d7aaff5b183469b848892a0cd246c92230812e63f13e8fddf2d0a0a976fde22e78256f9f3c7fd8219c71494a0f1d0b771957fe8d4c908d4ca730deca96c4ead47a9cde9648dd371da93bedbfca0de3910f22bd6ac087a1f778dfb20c7df43f7b3177e1abfe89d76d094dbd5753ba034b9341a9dad17687f5c22155e87ddbfea86dc0374e2071c6fac2a34fed5d7eea015eb41b2ece7cffbeaa040429aea2c73cf1c97a79282522f9eb25fcad1379b03a032214af47db0deb697b79ab12adc1b92cbace8395c8772544e803f33496c8073a01ac13a790f63114ce9bde82925bb5be8f4a09ee8ecf086d7675517248f8b8d4da04fe95c1a0f329cbf6b40efb608497e1d35f86919270a1c3b0a5b8f5c4675fbd6a0649e3ea0c951c4a16658f463755df800dd83f331f25a37275476877ce2eed44ea0157f094338c21f03a13a16793af96cc11a8f8a4a23b1f6105816833f603eabd0a086913ed8ad6c2c5d3d1e37b18bf7522aa080c04f3acd32a521efc7297653b658a0ed086a76c87f4654a164d1c4ec2626743cfa89bc1c4af41eba7369b42708c690a0c6730ce5e1df17601ac55b243bcba90a9f49dc835044bda9e2d7a76885b36598a0368943b40d006cdd58e0f576314c626fae7bc832d9451c5758a15c03e0bd08f680f90211a0515cb567f896e05d10003f6fff6b848448ecdfa82d6f854a8bf0058a57f53563a03661a6bd0c24511a05b40f8ae74c737f47d0df70bbf3c7a0816810ed90a84426a0c4d94bcf7df0b9c6707deb12770d992c1e60724ec2f40633a02ef1c4375326bba06af61ac19cd4496fb6d376dc38a8165a2561022866ce6fef41f8ade0fd2a407ba003a8b55e6cf12c06d0962f587bc293bca33303b7cc747f4ffbd17332cdbb33dda04f96708c335dd6364f8c5b4fc62edf32f5fd9a7107a99be1e9f6914b4093b88ca0e3981f17dbc1a00258432c0e34232f267d05e271590ee7a9783a51870f9873c8a03f2b45b47cdc12f020c55f6da3f7a348ec409de53a618b9cda4523c97d754b82a0935bc9189b81bb782d6b4d1451ab3d165b94a6fc4de4ab275528c06d9a128729a0c07c4048481c07b118748b2a30e851cf5c6c87af6212257f8845eb9ce07a02e4a0012fab999f402d6b302a07d3f7973ee8c357d5db8c7991903bd54d54d507cc23a05923155adc8cd3aceaf27c07858d290a3b85fc378fdd98e9f4f7f70d157f28baa0c55b2981a6fe08260cb6a076c76858d56aafdf255d0a12a2c50abe35d468c7e7a0e85b45f9a72f3abf2758687f2bdc33deab733aa4ef769bd5648f6a55ae1fb123a06ef38fec665b8eb25934622af1112b9a9d52408c94d2c0124d6e24b7ff4296c0a0867f6119f66c88787520dc8899d07d0e49598fa8dde1f33e611871eff6cd049680f8f1a0ca06c2b4c97d9941e56c3c752abe4c2b0b2cd162e22a5d25f61774dc453deedfa0344f34e01710ba897da06172844f373b281598b859086cf00c546594b955b87080a09bc4a42b6376f15f2639c98ad195b6fb948459cca93c568eacb33574b826a7af80a0525e7dd1bf391cf7df9ffaaa07093363a2c7a1c7d467d01403e368bd8c1f4e56808080808080a0758bf45f49922e3f1273d3e589753038a18ce3bbd961e3493f276eb7c5d04a3fa0235db60b9fecfc721d53cb6624da22433e765569a8312e86a6f0b47faf4a2a23a02f35f91fe878f56f1dd0b738bd12d9c8ed0f9b0f6be4146b66ae2c5625cc156b8080f85180a07f152c1e0fbe4b406b9a774b132347f174f02f3c2d6d1d4ad005c979996754b28080808080808080808080a06225fcc63b22b80301d9f2582014e450e91f9b329b7cc87ad16894722fff5296808080f8719d20a65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002b851f84f018b02b4f32ee2f03d31ee3fbba046d5eb15d44b160805e80d05e2a47d434053e6c4b3ef9d1111773039e9586661a0d0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23' + content_value_retrieval: '0x040000006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029' diff --git a/portalnetwork/state/testdata/contract_storage_trie_node.yaml b/portalnetwork/state/testdata/contract_storage_trie_node.yaml new file mode 100644 index 0000000000..b45e8f705b --- /dev/null +++ b/portalnetwork/state/testdata/contract_storage_trie_node.yaml @@ -0,0 +1,28 @@ +# Test data for the Contract Storage Trie Node +# Each data is extracted from the mainnet, described with a comment before the data itself + +# Block 19,000,000 +# Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 (WETH) +# Storage slot: 2 (corresponds to the number of decimal points, which is 18) +# Leaf node +- block_header: '0xf90232a0759e27a5069535949f0a7247ebc999367dbd77964d77ed004ffc8db3d4940248a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a01ad7b80af0c28bc1489513346d2706885be90abb07f23ca28e50482adb392d61a0410d8efe973613f9463bb25a0c71ccb52b264842f4874510d70dd748fbbeb0b6a044dbbbb92e053ec5030657cf7e854062602a7dbad7890fb43c01009d1d39faf5b9010081a101008600144d8040180c8c2840027104a0d80031c6f9028b61055022063e4556d43e84a0087802a00608378509003a83ca9cfd1420245eed68d217280b016086100945109e1bbc614b28a248a1a2d881e19700c408aa02803d30c92d02c07c811d100200ab4f05e9502102240842a0890868a80084cbc96009d3040c4d09221d83da8911054c305c62422a0cd128b75240834312c6dea00110c04a18b034062068801bc02880899010c00a535d98753580c830ae81003d8529741108825b525030de0a082448090a8846480f991013e1820a448024551559205e44b5a0020050a9014a14d0a0004c20780aa08c31745eb688421c50540418c04361424c4d80840121eac08401c9c3808392afc98465a2e1c38f6265617665726275696c642e6f7267a0b45e3fdbc1a41216ad07ac931215c5d6df190217efade280d1825c4a667ad2038800000000000000008504abff88bca05ef785b1e235d0641dded9d2c3fd5c501002d353101ed0f53434881d5ca49286' + content_key: '0x218679e8eda65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a300244000000eb43d68008d216e753fef198cf51077f5a89f406d9c244119d1643f0f2b1901100405787' + content_value_offer: '0x280000005c0b0000cf384012b91b081230cdf17a3f7dd370d8e67056058af6b272b3d54aa2714fac1c0000003002000044040000580600006c080000800a0000130b0000f90211a0a0a734698552c6653d671994515b5f957ee1181abbfcda9d6ab8d245f89d0ebaa0674f8923e71d1155c248954b0f84eec649b0ae699442e707a998ec03773216f9a0ec35530a26811392e912f5c35df2b882cefba34f3f48190b3863cb1c78112520a09e19f39e13a8ada173c1723d1412592ec04e759da3e1bbfa5b8414d403c6badba05f12db0b204db3bc2d6c7b742d42ac8aebf20625465bb70268318068c6f95dd1a05aae7a4e7f57117bee5bef3c427f08e41ee81df13feb9663877d8763d0e67b16a0d911c69d2884ea02a8234b65576b60c89df36a3e41185d52f882f4800dac0171a07aab7513e12239d8a60120d9eb4d90d8857dcc2674180e80606f023c51a4ffdda0eacf1a83f5b253084e53a96532a75ac8346f12279595cbe485e3c880ed8a3bdba0c1d8d9c079eadb177ab06642433db67924c9f3291b85bfa33313e2f434bfa87da0c3a6abc8f5f37d46fd39330822449d0f2027571d5adbf186f66a3d153baecf58a0f07c540cacacb94fad3a8f913fd5bb60b12ea0b22f98deee14fbf64a402365bba0b2da1bbd6cda80337b186e485cf03318fa9eb895e2f10510856557b5556f1d19a0f08121eddb12c6b4c1471dcc76d4476af1b2387909e8c18fc02ff205b8734d83a0f1676391668dcee8af59dca3e49bf6adf69500187898992929d971ec019ba474a0eecf014df9ccb652baff40b102dfcc57cb8ec54805f907ce8a6a7d212bb47eec80f90211a0d44f76309b04285d7d4aff58b56aa3a2ff8b95da59b9535b7c9b31c9f582bad9a0b3dcf5ba7bb211621b0819f8adf1f300937e3c43699a6323fcd73b251b929a4aa05547a48db300342cad811ff8b0fc2af4f20f014ae6b5e5b86db51b07e9a833f6a0b90cbb4c7bd0b4f6f68e097c6309df5ded9424156638499a619643dd0205aeada0acb7bbf4a7013d34a5cac2c4c0e22d64c8db501589d1d1004c03f5bada1d747da0da0071908331247c33ccd3709a7e7d552591541874af73e1258a5df028ae5e63a064e408adb681365971c9fb12f53e4a8397419012881d2fad55a3760d97c3878fa0c33d50245a2c5afaa69511527bd7c47b319680edb536c940f43713cf556adf0da06e6c3c870c3c0b1adee85c44ede8cbe765a1473a8d0066c40f5402c38b6cf50ea0e88a4156c982d96e45c5d83b9f13cb7e8cb06bb0a1394b31a9d2709340c42588a0216b6c808f330cef5c684349690e514a4acf04c38fb3cdb18fdc6deefffb0beda09f725359320ca158811eb6af4654bd2dd68129019dd41028540cd4628f4504bda00fa15a861831834dd7a667e896aa0c87c8b48935435039157d8933f4d5aac90ea08e5624252293da2a75d756f10d23f7e7384b0b3b329512ecc88303408f3462cda0956adecc13bd4e8a14c43e5afa7b676578fb2ab7966037af1a94d095c7320801a0917af97d64aea571c5b2ea43300d863aa383aeb4d5f9807fe8e71bc01af2795a80f90211a077fb8073776e6bc376dd9c71048aa8e9f2fd36255cb92dd1bc77c1c68d0d7cb9a06134d20ea572e393ae7ca9e1d7c246731de3b573d32f469de00438880a9931a7a0503a7c42261fc325d6f5f7f45226affca2afc0be1105e957da5aefde4b6d05a3a0d9a27feeda690d27bdc3db7a0c5d6ffcf7ca7a44fcc84ceddaa0a53bfb8ad673a0cad9b09825416720f05a428b207cefdc768ca77a9c4f208f44adff0366bb6145a0a08eabe201b7a04939124052e364fe89b98d3dbeda2d92ff700d2358a319f238a0f2e6bb361675c8c1bfda5397e0530df89ff33d14bed771d054c26d1193468444a04707fa3c3c461698296bcde4e498cccb93a3f525811f8656d241f4573b10e3eca04d059adbc5185f218220e58e5bf9dfbd99952064f65ef8aa67ef541e1fa5831fa0871fb653564b4165fb10ce9145429dd15aac1707f8e580c783336f77bd5c9a96a043158ed6016199c7b9957c084c0349323b90cb8123a224c68bc222545b7c8321a00567ece2acc1800ebc43372660cbc3568b263d16833d49737d340a1b36fdd4bea0536c2166f8e88ec79e4dc0d5a3f46f44c8b5c4bc652ce91208d6388e4201ffd2a09ca540765900e026e46050fa9197218bd1075d24483c816ac8f42a0f819d9bdfa0a4d3505e91bbe8a40cd09280fcc4cf64d96a6e763831dec380b3f2ba3e37a4e0a0f245af40b496ce96c29ab97b6062a126be2f91b7761139a4258746ee891eec6380f90211a07662fedac79b0c428231ba283133012b0e3b75215b24a360a6a6eba6109653f4a0bcdfb8605e99657104135a390403b8f53804b5bf2203c9c1f5b3883180ec0bc6a0bcdf0d4fbd3f6a2656336c6df2b4fbdc79ce572671fcd26c4d66e58befc2d78ba0f7a4b4fb00382806a8e6b8b2559569eb7ec70b5e1e2e1c917f1f5c4b268c1600a0e9f007c95e2858bb59db8939bdcb8fb96d5100844551777c507794ed7d522d4ca0374b2c6be44f285ae1f87904618e3777ac999619153ee5d99517fdaad2368206a0f292ee114e85842bed63ba3aea7a8f22738b05f1a418cb30146f5edf46fc7781a0acfba64d149f25bc2a8ecd263bfe93b1363bbd3c364f047e0ff8f9b8faac1e75a0a28907885b59d01e2b5158f53880df233c0684ca242d7da1127238df84dc7c68a080b19db0f0c9965719499d3b90568e879ed429b6cffbf8103c1e21e8be07e580a0625dc89d33af85c1cf901bcce2686fa07672c51627866994c89510a6a7062912a0ebc653913a4833d2a971b12ce03178f63dead0c9e640fbd122563607f00f2d91a00cded7cb7c86826a9e755e04432340a9d4d8fa3bf5597e84ea91a7e6258e8f22a08e3b2e73b1cb8cfaa702e7b0cd5ff7e80ddb33f47dd16b5c0214103cb86aa003a0ead26815cc1a11843006f8892683f8732d3a519238b3cb63d2a57893aaaa0beba05c24ed83d1b166ecd5c9c1784bf113b0a9550c8909b0619133f559b37515dfc680f90211a0c675510b69c14ea4601897a064338a6b83692a6c29e6c6ac0f226025cda017c0a048baf29b758cb2b03835b778b1a3c80ce11e171614d9af7b1165f5c47fa290c5a03506d01d719efac9cf74f211b7ac92e8aecc05a3779018bc318741b60fee075ca0218f79c956e996bdc6a69476f0d691be85d625685f4e28a10e1c1a1289211356a0889eaa3d6289449e7ee16bc9bd14798223967a3b5a77e72f01ea39ba353ef42ba00eef8e973e31f307f1e74d54e4b13d169504eda8cf88d112b9f22d45c6ef08eda0a90cbcc7c75529502492cec75875c7344a3a5cc6ab91e3678ec8fc6eae250aaaa0b0a8313cdc75f6997ffbab1a2107b5ea0666b18999e9ae6c4217751d38ab85e3a07562413c88751df2b0c6c9c0490ebe5ed8d29c77681baf0dcb01183f2622a65aa0799d16f091a5bc05cb67a3fb489348845d5f548f5666b98941ebf392b3c02acba0d4c9d6926affbfd016d9474d49712bf10b75933010da8fb502c6345de068bdb8a00e6768ad039910330294c2a39a5c66065edf58913b7c9a974a57099f91a16a3ca03753183cb71d4e2f579f627e5e627e4280762f8a8ce1c20eabd9ac6a3fa46716a0575f79b487c821de2c9b7c4e29622b43b01e50d3196f5120d9a6e8cce4af4852a0eb48cda9ec3a4bfd2b07eda786f9b252079f081c54b84dccb33c9815d7f0d777a0b1d2ca6c8051e662589abe1d8d369538347f0f279897a128029be481c216615e80f891808080808080a0e701b13b6586c51266db06e2ecf5d2feb7f18f7cc2130dc8ddf942a27e9d5aa3a0eb43d68008d216e753fef198cf51077f5a89f406d9c244119d1643f0f2b19011a07edce1a61a9ba0549ef730adf66f30a4e8eafcda332a8cc04547d554a6bc1acd808080808080a026e499fde69be18e4abaf6c0def40aad830245fd0988d03f234ae3f5ef21ce7080e09e20fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace1224000000380200004c0400006006000074080000880a00009c0c00008f0d0000e20d0000f90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780f90211a0be51f8518274d3e1beeaaa8cebe00428d5fd388e5a2a50404a4278e4dbb822b8a0c89fe8e16d89a82d5dcde02ef4a861c49549f23caa89c6772cd3e046924170a2a09d3e56c85bde8ff3e48f1029a3ed19f6cc1657ea7148396264117128916bf192a0dfe966436ccd76314d1ff27c3f314ba4bd67cdbb84bf6e7aa838407acd31f8c2a02a4659357dbb06d71dc46b900459e5bff6f3e49e4ef001cf4c8a2c62a7a227f9a02db2fff7623b55bef3e3e97d4596d35bf648209ed27a1dfa4574a950e76e9866a0e9b7cec39e827b538d84d697c774c2415d4c779b4633e3512b1b3b037e5be466a024a73f497d6080270bd263da5eb8c65a8495202d23880bb332a5fc7c4b18c4a8a08461ab3f12ab5d327b9496351467b25b27fab2e83c0c05618eb1fc20611f1958a022c7ff9562e90fee635a098995fb60330f313c683bf387b16e36f3ed01df69cca068c8d94e7b4b8a512cc108fd5fc723c53524f18d15c5aa354a5ed4076d5818a6a0d8162bc7fbbc17e616c126ba764cc4117ff3ec948a3bd588ea3287f8b901c4a7a0292d04df2f33b68e0033209c36035212c23581c8be47c5e0ea67e18fe8521f58a0e7ae2ece7c4c44a19a4d576904e39574030d6f739b450e75f36c59c83ae91829a0d577206430b32c22323816ba5309a85e5f71954e2bf5c755f5e33ee00f0de899a0f1f58b86f4addc6c095586a5333d6816b9b8a6d97b486798442863ea9615ae1380f90211a0256e27eecd0670e56ade58d99348a11f6fa4985d1f7b23143c61ee0a04a5a053a050b3d0ae7fdcad74ee9e322bb5b5fedb329db8b5bb95b281ee6d5b090314520ea07800c5365602d0c6eed658ee1056a0a2576809372757b1a42bafcc98438aebdba09bb7c947da462574a0fc0ae5608c25ac3272bb8fe3f2e619b20a10ced54738cfa0f73e7c44ce8ab0bc3495eba1aa7e2a0db44505d690e9d2daf4fab856cff999e2a022820f57846aa9ca4d0ebab020327b14178da53c2e006aaf5a22cc6648bc055ca0989235e562ad6e89656e7b8ccb301c300138d1eceddc2cfb724799a13f089783a0aa9b63d694d348219c0fb7f77b45e0e6835c99cda60a8f2030f0f712716b3751a0a34922189d09d23f5e0c8ff2f0b2407ff98a308cb3e8a9239cd4c776cee1e23ea06af9c10b566519fbbeb36dd1b3458b23fd25aeef27275a88df2d7662c2084ca9a05ce8b9e271738c6c52b1078ec04566681c8f11f679eeb2e83197431798cae230a05bfd293e2680e5c45fba826bb768e4d2cad9ab1451a712e98b0cdfba4d31b3f7a0f3ca96a33140e3e0e6ed23e857b6e5c5c7bdb77d7ef520aa4e10213d525bae84a003de0c0d867465dbb29e938fe08f3a508b26abacf7fdf8e02ffb485229195f14a0141a995d94148f08196179583fc853e65f18c338b1afe93b948701b795720960a01a35da701f908a90c16c4cc97de451ac2c35d52b019a58a078e61afe0b9a1cd480f90211a019c38310558d06bcbb4da68f64e61f2e6ee0f9bf3f6d643099e2e5c537294f6ba03a2ea461fdc547b6f72bc5d0b6f0a350aea0cb4b8ce1b036d123a5a00ec58b4aa07804bb6a71cf8c1153df5aa4ef84a409f26dd96c376e793da8cf9bcc802b4c26a076b61be012d6c7494b54c77a2dc6fcfe5568eef756d7a9b827c71ff25849dd87a0c8e8448bf1fbb0511823f5a92ff0febd7cad713967b5bbd0a4603d4ef2b9ef01a04c6d270a17b8fc136e0741940349c43d1e4ca894f191eefa13851da489de99d5a01076e9645c48dfed84933a8fae6016be4d47946f8105ccbc892ab0ae6ccf837aa0c6fea6b5dd5a7bae7e3c2ffae6841b292b613bf4c7421bdb90226f53e9eebc51a073b6c1de7658ec6f66fd52f1d66ac278ed0f3db37201981a9ca4b64a951fc52ba00bc5ecf44d423b4b6e0030d057939b739b85981c2bf2b4ad4f968bebd83cba7da0ed7e7a51c44fc09f230853a018c49eb711fbfa439904fd5ceb99c00b166f3ac7a005bf4f540bbc5bd6731dd89f4ff0a28c8ad8ee39d9611ef4bda0e2016bbd644ea0a1e0d3c4b952dce2233de45cca6e6c771e3f552ff6ff0194ff3d1b44d620683ea081e8d789f13dac46de04320c3a9c7d3e488ec667a619c21a020f95a41093e338a0dc9b8851a29da9247a4423fdcc689ae44c7843d31a891a067509780a2664c0a6a064f75b0a17b502154c6d316e7244bfde51a39b211484d311be73b80fbb93fd9c80f90211a09c0680faf2d7a9a79b5eedf6a8f846b95431cf91391973f6d1a6ec66dc7c3c24a02fd29886972cc78eab95ef19fd5cdd434e8d60c79b7d7aaff5b183469b848892a0cd246c92230812e63f13e8fddf2d0a0a976fde22e78256f9f3c7fd8219c71494a0f1d0b771957fe8d4c908d4ca730deca96c4ead47a9cde9648dd371da93bedbfca0de3910f22bd6ac087a1f778dfb20c7df43f7b3177e1abfe89d76d094dbd5753ba034b9341a9dad17687f5c22155e87ddbfea86dc0374e2071c6fac2a34fed5d7eea015eb41b2ece7cffbeaa040429aea2c73cf1c97a79282522f9eb25fcad1379b03a032214af47db0deb697b79ab12adc1b92cbace8395c8772544e803f33496c8073a01ac13a790f63114ce9bde82925bb5be8f4a09ee8ecf086d7675517248f8b8d4da04fe95c1a0f329cbf6b40efb608497e1d35f86919270a1c3b0a5b8f5c4675fbd6a0649e3ea0c951c4a16658f463755df800dd83f331f25a37275476877ce2eed44ea0157f094338c21f03a13a16793af96cc11a8f8a4a23b1f6105816833f603eabd0a086913ed8ad6c2c5d3d1e37b18bf7522aa080c04f3acd32a521efc7297653b658a0ed086a76c87f4654a164d1c4ec2626743cfa89bc1c4af41eba7369b42708c690a0c6730ce5e1df17601ac55b243bcba90a9f49dc835044bda9e2d7a76885b36598a0368943b40d006cdd58e0f576314c626fae7bc832d9451c5758a15c03e0bd08f680f90211a0515cb567f896e05d10003f6fff6b848448ecdfa82d6f854a8bf0058a57f53563a03661a6bd0c24511a05b40f8ae74c737f47d0df70bbf3c7a0816810ed90a84426a0c4d94bcf7df0b9c6707deb12770d992c1e60724ec2f40633a02ef1c4375326bba06af61ac19cd4496fb6d376dc38a8165a2561022866ce6fef41f8ade0fd2a407ba003a8b55e6cf12c06d0962f587bc293bca33303b7cc747f4ffbd17332cdbb33dda04f96708c335dd6364f8c5b4fc62edf32f5fd9a7107a99be1e9f6914b4093b88ca0e3981f17dbc1a00258432c0e34232f267d05e271590ee7a9783a51870f9873c8a03f2b45b47cdc12f020c55f6da3f7a348ec409de53a618b9cda4523c97d754b82a0935bc9189b81bb782d6b4d1451ab3d165b94a6fc4de4ab275528c06d9a128729a0c07c4048481c07b118748b2a30e851cf5c6c87af6212257f8845eb9ce07a02e4a0012fab999f402d6b302a07d3f7973ee8c357d5db8c7991903bd54d54d507cc23a05923155adc8cd3aceaf27c07858d290a3b85fc378fdd98e9f4f7f70d157f28baa0c55b2981a6fe08260cb6a076c76858d56aafdf255d0a12a2c50abe35d468c7e7a0e85b45f9a72f3abf2758687f2bdc33deab733aa4ef769bd5648f6a55ae1fb123a06ef38fec665b8eb25934622af1112b9a9d52408c94d2c0124d6e24b7ff4296c0a0867f6119f66c88787520dc8899d07d0e49598fa8dde1f33e611871eff6cd049680f8f1a0ca06c2b4c97d9941e56c3c752abe4c2b0b2cd162e22a5d25f61774dc453deedfa0344f34e01710ba897da06172844f373b281598b859086cf00c546594b955b87080a09bc4a42b6376f15f2639c98ad195b6fb948459cca93c568eacb33574b826a7af80a0525e7dd1bf391cf7df9ffaaa07093363a2c7a1c7d467d01403e368bd8c1f4e56808080808080a0758bf45f49922e3f1273d3e589753038a18ce3bbd961e3493f276eb7c5d04a3fa0235db60b9fecfc721d53cb6624da22433e765569a8312e86a6f0b47faf4a2a23a02f35f91fe878f56f1dd0b738bd12d9c8ed0f9b0f6be4146b66ae2c5625cc156b8080f85180a07f152c1e0fbe4b406b9a774b132347f174f02f3c2d6d1d4ad005c979996754b28080808080808080808080a06225fcc63b22b80301d9f2582014e450e91f9b329b7cc87ad16894722fff5296808080f8719d20a65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002b851f84f018b02b4f32ee2f03d31ee3fbba046d5eb15d44b160805e80d05e2a47d434053e6c4b3ef9d1111773039e9586661a0d0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23' + content_value_retrieval: '0x04000000e09e20fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace12' + +# Block 19,000,000 +# Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 (WETH) +# Storage slot: 2 (corresponds to the number of decimal points) +# Branch node, corresponding to the path: 4578 (parent of the leaf node) +- block_header: '0xf90232a0759e27a5069535949f0a7247ebc999367dbd77964d77ed004ffc8db3d4940248a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a01ad7b80af0c28bc1489513346d2706885be90abb07f23ca28e50482adb392d61a0410d8efe973613f9463bb25a0c71ccb52b264842f4874510d70dd748fbbeb0b6a044dbbbb92e053ec5030657cf7e854062602a7dbad7890fb43c01009d1d39faf5b9010081a101008600144d8040180c8c2840027104a0d80031c6f9028b61055022063e4556d43e84a0087802a00608378509003a83ca9cfd1420245eed68d217280b016086100945109e1bbc614b28a248a1a2d881e19700c408aa02803d30c92d02c07c811d100200ab4f05e9502102240842a0890868a80084cbc96009d3040c4d09221d83da8911054c305c62422a0cd128b75240834312c6dea00110c04a18b034062068801bc02880899010c00a535d98753580c830ae81003d8529741108825b525030de0a082448090a8846480f991013e1820a448024551559205e44b5a0020050a9014a14d0a0004c20780aa08c31745eb688421c50540418c04361424c4d80840121eac08401c9c3808392afc98465a2e1c38f6265617665726275696c642e6f7267a0b45e3fdbc1a41216ad07ac931215c5d6df190217efade280d1825c4a667ad2038800000000000000008504abff88bca05ef785b1e235d0641dded9d2c3fd5c501002d353101ed0f53434881d5ca49286' + content_key: '0x218679e8eda65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002440000007562413c88751df2b0c6c9c0490ebe5ed8d29c77681baf0dcb01183f2622a65a140578' + content_value_offer: '0x28000000370b0000cf384012b91b081230cdf17a3f7dd370d8e67056058af6b272b3d54aa2714fac180000002c0200004004000054060000680800007c0a0000f90211a0a0a734698552c6653d671994515b5f957ee1181abbfcda9d6ab8d245f89d0ebaa0674f8923e71d1155c248954b0f84eec649b0ae699442e707a998ec03773216f9a0ec35530a26811392e912f5c35df2b882cefba34f3f48190b3863cb1c78112520a09e19f39e13a8ada173c1723d1412592ec04e759da3e1bbfa5b8414d403c6badba05f12db0b204db3bc2d6c7b742d42ac8aebf20625465bb70268318068c6f95dd1a05aae7a4e7f57117bee5bef3c427f08e41ee81df13feb9663877d8763d0e67b16a0d911c69d2884ea02a8234b65576b60c89df36a3e41185d52f882f4800dac0171a07aab7513e12239d8a60120d9eb4d90d8857dcc2674180e80606f023c51a4ffdda0eacf1a83f5b253084e53a96532a75ac8346f12279595cbe485e3c880ed8a3bdba0c1d8d9c079eadb177ab06642433db67924c9f3291b85bfa33313e2f434bfa87da0c3a6abc8f5f37d46fd39330822449d0f2027571d5adbf186f66a3d153baecf58a0f07c540cacacb94fad3a8f913fd5bb60b12ea0b22f98deee14fbf64a402365bba0b2da1bbd6cda80337b186e485cf03318fa9eb895e2f10510856557b5556f1d19a0f08121eddb12c6b4c1471dcc76d4476af1b2387909e8c18fc02ff205b8734d83a0f1676391668dcee8af59dca3e49bf6adf69500187898992929d971ec019ba474a0eecf014df9ccb652baff40b102dfcc57cb8ec54805f907ce8a6a7d212bb47eec80f90211a0d44f76309b04285d7d4aff58b56aa3a2ff8b95da59b9535b7c9b31c9f582bad9a0b3dcf5ba7bb211621b0819f8adf1f300937e3c43699a6323fcd73b251b929a4aa05547a48db300342cad811ff8b0fc2af4f20f014ae6b5e5b86db51b07e9a833f6a0b90cbb4c7bd0b4f6f68e097c6309df5ded9424156638499a619643dd0205aeada0acb7bbf4a7013d34a5cac2c4c0e22d64c8db501589d1d1004c03f5bada1d747da0da0071908331247c33ccd3709a7e7d552591541874af73e1258a5df028ae5e63a064e408adb681365971c9fb12f53e4a8397419012881d2fad55a3760d97c3878fa0c33d50245a2c5afaa69511527bd7c47b319680edb536c940f43713cf556adf0da06e6c3c870c3c0b1adee85c44ede8cbe765a1473a8d0066c40f5402c38b6cf50ea0e88a4156c982d96e45c5d83b9f13cb7e8cb06bb0a1394b31a9d2709340c42588a0216b6c808f330cef5c684349690e514a4acf04c38fb3cdb18fdc6deefffb0beda09f725359320ca158811eb6af4654bd2dd68129019dd41028540cd4628f4504bda00fa15a861831834dd7a667e896aa0c87c8b48935435039157d8933f4d5aac90ea08e5624252293da2a75d756f10d23f7e7384b0b3b329512ecc88303408f3462cda0956adecc13bd4e8a14c43e5afa7b676578fb2ab7966037af1a94d095c7320801a0917af97d64aea571c5b2ea43300d863aa383aeb4d5f9807fe8e71bc01af2795a80f90211a077fb8073776e6bc376dd9c71048aa8e9f2fd36255cb92dd1bc77c1c68d0d7cb9a06134d20ea572e393ae7ca9e1d7c246731de3b573d32f469de00438880a9931a7a0503a7c42261fc325d6f5f7f45226affca2afc0be1105e957da5aefde4b6d05a3a0d9a27feeda690d27bdc3db7a0c5d6ffcf7ca7a44fcc84ceddaa0a53bfb8ad673a0cad9b09825416720f05a428b207cefdc768ca77a9c4f208f44adff0366bb6145a0a08eabe201b7a04939124052e364fe89b98d3dbeda2d92ff700d2358a319f238a0f2e6bb361675c8c1bfda5397e0530df89ff33d14bed771d054c26d1193468444a04707fa3c3c461698296bcde4e498cccb93a3f525811f8656d241f4573b10e3eca04d059adbc5185f218220e58e5bf9dfbd99952064f65ef8aa67ef541e1fa5831fa0871fb653564b4165fb10ce9145429dd15aac1707f8e580c783336f77bd5c9a96a043158ed6016199c7b9957c084c0349323b90cb8123a224c68bc222545b7c8321a00567ece2acc1800ebc43372660cbc3568b263d16833d49737d340a1b36fdd4bea0536c2166f8e88ec79e4dc0d5a3f46f44c8b5c4bc652ce91208d6388e4201ffd2a09ca540765900e026e46050fa9197218bd1075d24483c816ac8f42a0f819d9bdfa0a4d3505e91bbe8a40cd09280fcc4cf64d96a6e763831dec380b3f2ba3e37a4e0a0f245af40b496ce96c29ab97b6062a126be2f91b7761139a4258746ee891eec6380f90211a07662fedac79b0c428231ba283133012b0e3b75215b24a360a6a6eba6109653f4a0bcdfb8605e99657104135a390403b8f53804b5bf2203c9c1f5b3883180ec0bc6a0bcdf0d4fbd3f6a2656336c6df2b4fbdc79ce572671fcd26c4d66e58befc2d78ba0f7a4b4fb00382806a8e6b8b2559569eb7ec70b5e1e2e1c917f1f5c4b268c1600a0e9f007c95e2858bb59db8939bdcb8fb96d5100844551777c507794ed7d522d4ca0374b2c6be44f285ae1f87904618e3777ac999619153ee5d99517fdaad2368206a0f292ee114e85842bed63ba3aea7a8f22738b05f1a418cb30146f5edf46fc7781a0acfba64d149f25bc2a8ecd263bfe93b1363bbd3c364f047e0ff8f9b8faac1e75a0a28907885b59d01e2b5158f53880df233c0684ca242d7da1127238df84dc7c68a080b19db0f0c9965719499d3b90568e879ed429b6cffbf8103c1e21e8be07e580a0625dc89d33af85c1cf901bcce2686fa07672c51627866994c89510a6a7062912a0ebc653913a4833d2a971b12ce03178f63dead0c9e640fbd122563607f00f2d91a00cded7cb7c86826a9e755e04432340a9d4d8fa3bf5597e84ea91a7e6258e8f22a08e3b2e73b1cb8cfaa702e7b0cd5ff7e80ddb33f47dd16b5c0214103cb86aa003a0ead26815cc1a11843006f8892683f8732d3a519238b3cb63d2a57893aaaa0beba05c24ed83d1b166ecd5c9c1784bf113b0a9550c8909b0619133f559b37515dfc680f90211a0c675510b69c14ea4601897a064338a6b83692a6c29e6c6ac0f226025cda017c0a048baf29b758cb2b03835b778b1a3c80ce11e171614d9af7b1165f5c47fa290c5a03506d01d719efac9cf74f211b7ac92e8aecc05a3779018bc318741b60fee075ca0218f79c956e996bdc6a69476f0d691be85d625685f4e28a10e1c1a1289211356a0889eaa3d6289449e7ee16bc9bd14798223967a3b5a77e72f01ea39ba353ef42ba00eef8e973e31f307f1e74d54e4b13d169504eda8cf88d112b9f22d45c6ef08eda0a90cbcc7c75529502492cec75875c7344a3a5cc6ab91e3678ec8fc6eae250aaaa0b0a8313cdc75f6997ffbab1a2107b5ea0666b18999e9ae6c4217751d38ab85e3a07562413c88751df2b0c6c9c0490ebe5ed8d29c77681baf0dcb01183f2622a65aa0799d16f091a5bc05cb67a3fb489348845d5f548f5666b98941ebf392b3c02acba0d4c9d6926affbfd016d9474d49712bf10b75933010da8fb502c6345de068bdb8a00e6768ad039910330294c2a39a5c66065edf58913b7c9a974a57099f91a16a3ca03753183cb71d4e2f579f627e5e627e4280762f8a8ce1c20eabd9ac6a3fa46716a0575f79b487c821de2c9b7c4e29622b43b01e50d3196f5120d9a6e8cce4af4852a0eb48cda9ec3a4bfd2b07eda786f9b252079f081c54b84dccb33c9815d7f0d777a0b1d2ca6c8051e662589abe1d8d369538347f0f279897a128029be481c216615e80f891808080808080a0e701b13b6586c51266db06e2ecf5d2feb7f18f7cc2130dc8ddf942a27e9d5aa3a0eb43d68008d216e753fef198cf51077f5a89f406d9c244119d1643f0f2b19011a07edce1a61a9ba0549ef730adf66f30a4e8eafcda332a8cc04547d554a6bc1acd808080808080a026e499fde69be18e4abaf6c0def40aad830245fd0988d03f234ae3f5ef21ce708024000000380200004c0400006006000074080000880a00009c0c00008f0d0000e20d0000f90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780f90211a0be51f8518274d3e1beeaaa8cebe00428d5fd388e5a2a50404a4278e4dbb822b8a0c89fe8e16d89a82d5dcde02ef4a861c49549f23caa89c6772cd3e046924170a2a09d3e56c85bde8ff3e48f1029a3ed19f6cc1657ea7148396264117128916bf192a0dfe966436ccd76314d1ff27c3f314ba4bd67cdbb84bf6e7aa838407acd31f8c2a02a4659357dbb06d71dc46b900459e5bff6f3e49e4ef001cf4c8a2c62a7a227f9a02db2fff7623b55bef3e3e97d4596d35bf648209ed27a1dfa4574a950e76e9866a0e9b7cec39e827b538d84d697c774c2415d4c779b4633e3512b1b3b037e5be466a024a73f497d6080270bd263da5eb8c65a8495202d23880bb332a5fc7c4b18c4a8a08461ab3f12ab5d327b9496351467b25b27fab2e83c0c05618eb1fc20611f1958a022c7ff9562e90fee635a098995fb60330f313c683bf387b16e36f3ed01df69cca068c8d94e7b4b8a512cc108fd5fc723c53524f18d15c5aa354a5ed4076d5818a6a0d8162bc7fbbc17e616c126ba764cc4117ff3ec948a3bd588ea3287f8b901c4a7a0292d04df2f33b68e0033209c36035212c23581c8be47c5e0ea67e18fe8521f58a0e7ae2ece7c4c44a19a4d576904e39574030d6f739b450e75f36c59c83ae91829a0d577206430b32c22323816ba5309a85e5f71954e2bf5c755f5e33ee00f0de899a0f1f58b86f4addc6c095586a5333d6816b9b8a6d97b486798442863ea9615ae1380f90211a0256e27eecd0670e56ade58d99348a11f6fa4985d1f7b23143c61ee0a04a5a053a050b3d0ae7fdcad74ee9e322bb5b5fedb329db8b5bb95b281ee6d5b090314520ea07800c5365602d0c6eed658ee1056a0a2576809372757b1a42bafcc98438aebdba09bb7c947da462574a0fc0ae5608c25ac3272bb8fe3f2e619b20a10ced54738cfa0f73e7c44ce8ab0bc3495eba1aa7e2a0db44505d690e9d2daf4fab856cff999e2a022820f57846aa9ca4d0ebab020327b14178da53c2e006aaf5a22cc6648bc055ca0989235e562ad6e89656e7b8ccb301c300138d1eceddc2cfb724799a13f089783a0aa9b63d694d348219c0fb7f77b45e0e6835c99cda60a8f2030f0f712716b3751a0a34922189d09d23f5e0c8ff2f0b2407ff98a308cb3e8a9239cd4c776cee1e23ea06af9c10b566519fbbeb36dd1b3458b23fd25aeef27275a88df2d7662c2084ca9a05ce8b9e271738c6c52b1078ec04566681c8f11f679eeb2e83197431798cae230a05bfd293e2680e5c45fba826bb768e4d2cad9ab1451a712e98b0cdfba4d31b3f7a0f3ca96a33140e3e0e6ed23e857b6e5c5c7bdb77d7ef520aa4e10213d525bae84a003de0c0d867465dbb29e938fe08f3a508b26abacf7fdf8e02ffb485229195f14a0141a995d94148f08196179583fc853e65f18c338b1afe93b948701b795720960a01a35da701f908a90c16c4cc97de451ac2c35d52b019a58a078e61afe0b9a1cd480f90211a019c38310558d06bcbb4da68f64e61f2e6ee0f9bf3f6d643099e2e5c537294f6ba03a2ea461fdc547b6f72bc5d0b6f0a350aea0cb4b8ce1b036d123a5a00ec58b4aa07804bb6a71cf8c1153df5aa4ef84a409f26dd96c376e793da8cf9bcc802b4c26a076b61be012d6c7494b54c77a2dc6fcfe5568eef756d7a9b827c71ff25849dd87a0c8e8448bf1fbb0511823f5a92ff0febd7cad713967b5bbd0a4603d4ef2b9ef01a04c6d270a17b8fc136e0741940349c43d1e4ca894f191eefa13851da489de99d5a01076e9645c48dfed84933a8fae6016be4d47946f8105ccbc892ab0ae6ccf837aa0c6fea6b5dd5a7bae7e3c2ffae6841b292b613bf4c7421bdb90226f53e9eebc51a073b6c1de7658ec6f66fd52f1d66ac278ed0f3db37201981a9ca4b64a951fc52ba00bc5ecf44d423b4b6e0030d057939b739b85981c2bf2b4ad4f968bebd83cba7da0ed7e7a51c44fc09f230853a018c49eb711fbfa439904fd5ceb99c00b166f3ac7a005bf4f540bbc5bd6731dd89f4ff0a28c8ad8ee39d9611ef4bda0e2016bbd644ea0a1e0d3c4b952dce2233de45cca6e6c771e3f552ff6ff0194ff3d1b44d620683ea081e8d789f13dac46de04320c3a9c7d3e488ec667a619c21a020f95a41093e338a0dc9b8851a29da9247a4423fdcc689ae44c7843d31a891a067509780a2664c0a6a064f75b0a17b502154c6d316e7244bfde51a39b211484d311be73b80fbb93fd9c80f90211a09c0680faf2d7a9a79b5eedf6a8f846b95431cf91391973f6d1a6ec66dc7c3c24a02fd29886972cc78eab95ef19fd5cdd434e8d60c79b7d7aaff5b183469b848892a0cd246c92230812e63f13e8fddf2d0a0a976fde22e78256f9f3c7fd8219c71494a0f1d0b771957fe8d4c908d4ca730deca96c4ead47a9cde9648dd371da93bedbfca0de3910f22bd6ac087a1f778dfb20c7df43f7b3177e1abfe89d76d094dbd5753ba034b9341a9dad17687f5c22155e87ddbfea86dc0374e2071c6fac2a34fed5d7eea015eb41b2ece7cffbeaa040429aea2c73cf1c97a79282522f9eb25fcad1379b03a032214af47db0deb697b79ab12adc1b92cbace8395c8772544e803f33496c8073a01ac13a790f63114ce9bde82925bb5be8f4a09ee8ecf086d7675517248f8b8d4da04fe95c1a0f329cbf6b40efb608497e1d35f86919270a1c3b0a5b8f5c4675fbd6a0649e3ea0c951c4a16658f463755df800dd83f331f25a37275476877ce2eed44ea0157f094338c21f03a13a16793af96cc11a8f8a4a23b1f6105816833f603eabd0a086913ed8ad6c2c5d3d1e37b18bf7522aa080c04f3acd32a521efc7297653b658a0ed086a76c87f4654a164d1c4ec2626743cfa89bc1c4af41eba7369b42708c690a0c6730ce5e1df17601ac55b243bcba90a9f49dc835044bda9e2d7a76885b36598a0368943b40d006cdd58e0f576314c626fae7bc832d9451c5758a15c03e0bd08f680f90211a0515cb567f896e05d10003f6fff6b848448ecdfa82d6f854a8bf0058a57f53563a03661a6bd0c24511a05b40f8ae74c737f47d0df70bbf3c7a0816810ed90a84426a0c4d94bcf7df0b9c6707deb12770d992c1e60724ec2f40633a02ef1c4375326bba06af61ac19cd4496fb6d376dc38a8165a2561022866ce6fef41f8ade0fd2a407ba003a8b55e6cf12c06d0962f587bc293bca33303b7cc747f4ffbd17332cdbb33dda04f96708c335dd6364f8c5b4fc62edf32f5fd9a7107a99be1e9f6914b4093b88ca0e3981f17dbc1a00258432c0e34232f267d05e271590ee7a9783a51870f9873c8a03f2b45b47cdc12f020c55f6da3f7a348ec409de53a618b9cda4523c97d754b82a0935bc9189b81bb782d6b4d1451ab3d165b94a6fc4de4ab275528c06d9a128729a0c07c4048481c07b118748b2a30e851cf5c6c87af6212257f8845eb9ce07a02e4a0012fab999f402d6b302a07d3f7973ee8c357d5db8c7991903bd54d54d507cc23a05923155adc8cd3aceaf27c07858d290a3b85fc378fdd98e9f4f7f70d157f28baa0c55b2981a6fe08260cb6a076c76858d56aafdf255d0a12a2c50abe35d468c7e7a0e85b45f9a72f3abf2758687f2bdc33deab733aa4ef769bd5648f6a55ae1fb123a06ef38fec665b8eb25934622af1112b9a9d52408c94d2c0124d6e24b7ff4296c0a0867f6119f66c88787520dc8899d07d0e49598fa8dde1f33e611871eff6cd049680f8f1a0ca06c2b4c97d9941e56c3c752abe4c2b0b2cd162e22a5d25f61774dc453deedfa0344f34e01710ba897da06172844f373b281598b859086cf00c546594b955b87080a09bc4a42b6376f15f2639c98ad195b6fb948459cca93c568eacb33574b826a7af80a0525e7dd1bf391cf7df9ffaaa07093363a2c7a1c7d467d01403e368bd8c1f4e56808080808080a0758bf45f49922e3f1273d3e589753038a18ce3bbd961e3493f276eb7c5d04a3fa0235db60b9fecfc721d53cb6624da22433e765569a8312e86a6f0b47faf4a2a23a02f35f91fe878f56f1dd0b738bd12d9c8ed0f9b0f6be4146b66ae2c5625cc156b8080f85180a07f152c1e0fbe4b406b9a774b132347f174f02f3c2d6d1d4ad005c979996754b28080808080808080808080a06225fcc63b22b80301d9f2582014e450e91f9b329b7cc87ad16894722fff5296808080f8719d20a65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002b851f84f018b02b4f32ee2f03d31ee3fbba046d5eb15d44b160805e80d05e2a47d434053e6c4b3ef9d1111773039e9586661a0d0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23' + content_value_retrieval: '0x04000000f891808080808080a0e701b13b6586c51266db06e2ecf5d2feb7f18f7cc2130dc8ddf942a27e9d5aa3a0eb43d68008d216e753fef198cf51077f5a89f406d9c244119d1643f0f2b19011a07edce1a61a9ba0549ef730adf66f30a4e8eafcda332a8cc04547d554a6bc1acd808080808080a026e499fde69be18e4abaf6c0def40aad830245fd0988d03f234ae3f5ef21ce7080' + +# Block 19,000,000 +# Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 (WETH) +# Root node +- block_header: '0xf90232a0759e27a5069535949f0a7247ebc999367dbd77964d77ed004ffc8db3d4940248a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495222290dd7278aa3ddd389cc1e1d165cc4bafe5a01ad7b80af0c28bc1489513346d2706885be90abb07f23ca28e50482adb392d61a0410d8efe973613f9463bb25a0c71ccb52b264842f4874510d70dd748fbbeb0b6a044dbbbb92e053ec5030657cf7e854062602a7dbad7890fb43c01009d1d39faf5b9010081a101008600144d8040180c8c2840027104a0d80031c6f9028b61055022063e4556d43e84a0087802a00608378509003a83ca9cfd1420245eed68d217280b016086100945109e1bbc614b28a248a1a2d881e19700c408aa02803d30c92d02c07c811d100200ab4f05e9502102240842a0890868a80084cbc96009d3040c4d09221d83da8911054c305c62422a0cd128b75240834312c6dea00110c04a18b034062068801bc02880899010c00a535d98753580c830ae81003d8529741108825b525030de0a082448090a8846480f991013e1820a448024551559205e44b5a0020050a9014a14d0a0004c20780aa08c31745eb688421c50540418c04361424c4d80840121eac08401c9c3808392afc98465a2e1c38f6265617665726275696c642e6f7267a0b45e3fdbc1a41216ad07ac931215c5d6df190217efade280d1825c4a667ad2038800000000000000008504abff88bca05ef785b1e235d0641dded9d2c3fd5c501002d353101ed0f53434881d5ca49286' + content_key: '0x218679e8eda65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a30024400000046d5eb15d44b160805e80d05e2a47d434053e6c4b3ef9d1111773039e958666100' + content_value_offer: '0x2800000040020000cf384012b91b081230cdf17a3f7dd370d8e67056058af6b272b3d54aa2714fac04000000f90211a0a0a734698552c6653d671994515b5f957ee1181abbfcda9d6ab8d245f89d0ebaa0674f8923e71d1155c248954b0f84eec649b0ae699442e707a998ec03773216f9a0ec35530a26811392e912f5c35df2b882cefba34f3f48190b3863cb1c78112520a09e19f39e13a8ada173c1723d1412592ec04e759da3e1bbfa5b8414d403c6badba05f12db0b204db3bc2d6c7b742d42ac8aebf20625465bb70268318068c6f95dd1a05aae7a4e7f57117bee5bef3c427f08e41ee81df13feb9663877d8763d0e67b16a0d911c69d2884ea02a8234b65576b60c89df36a3e41185d52f882f4800dac0171a07aab7513e12239d8a60120d9eb4d90d8857dcc2674180e80606f023c51a4ffdda0eacf1a83f5b253084e53a96532a75ac8346f12279595cbe485e3c880ed8a3bdba0c1d8d9c079eadb177ab06642433db67924c9f3291b85bfa33313e2f434bfa87da0c3a6abc8f5f37d46fd39330822449d0f2027571d5adbf186f66a3d153baecf58a0f07c540cacacb94fad3a8f913fd5bb60b12ea0b22f98deee14fbf64a402365bba0b2da1bbd6cda80337b186e485cf03318fa9eb895e2f10510856557b5556f1d19a0f08121eddb12c6b4c1471dcc76d4476af1b2387909e8c18fc02ff205b8734d83a0f1676391668dcee8af59dca3e49bf6adf69500187898992929d971ec019ba474a0eecf014df9ccb652baff40b102dfcc57cb8ec54805f907ce8a6a7d212bb47eec8024000000380200004c0400006006000074080000880a00009c0c00008f0d0000e20d0000f90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780f90211a0be51f8518274d3e1beeaaa8cebe00428d5fd388e5a2a50404a4278e4dbb822b8a0c89fe8e16d89a82d5dcde02ef4a861c49549f23caa89c6772cd3e046924170a2a09d3e56c85bde8ff3e48f1029a3ed19f6cc1657ea7148396264117128916bf192a0dfe966436ccd76314d1ff27c3f314ba4bd67cdbb84bf6e7aa838407acd31f8c2a02a4659357dbb06d71dc46b900459e5bff6f3e49e4ef001cf4c8a2c62a7a227f9a02db2fff7623b55bef3e3e97d4596d35bf648209ed27a1dfa4574a950e76e9866a0e9b7cec39e827b538d84d697c774c2415d4c779b4633e3512b1b3b037e5be466a024a73f497d6080270bd263da5eb8c65a8495202d23880bb332a5fc7c4b18c4a8a08461ab3f12ab5d327b9496351467b25b27fab2e83c0c05618eb1fc20611f1958a022c7ff9562e90fee635a098995fb60330f313c683bf387b16e36f3ed01df69cca068c8d94e7b4b8a512cc108fd5fc723c53524f18d15c5aa354a5ed4076d5818a6a0d8162bc7fbbc17e616c126ba764cc4117ff3ec948a3bd588ea3287f8b901c4a7a0292d04df2f33b68e0033209c36035212c23581c8be47c5e0ea67e18fe8521f58a0e7ae2ece7c4c44a19a4d576904e39574030d6f739b450e75f36c59c83ae91829a0d577206430b32c22323816ba5309a85e5f71954e2bf5c755f5e33ee00f0de899a0f1f58b86f4addc6c095586a5333d6816b9b8a6d97b486798442863ea9615ae1380f90211a0256e27eecd0670e56ade58d99348a11f6fa4985d1f7b23143c61ee0a04a5a053a050b3d0ae7fdcad74ee9e322bb5b5fedb329db8b5bb95b281ee6d5b090314520ea07800c5365602d0c6eed658ee1056a0a2576809372757b1a42bafcc98438aebdba09bb7c947da462574a0fc0ae5608c25ac3272bb8fe3f2e619b20a10ced54738cfa0f73e7c44ce8ab0bc3495eba1aa7e2a0db44505d690e9d2daf4fab856cff999e2a022820f57846aa9ca4d0ebab020327b14178da53c2e006aaf5a22cc6648bc055ca0989235e562ad6e89656e7b8ccb301c300138d1eceddc2cfb724799a13f089783a0aa9b63d694d348219c0fb7f77b45e0e6835c99cda60a8f2030f0f712716b3751a0a34922189d09d23f5e0c8ff2f0b2407ff98a308cb3e8a9239cd4c776cee1e23ea06af9c10b566519fbbeb36dd1b3458b23fd25aeef27275a88df2d7662c2084ca9a05ce8b9e271738c6c52b1078ec04566681c8f11f679eeb2e83197431798cae230a05bfd293e2680e5c45fba826bb768e4d2cad9ab1451a712e98b0cdfba4d31b3f7a0f3ca96a33140e3e0e6ed23e857b6e5c5c7bdb77d7ef520aa4e10213d525bae84a003de0c0d867465dbb29e938fe08f3a508b26abacf7fdf8e02ffb485229195f14a0141a995d94148f08196179583fc853e65f18c338b1afe93b948701b795720960a01a35da701f908a90c16c4cc97de451ac2c35d52b019a58a078e61afe0b9a1cd480f90211a019c38310558d06bcbb4da68f64e61f2e6ee0f9bf3f6d643099e2e5c537294f6ba03a2ea461fdc547b6f72bc5d0b6f0a350aea0cb4b8ce1b036d123a5a00ec58b4aa07804bb6a71cf8c1153df5aa4ef84a409f26dd96c376e793da8cf9bcc802b4c26a076b61be012d6c7494b54c77a2dc6fcfe5568eef756d7a9b827c71ff25849dd87a0c8e8448bf1fbb0511823f5a92ff0febd7cad713967b5bbd0a4603d4ef2b9ef01a04c6d270a17b8fc136e0741940349c43d1e4ca894f191eefa13851da489de99d5a01076e9645c48dfed84933a8fae6016be4d47946f8105ccbc892ab0ae6ccf837aa0c6fea6b5dd5a7bae7e3c2ffae6841b292b613bf4c7421bdb90226f53e9eebc51a073b6c1de7658ec6f66fd52f1d66ac278ed0f3db37201981a9ca4b64a951fc52ba00bc5ecf44d423b4b6e0030d057939b739b85981c2bf2b4ad4f968bebd83cba7da0ed7e7a51c44fc09f230853a018c49eb711fbfa439904fd5ceb99c00b166f3ac7a005bf4f540bbc5bd6731dd89f4ff0a28c8ad8ee39d9611ef4bda0e2016bbd644ea0a1e0d3c4b952dce2233de45cca6e6c771e3f552ff6ff0194ff3d1b44d620683ea081e8d789f13dac46de04320c3a9c7d3e488ec667a619c21a020f95a41093e338a0dc9b8851a29da9247a4423fdcc689ae44c7843d31a891a067509780a2664c0a6a064f75b0a17b502154c6d316e7244bfde51a39b211484d311be73b80fbb93fd9c80f90211a09c0680faf2d7a9a79b5eedf6a8f846b95431cf91391973f6d1a6ec66dc7c3c24a02fd29886972cc78eab95ef19fd5cdd434e8d60c79b7d7aaff5b183469b848892a0cd246c92230812e63f13e8fddf2d0a0a976fde22e78256f9f3c7fd8219c71494a0f1d0b771957fe8d4c908d4ca730deca96c4ead47a9cde9648dd371da93bedbfca0de3910f22bd6ac087a1f778dfb20c7df43f7b3177e1abfe89d76d094dbd5753ba034b9341a9dad17687f5c22155e87ddbfea86dc0374e2071c6fac2a34fed5d7eea015eb41b2ece7cffbeaa040429aea2c73cf1c97a79282522f9eb25fcad1379b03a032214af47db0deb697b79ab12adc1b92cbace8395c8772544e803f33496c8073a01ac13a790f63114ce9bde82925bb5be8f4a09ee8ecf086d7675517248f8b8d4da04fe95c1a0f329cbf6b40efb608497e1d35f86919270a1c3b0a5b8f5c4675fbd6a0649e3ea0c951c4a16658f463755df800dd83f331f25a37275476877ce2eed44ea0157f094338c21f03a13a16793af96cc11a8f8a4a23b1f6105816833f603eabd0a086913ed8ad6c2c5d3d1e37b18bf7522aa080c04f3acd32a521efc7297653b658a0ed086a76c87f4654a164d1c4ec2626743cfa89bc1c4af41eba7369b42708c690a0c6730ce5e1df17601ac55b243bcba90a9f49dc835044bda9e2d7a76885b36598a0368943b40d006cdd58e0f576314c626fae7bc832d9451c5758a15c03e0bd08f680f90211a0515cb567f896e05d10003f6fff6b848448ecdfa82d6f854a8bf0058a57f53563a03661a6bd0c24511a05b40f8ae74c737f47d0df70bbf3c7a0816810ed90a84426a0c4d94bcf7df0b9c6707deb12770d992c1e60724ec2f40633a02ef1c4375326bba06af61ac19cd4496fb6d376dc38a8165a2561022866ce6fef41f8ade0fd2a407ba003a8b55e6cf12c06d0962f587bc293bca33303b7cc747f4ffbd17332cdbb33dda04f96708c335dd6364f8c5b4fc62edf32f5fd9a7107a99be1e9f6914b4093b88ca0e3981f17dbc1a00258432c0e34232f267d05e271590ee7a9783a51870f9873c8a03f2b45b47cdc12f020c55f6da3f7a348ec409de53a618b9cda4523c97d754b82a0935bc9189b81bb782d6b4d1451ab3d165b94a6fc4de4ab275528c06d9a128729a0c07c4048481c07b118748b2a30e851cf5c6c87af6212257f8845eb9ce07a02e4a0012fab999f402d6b302a07d3f7973ee8c357d5db8c7991903bd54d54d507cc23a05923155adc8cd3aceaf27c07858d290a3b85fc378fdd98e9f4f7f70d157f28baa0c55b2981a6fe08260cb6a076c76858d56aafdf255d0a12a2c50abe35d468c7e7a0e85b45f9a72f3abf2758687f2bdc33deab733aa4ef769bd5648f6a55ae1fb123a06ef38fec665b8eb25934622af1112b9a9d52408c94d2c0124d6e24b7ff4296c0a0867f6119f66c88787520dc8899d07d0e49598fa8dde1f33e611871eff6cd049680f8f1a0ca06c2b4c97d9941e56c3c752abe4c2b0b2cd162e22a5d25f61774dc453deedfa0344f34e01710ba897da06172844f373b281598b859086cf00c546594b955b87080a09bc4a42b6376f15f2639c98ad195b6fb948459cca93c568eacb33574b826a7af80a0525e7dd1bf391cf7df9ffaaa07093363a2c7a1c7d467d01403e368bd8c1f4e56808080808080a0758bf45f49922e3f1273d3e589753038a18ce3bbd961e3493f276eb7c5d04a3fa0235db60b9fecfc721d53cb6624da22433e765569a8312e86a6f0b47faf4a2a23a02f35f91fe878f56f1dd0b738bd12d9c8ed0f9b0f6be4146b66ae2c5625cc156b8080f85180a07f152c1e0fbe4b406b9a774b132347f174f02f3c2d6d1d4ad005c979996754b28080808080808080808080a06225fcc63b22b80301d9f2582014e450e91f9b329b7cc87ad16894722fff5296808080f8719d20a65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002b851f84f018b02b4f32ee2f03d31ee3fbba046d5eb15d44b160805e80d05e2a47d434053e6c4b3ef9d1111773039e9586661a0d0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23' + content_value_retrieval: '0x04000000f90211a0a0a734698552c6653d671994515b5f957ee1181abbfcda9d6ab8d245f89d0ebaa0674f8923e71d1155c248954b0f84eec649b0ae699442e707a998ec03773216f9a0ec35530a26811392e912f5c35df2b882cefba34f3f48190b3863cb1c78112520a09e19f39e13a8ada173c1723d1412592ec04e759da3e1bbfa5b8414d403c6badba05f12db0b204db3bc2d6c7b742d42ac8aebf20625465bb70268318068c6f95dd1a05aae7a4e7f57117bee5bef3c427f08e41ee81df13feb9663877d8763d0e67b16a0d911c69d2884ea02a8234b65576b60c89df36a3e41185d52f882f4800dac0171a07aab7513e12239d8a60120d9eb4d90d8857dcc2674180e80606f023c51a4ffdda0eacf1a83f5b253084e53a96532a75ac8346f12279595cbe485e3c880ed8a3bdba0c1d8d9c079eadb177ab06642433db67924c9f3291b85bfa33313e2f434bfa87da0c3a6abc8f5f37d46fd39330822449d0f2027571d5adbf186f66a3d153baecf58a0f07c540cacacb94fad3a8f913fd5bb60b12ea0b22f98deee14fbf64a402365bba0b2da1bbd6cda80337b186e485cf03318fa9eb895e2f10510856557b5556f1d19a0f08121eddb12c6b4c1471dcc76d4476af1b2387909e8c18fc02ff205b8734d83a0f1676391668dcee8af59dca3e49bf6adf69500187898992929d971ec019ba474a0eecf014df9ccb652baff40b102dfcc57cb8ec54805f907ce8a6a7d212bb47eec80' diff --git a/portalnetwork/state/types.go b/portalnetwork/state/types.go index 2026e074ea..a7b8b644a4 100644 --- a/portalnetwork/state/types.go +++ b/portalnetwork/state/types.go @@ -4,11 +4,18 @@ import ( "errors" "fmt" + "github.com/ethereum/go-ethereum/crypto" "github.com/protolambda/zrnt/eth2/beacon/common" "github.com/protolambda/ztyp/codec" "github.com/protolambda/ztyp/tree" ) +const ( + AccountTrieNodeType byte = 0x20 + ContractStorageTrieNodeType byte = 0x21 + ContractByteCodeType byte = 0x22 +) + var _ common.SSZObj = (*Nibbles)(nil) type Nibbles struct { @@ -232,7 +239,7 @@ func (c *ContractBytecodeKey) HashTreeRoot(spec *common.Spec, hFn tree.HashFn) c ) } -const MaxTrieNodeLength = 1026 +const MaxTrieNodeLength = 1024 type EncodedTrieNode []byte @@ -256,6 +263,10 @@ func (e EncodedTrieNode) HashTreeRoot(hFn tree.HashFn) tree.Root { return hFn.ByteListHTR(e, MaxTrieNodeLength) } +func (e *EncodedTrieNode) NodeHash() common.Bytes32 { + return tree.Root(crypto.Keccak256(*e)) +} + // A content value type, used when retrieving a trie node. type TrieNode struct { Node EncodedTrieNode diff --git a/trie/portal.go b/trie/portal.go new file mode 100644 index 0000000000..8efe375f9a --- /dev/null +++ b/trie/portal.go @@ -0,0 +1,49 @@ +package trie + +import ( + "bytes" + "errors" +) + +var ( + ErrEmptyLeafKey = errors.New("the leaf node has empty key") + ErrDifferentLeafPrefix = errors.New("the leaf prifix path is different") + ErrEmptyExtensionPrefix = errors.New("the extension node has empty prefix") + ErrDifferentExtensionPrefix = errors.New("the prifix path of extension node is different") +) + +func DecodeTrieNode(hash, buf []byte) (node, error) { + return decodeNodeUnsafe(hash, buf) +} + +func TraverseTrieNode(node node, path []byte) (hashNode, []byte, error) { + switch v := node.(type) { + case *fullNode: + first := path[0] + remainingPath := path[1:] + return TraverseTrieNode(v.Children[first], remainingPath) + case *shortNode: + length := len(v.Key) + lastKey := v.Key[length-1] + prePath := v.Key[:length-1] + if lastKey == 16 { + if len(prePath) == 0 { + return nil, nil, ErrEmptyLeafKey + } + if !bytes.Equal(prePath, path) { + return nil, nil, ErrDifferentLeafPrefix + } + return (v.Val).(hashNode), path, nil + } else { + for index, key := range v.Key { + if path[index] != key { + return nil, nil, ErrDifferentExtensionPrefix + } + } + return TraverseTrieNode(v.Val, path[len(v.Key):]) + } + case hashNode: + return v, path, nil + } + return nil, nil, errors.New("unknown type") +} diff --git a/trie/portal_test.go b/trie/portal_test.go new file mode 100644 index 0000000000..0dbcfbebc4 --- /dev/null +++ b/trie/portal_test.go @@ -0,0 +1,15 @@ +package trie + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +const data = "0xf90211a0491f396d5d4768a01ee4282a3ab1127f2a4dc7d42e6c1dbb3e71ad4e9299f5e7a05b4645219e614b388ba9672452b40f291987b15e35bdbd3dfebfac9a085aeab2a0979ebca2a6a0df389fdfef5bfa4a31f2efa8d385bf2f43cd69c27e61165c3667a01bbe04543bb6bf8026ee3ec2a3ec3d6173a60c090008b59779f767e5769d7a0aa051d347ec61c7dde5c4149a943d0aa489544cbea511ed3d7f4fc6aaa52a420d3ea05358bc8e1e1f20e510887226d67efee73769d0b13ebb24a3e750c2214ef090d5a04df1c24ebf40befce60c8eb30a31894102881454fcdeb6f7b83e1fb916c953a8a00a85e04f30a4978712c58a825e7bd2f8a83731ab1aa3e234a0207e918790505fa0778a45437218486b7849aef890d483dcc2deb1423cb81e488b7be2921d505bf4a051dbaef3c3d3fe82bd1484954f38508f651d867f387f71dedbfb0f7355987ed5a061679f43f3db26673bb687c584f30ae3cff7261e71acf07ed1feaecae098fc79a099761ea7d94e01b14285b7ced7dcd1677fbd3ce093a627a8e1472074baad8bd9a0bb6d269fc61443aa28b14af0448aaf6f1f570477d8b4ef2eb7d31543202ce602a06c41cd2d1701b058853591a2f306ddcfd1e55d3e12011cadb100e7c525aaf460a0bcf37abaac566bb98e091575af403804dbb278fbfa5547de6805cbaa529ae137a0de9918a2a976a2b0b3f4aeff801fc79557426b19c15d414ddf8fae843785b0b780" + +func TestDecodeNodePortal(t *testing.T) { + dataBytes := hexutil.MustDecode(data) + n, _ := DecodeTrieNode(nil, dataBytes) + t.Log(n) +}