diff --git a/op-challenger/game/keccak/merkle/testdata/proofs.json b/op-challenger/game/keccak/merkle/testdata/proofs.json new file mode 100644 index 0000000000000000000000000000000000000000..7725d0c23c02bd292788b9d386130e8188fff2be --- /dev/null +++ b/op-challenger/game/keccak/merkle/testdata/proofs.json @@ -0,0 +1,177 @@ +[ + { + "name": "NoLeaves", + "rootHash": "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "leafCount": 0, + "index": 0, + "proofs": [] + }, + { + "name": "SingleLeaf", + "rootHash": "0xde8451f1c4f0153718b46951d0764a63e979fa13d496e709cceafcdbbe4ae68c", + "leafCount": 1, + "index": 0, + "proofs": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2" + ] + }, + { + "name": "TwoLeaves", + "rootHash": "0xcaa0130e02ef997ebab07643394f7fa90767a68c49170669a9262573bfc46116", + "leafCount": 2, + "index": 1, + "proofs": [ + "0xcfd23b6298abaea12ade48cd472295893b7facf37c92f425e50722a72ed084ac", + "0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2" + ] + }, + { + "name": "SingleLeaf", + "rootHash": "0xde8451f1c4f0153718b46951d0764a63e979fa13d496e709cceafcdbbe4ae68c", + "leafCount": 1, + "index": 1, + "proofs": [ + "0xcfd23b6298abaea12ade48cd472295893b7facf37c92f425e50722a72ed084ac", + "0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2" + ] + }, + { + "name": "PartialTree", + "rootHash": "0x2e1c9c8d6e2ab9051b2ea6f77e58302dbb6f06b9dddda46a83a8ca5c8690fed7", + "leafCount": 20, + "index": 10, + "proofs": [ + "0x30009b412aade7d8309511a4408ae2f4b72573dde601905693af9f3abb2e1dc8", + "0xa7ca9b77295eadcfe6d58ef5e86e88432a0417b36ac6e4ab2d2e9d45702292e5", + "0x0a8eb56a75e17742db02f5de94120005cfe95e26c80891de57e390b3e6a3ebc5", + "0xc9909a93d2c0248ef490da737dabda9e41eb3d9a379ddb004cfe66c60f3072df", + "0xa063b1a2583a43114cd150b3c2320fe0bccf5f1b0f75c92c9d7e55433a291517", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2" + ] + }, + { + "name": "PartialTree", + "rootHash": "0x2e1c9c8d6e2ab9051b2ea6f77e58302dbb6f06b9dddda46a83a8ca5c8690fed7", + "leafCount": 20, + "index": 11, + "proofs": [ + "0x536c2dfcd1e4d209e13b2e17323dc3d71171114b4ea9481dcfaac0361eeaffae", + "0xa7ca9b77295eadcfe6d58ef5e86e88432a0417b36ac6e4ab2d2e9d45702292e5", + "0x0a8eb56a75e17742db02f5de94120005cfe95e26c80891de57e390b3e6a3ebc5", + "0xc9909a93d2c0248ef490da737dabda9e41eb3d9a379ddb004cfe66c60f3072df", + "0xa063b1a2583a43114cd150b3c2320fe0bccf5f1b0f75c92c9d7e55433a291517", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2" + ] + }, + { + "name": "PartialTree", + "rootHash": "0xb003f2e3ac0841e22e4dc58f001f9ba731081dcfdc823c295429264e55ebfd95", + "leafCount": 65535, + "index": 65533, + "proofs": [ + "0xa7ead3155af3540785a09632e1a9a0e905700dddc29ca3531643209d11abde34", + "0x2510bc5d56f49d7f5cdce4e37424936b31f7a01ba27c0201b40bd00d7241f525", + "0x69251e33d3beeac7d24417e095adf8994eca90f7b220477b7dbdf7833ed5c646", + "0x37e281b275aa30e45a87ad2cfb8fbd6402fca47633dd698c519595e1360714dd", + "0x5fdae72b17eea7ab12066760cfe8dff858665ece3b5ec7ea30fb88737bc63e00", + "0x6657aa64e042b55b6915c5ac65c9f07e29e1e67466d159ab8432f15e7088ded6", + "0xa689859b6b6f0b586d267b5228b3d07c169889b219a49231386c4ed6c934df6e", + "0xb9d17d1a81bcc1e9434e517008e3f68e2e19ab73b464ca13885c9e3b1072fd0c", + "0xaf79e21764536f60b54298ba40da1d16fe432510c40d54e8d6d12f4c5491418d", + "0x0071a9f78633e4bf4f008134694b97783ffdf7651bf09096bce74b1cc77c9254", + "0x7d0475c42ed689be225ec7de3d6f620f5afa50d17223d3cf3b5faebe6b8eab63", + "0x7efcb6ac59e3ebd6cb62985827c634e88a9cf118a906d2d25f0facf44f8ce48d", + "0x0c2264f5c766dafd9ed23277449b2affe176e7ffeef29dad949932654df90f17", + "0x0622a9974a31b7774c1b89e494663f008a82d525dd00ac6fbaf322ae9845261a", + "0x882284d7f31dec4cadb4b46d2209ef7806e440d541f1d6efd2e1b53a32ee9e65", + "0xfbcf92d99fd2e103e15b1647b177895b0529dd715e551a80c90744818458a8e3" + ] + }, + { + "name": "FullTree", + "rootHash": "0xb003f2e3ac0841e22e4dc58f001f9ba731081dcfdc823c295429264e55ebfd95", + "leafCount": 65535, + "index": 65534, + "proofs": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5d5992fd072e73c425c84efbd29e9e4a87756a67d972f096661c967583809c8f", + "0x69251e33d3beeac7d24417e095adf8994eca90f7b220477b7dbdf7833ed5c646", + "0x37e281b275aa30e45a87ad2cfb8fbd6402fca47633dd698c519595e1360714dd", + "0x5fdae72b17eea7ab12066760cfe8dff858665ece3b5ec7ea30fb88737bc63e00", + "0x6657aa64e042b55b6915c5ac65c9f07e29e1e67466d159ab8432f15e7088ded6", + "0xa689859b6b6f0b586d267b5228b3d07c169889b219a49231386c4ed6c934df6e", + "0xb9d17d1a81bcc1e9434e517008e3f68e2e19ab73b464ca13885c9e3b1072fd0c", + "0xaf79e21764536f60b54298ba40da1d16fe432510c40d54e8d6d12f4c5491418d", + "0x0071a9f78633e4bf4f008134694b97783ffdf7651bf09096bce74b1cc77c9254", + "0x7d0475c42ed689be225ec7de3d6f620f5afa50d17223d3cf3b5faebe6b8eab63", + "0x7efcb6ac59e3ebd6cb62985827c634e88a9cf118a906d2d25f0facf44f8ce48d", + "0x0c2264f5c766dafd9ed23277449b2affe176e7ffeef29dad949932654df90f17", + "0x0622a9974a31b7774c1b89e494663f008a82d525dd00ac6fbaf322ae9845261a", + "0x882284d7f31dec4cadb4b46d2209ef7806e440d541f1d6efd2e1b53a32ee9e65", + "0xfbcf92d99fd2e103e15b1647b177895b0529dd715e551a80c90744818458a8e3" + ] + } +] diff --git a/op-challenger/game/keccak/merkle/tree_test.go b/op-challenger/game/keccak/merkle/tree_test.go index 0f6930ca91f248f172b19e8a9bada3171ae8c211..b5b840cfa9309ac7b50f25badb5dcc65193b05ba 100644 --- a/op-challenger/game/keccak/merkle/tree_test.go +++ b/op-challenger/game/keccak/merkle/tree_test.go @@ -2,6 +2,8 @@ package merkle import ( "bytes" + _ "embed" + "encoding/json" "fmt" "math/big" "testing" @@ -11,29 +13,27 @@ import ( "github.com/stretchr/testify/require" ) -func TestBinaryMerkleTree_AddLeaf(t *testing.T) { - var tests []struct { - name string - leafCount int - } +//go:embed testdata/proofs.json +var refTests []byte - // Test only three leaf counts since this requires adding a lot of leaves. - // To test more thoroughly, increase the divisor and run locally. - for i := 0; i < MaxLeafCount; i += MaxLeafCount / 3 { - tests = append(tests, struct { - name string - leafCount int - }{ - name: fmt.Sprintf("AddLeaf-%d", i), - leafCount: i, - }) - } +type testData struct { + Name string `json:"name"` + LeafCount uint64 `json:"leafCount"` + RootHash common.Hash `json:"rootHash"` + Index uint64 `json:"index"` + Proofs Proof `json:"proofs"` +} - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { +func TestBinaryMerkleTree_AddLeaf(t *testing.T) { + var tests []testData + require.NoError(t, json.Unmarshal(refTests, &tests)) + + for i, test := range tests { + test := test + t.Run(fmt.Sprintf("%s-LeafCount-%v-Ref-%v", test.Name, test.LeafCount, i), func(t *testing.T) { tree := NewBinaryMerkleTree() expectedLeafHash := zeroHashes[BinaryMerkleTreeDepth-1] - for i := 0; i < test.leafCount; i++ { + for i := 0; i < int(test.LeafCount); i++ { input := ([types.BlockSize]byte)(bytes.Repeat([]byte{byte(i)}, types.BlockSize)) lastLeaf := types.Leaf{ Input: input, @@ -50,32 +50,14 @@ func TestBinaryMerkleTree_AddLeaf(t *testing.T) { } func TestBinaryMerkleTree_RootHash(t *testing.T) { - tests := []struct { - name string - leafCount int - rootHash common.Hash - }{ - { - name: "EmptyBinaryMerkleTree", - leafCount: 0, - rootHash: common.HexToHash("2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f"), - }, - { - name: "SingleLeaf", - leafCount: 1, - rootHash: common.HexToHash("de8451f1c4f0153718b46951d0764a63e979fa13d496e709cceafcdbbe4ae68c"), - }, - { - name: "TwoLeaves", - leafCount: 2, - rootHash: common.HexToHash("caa0130e02ef997ebab07643394f7fa90767a68c49170669a9262573bfc46116"), - }, - } + var tests []testData + require.NoError(t, json.Unmarshal(refTests, &tests)) - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { + for i, test := range tests { + test := test + t.Run(fmt.Sprintf("%s-LeafCount-%v-Ref-%v", test.Name, test.LeafCount, i), func(t *testing.T) { tree := NewBinaryMerkleTree() - for i := 0; i < test.leafCount; i++ { + for i := 0; i < int(test.LeafCount); i++ { input := ([types.BlockSize]byte)(bytes.Repeat([]byte{byte(i)}, types.BlockSize)) tree.AddLeaf(types.Leaf{ Input: input, @@ -83,172 +65,20 @@ func TestBinaryMerkleTree_RootHash(t *testing.T) { StateCommitment: common.Hash{}, }) } - require.Equal(t, test.rootHash, tree.RootHash()) + require.Equal(t, test.RootHash, tree.RootHash()) }) } } func TestBinaryMerkleTree_ProofAtIndex(t *testing.T) { - proof := Proof{} - for i := 0; i < BinaryMerkleTreeDepth; i++ { - proof[i] = common.Hash{} - } - tests := []struct { - name string - leafCount int - index int - proof Proof - }{ - { - name: "EmptyBinaryMerkleTree", - leafCount: 0, - index: 0, - proof: proof, - }, - { - name: "SingleLeaf_ZeroIndex", - leafCount: 1, - index: 0, - proof: Proof{ - common.HexToHash("0000000000000000000000000000000000000000000000000000000000000000"), - common.HexToHash("ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"), - common.HexToHash("b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30"), - common.HexToHash("21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85"), - common.HexToHash("e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344"), - common.HexToHash("0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d"), - common.HexToHash("887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968"), - common.HexToHash("ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83"), - common.HexToHash("9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af"), - common.HexToHash("cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0"), - common.HexToHash("f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5"), - common.HexToHash("f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892"), - common.HexToHash("3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c"), - common.HexToHash("c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb"), - common.HexToHash("5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc"), - common.HexToHash("da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2"), - }, - }, - { - name: "SingleLeaf_FirstIndex", - leafCount: 1, - index: 1, - proof: Proof{ - common.HexToHash("cfd23b6298abaea12ade48cd472295893b7facf37c92f425e50722a72ed084ac"), - common.HexToHash("ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"), - common.HexToHash("b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30"), - common.HexToHash("21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85"), - common.HexToHash("e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344"), - common.HexToHash("0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d"), - common.HexToHash("887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968"), - common.HexToHash("ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83"), - common.HexToHash("9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af"), - common.HexToHash("cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0"), - common.HexToHash("f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5"), - common.HexToHash("f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892"), - common.HexToHash("3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c"), - common.HexToHash("c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb"), - common.HexToHash("5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc"), - common.HexToHash("da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2"), - }, - }, - { - name: "PartialTree_EvenMiddleIndex", - leafCount: 20, - index: 10, - proof: Proof{ - common.HexToHash("30009b412aade7d8309511a4408ae2f4b72573dde601905693af9f3abb2e1dc8"), - common.HexToHash("a7ca9b77295eadcfe6d58ef5e86e88432a0417b36ac6e4ab2d2e9d45702292e5"), - common.HexToHash("0a8eb56a75e17742db02f5de94120005cfe95e26c80891de57e390b3e6a3ebc5"), - common.HexToHash("c9909a93d2c0248ef490da737dabda9e41eb3d9a379ddb004cfe66c60f3072df"), - common.HexToHash("a063b1a2583a43114cd150b3c2320fe0bccf5f1b0f75c92c9d7e55433a291517"), - common.HexToHash("0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d"), - common.HexToHash("887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968"), - common.HexToHash("ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83"), - common.HexToHash("9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af"), - common.HexToHash("cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0"), - common.HexToHash("f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5"), - common.HexToHash("f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892"), - common.HexToHash("3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c"), - common.HexToHash("c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb"), - common.HexToHash("5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc"), - common.HexToHash("da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2"), - }, - }, - { - name: "PartialTree_OddMiddleIndex", - leafCount: 20, - index: 11, - proof: Proof{ - common.HexToHash("536c2dfcd1e4d209e13b2e17323dc3d71171114b4ea9481dcfaac0361eeaffae"), - common.HexToHash("a7ca9b77295eadcfe6d58ef5e86e88432a0417b36ac6e4ab2d2e9d45702292e5"), - common.HexToHash("0a8eb56a75e17742db02f5de94120005cfe95e26c80891de57e390b3e6a3ebc5"), - common.HexToHash("c9909a93d2c0248ef490da737dabda9e41eb3d9a379ddb004cfe66c60f3072df"), - common.HexToHash("a063b1a2583a43114cd150b3c2320fe0bccf5f1b0f75c92c9d7e55433a291517"), - common.HexToHash("0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d"), - common.HexToHash("887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968"), - common.HexToHash("ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83"), - common.HexToHash("9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af"), - common.HexToHash("cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0"), - common.HexToHash("f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5"), - common.HexToHash("f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892"), - common.HexToHash("3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c"), - common.HexToHash("c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb"), - common.HexToHash("5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc"), - common.HexToHash("da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2"), - }, - }, - { - name: "PartialTree_SecondLastIndex", - leafCount: MaxLeafCount, - index: MaxLeafCount - 2, - proof: Proof{ - common.HexToHash("a7ead3155af3540785a09632e1a9a0e905700dddc29ca3531643209d11abde34"), - common.HexToHash("2510bc5d56f49d7f5cdce4e37424936b31f7a01ba27c0201b40bd00d7241f525"), - common.HexToHash("69251e33d3beeac7d24417e095adf8994eca90f7b220477b7dbdf7833ed5c646"), - common.HexToHash("37e281b275aa30e45a87ad2cfb8fbd6402fca47633dd698c519595e1360714dd"), - common.HexToHash("5fdae72b17eea7ab12066760cfe8dff858665ece3b5ec7ea30fb88737bc63e00"), - common.HexToHash("6657aa64e042b55b6915c5ac65c9f07e29e1e67466d159ab8432f15e7088ded6"), - common.HexToHash("a689859b6b6f0b586d267b5228b3d07c169889b219a49231386c4ed6c934df6e"), - common.HexToHash("b9d17d1a81bcc1e9434e517008e3f68e2e19ab73b464ca13885c9e3b1072fd0c"), - common.HexToHash("af79e21764536f60b54298ba40da1d16fe432510c40d54e8d6d12f4c5491418d"), - common.HexToHash("0071a9f78633e4bf4f008134694b97783ffdf7651bf09096bce74b1cc77c9254"), - common.HexToHash("7d0475c42ed689be225ec7de3d6f620f5afa50d17223d3cf3b5faebe6b8eab63"), - common.HexToHash("7efcb6ac59e3ebd6cb62985827c634e88a9cf118a906d2d25f0facf44f8ce48d"), - common.HexToHash("0c2264f5c766dafd9ed23277449b2affe176e7ffeef29dad949932654df90f17"), - common.HexToHash("0622a9974a31b7774c1b89e494663f008a82d525dd00ac6fbaf322ae9845261a"), - common.HexToHash("882284d7f31dec4cadb4b46d2209ef7806e440d541f1d6efd2e1b53a32ee9e65"), - common.HexToHash("fbcf92d99fd2e103e15b1647b177895b0529dd715e551a80c90744818458a8e3"), - }, - }, - { - name: "FullTree_LastIndex", - leafCount: MaxLeafCount, - index: MaxLeafCount - 1, - proof: Proof{ - common.HexToHash("0000000000000000000000000000000000000000000000000000000000000000"), - common.HexToHash("5d5992fd072e73c425c84efbd29e9e4a87756a67d972f096661c967583809c8f"), - common.HexToHash("69251e33d3beeac7d24417e095adf8994eca90f7b220477b7dbdf7833ed5c646"), - common.HexToHash("37e281b275aa30e45a87ad2cfb8fbd6402fca47633dd698c519595e1360714dd"), - common.HexToHash("5fdae72b17eea7ab12066760cfe8dff858665ece3b5ec7ea30fb88737bc63e00"), - common.HexToHash("6657aa64e042b55b6915c5ac65c9f07e29e1e67466d159ab8432f15e7088ded6"), - common.HexToHash("a689859b6b6f0b586d267b5228b3d07c169889b219a49231386c4ed6c934df6e"), - common.HexToHash("b9d17d1a81bcc1e9434e517008e3f68e2e19ab73b464ca13885c9e3b1072fd0c"), - common.HexToHash("af79e21764536f60b54298ba40da1d16fe432510c40d54e8d6d12f4c5491418d"), - common.HexToHash("0071a9f78633e4bf4f008134694b97783ffdf7651bf09096bce74b1cc77c9254"), - common.HexToHash("7d0475c42ed689be225ec7de3d6f620f5afa50d17223d3cf3b5faebe6b8eab63"), - common.HexToHash("7efcb6ac59e3ebd6cb62985827c634e88a9cf118a906d2d25f0facf44f8ce48d"), - common.HexToHash("0c2264f5c766dafd9ed23277449b2affe176e7ffeef29dad949932654df90f17"), - common.HexToHash("0622a9974a31b7774c1b89e494663f008a82d525dd00ac6fbaf322ae9845261a"), - common.HexToHash("882284d7f31dec4cadb4b46d2209ef7806e440d541f1d6efd2e1b53a32ee9e65"), - common.HexToHash("fbcf92d99fd2e103e15b1647b177895b0529dd715e551a80c90744818458a8e3"), - }, - }, - } + var tests []testData + require.NoError(t, json.Unmarshal(refTests, &tests)) - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { + for i, test := range tests { + test := test + t.Run(fmt.Sprintf("%s-Index-%v-Ref-%v", test.Name, test.LeafCount, i), func(t *testing.T) { tree := NewBinaryMerkleTree() - for i := 0; i < test.leafCount; i++ { + for i := 0; i < int(test.LeafCount); i++ { input := ([types.BlockSize]byte)(bytes.Repeat([]byte{byte(i)}, types.BlockSize)) tree.AddLeaf(types.Leaf{ Input: input, @@ -256,9 +86,9 @@ func TestBinaryMerkleTree_ProofAtIndex(t *testing.T) { StateCommitment: common.Hash{}, }) } - proof, err := tree.ProofAtIndex(uint64(test.index)) + proof, err := tree.ProofAtIndex(test.Index) require.NoError(t, err) - require.Equal(t, test.proof, proof) + require.Equal(t, test.Proofs, proof) }) } }