github.com/prysmaticlabs/prysm@v1.4.4/contracts/deposit-contract/deposit_tree_test.go (about) 1 package depositcontract_test 2 3 import ( 4 "strconv" 5 "testing" 6 7 "github.com/ethereum/go-ethereum/accounts/abi/bind" 8 depositcontract "github.com/prysmaticlabs/prysm/contracts/deposit-contract" 9 "github.com/prysmaticlabs/prysm/shared/interop" 10 "github.com/prysmaticlabs/prysm/shared/params" 11 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 12 "github.com/prysmaticlabs/prysm/shared/testutil/require" 13 "github.com/prysmaticlabs/prysm/shared/trieutil" 14 ) 15 16 func TestDepositTrieRoot_OK(t *testing.T) { 17 testAcc, err := depositcontract.Setup() 18 require.NoError(t, err) 19 20 localTrie, err := trieutil.NewTrie(params.BeaconConfig().DepositContractTreeDepth) 21 require.NoError(t, err) 22 23 depRoot, err := testAcc.Contract.GetDepositRoot(&bind.CallOpts{}) 24 require.NoError(t, err) 25 26 assert.Equal(t, depRoot, localTrie.HashTreeRoot(), "Local deposit trie root and contract deposit trie root are not equal") 27 28 privKeys, pubKeys, err := interop.DeterministicallyGenerateKeys(0 /*startIndex*/, 101) 29 require.NoError(t, err) 30 depositDataItems, depositDataRoots, err := interop.DepositDataFromKeys(privKeys, pubKeys) 31 require.NoError(t, err) 32 33 testAcc.TxOpts.Value = depositcontract.Amount32Eth() 34 35 for i := 0; i < 100; i++ { 36 data := depositDataItems[i] 37 dataRoot := [32]byte{} 38 copy(dataRoot[:], depositDataRoots[i]) 39 40 _, err := testAcc.Contract.Deposit(testAcc.TxOpts, data.PublicKey, data.WithdrawalCredentials, data.Signature, dataRoot) 41 require.NoError(t, err, "Could not deposit to deposit contract") 42 43 testAcc.Backend.Commit() 44 item, err := data.HashTreeRoot() 45 require.NoError(t, err) 46 47 localTrie.Insert(item[:], i) 48 depRoot, err = testAcc.Contract.GetDepositRoot(&bind.CallOpts{}) 49 require.NoError(t, err) 50 assert.Equal(t, depRoot, localTrie.HashTreeRoot(), "Local deposit trie root and contract deposit trie root are not equal for index %d", i) 51 } 52 } 53 54 func TestDepositTrieRoot_Fail(t *testing.T) { 55 testAcc, err := depositcontract.Setup() 56 require.NoError(t, err) 57 58 localTrie, err := trieutil.NewTrie(params.BeaconConfig().DepositContractTreeDepth) 59 require.NoError(t, err) 60 61 depRoot, err := testAcc.Contract.GetDepositRoot(&bind.CallOpts{}) 62 require.NoError(t, err) 63 64 assert.Equal(t, depRoot, localTrie.HashTreeRoot(), "Local deposit trie root and contract deposit trie root are not equal") 65 66 privKeys, pubKeys, err := interop.DeterministicallyGenerateKeys(0 /*startIndex*/, 101) 67 require.NoError(t, err) 68 depositDataItems, depositDataRoots, err := interop.DepositDataFromKeys(privKeys, pubKeys) 69 require.NoError(t, err) 70 testAcc.TxOpts.Value = depositcontract.Amount32Eth() 71 72 for i := 0; i < 100; i++ { 73 data := depositDataItems[i] 74 dataRoot := [32]byte{} 75 copy(dataRoot[:], depositDataRoots[i]) 76 77 _, err := testAcc.Contract.Deposit(testAcc.TxOpts, data.PublicKey, data.WithdrawalCredentials, data.Signature, dataRoot) 78 require.NoError(t, err, "Could not deposit to deposit contract") 79 80 // Change an element in the data when storing locally 81 copy(data.PublicKey, strconv.Itoa(i+10)) 82 83 testAcc.Backend.Commit() 84 item, err := data.HashTreeRoot() 85 require.NoError(t, err) 86 87 localTrie.Insert(item[:], i) 88 89 depRoot, err = testAcc.Contract.GetDepositRoot(&bind.CallOpts{}) 90 require.NoError(t, err) 91 92 assert.NotEqual(t, depRoot, localTrie.HashTreeRoot(), "Local deposit trie root and contract deposit trie root are equal for index %d", i) 93 } 94 }