github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/store/rootmulti/proof_test.go (about) 1 package rootmulti 2 3 import ( 4 types2 "github.com/fibonacci-chain/fbc/libs/tendermint/types" 5 "testing" 6 7 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 8 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 9 "github.com/stretchr/testify/require" 10 11 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/iavl" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types" 13 ) 14 15 func TestVerifyIAVLStoreQueryProof(t *testing.T) { 16 // Create main tree for testing. 17 db := dbm.NewMemDB() 18 flatKvDB := dbm.NewMemDB() 19 iStore, err := iavl.LoadStore(db, flatKvDB, types.CommitID{}, false, 0) 20 store := iStore.(*iavl.Store) 21 require.Nil(t, err) 22 store.Set([]byte("MYKEY"), []byte("MYVALUE")) 23 cid, _ := store.CommitterCommit(nil) 24 25 // Get Proof 26 res := store.Query(abci.RequestQuery{ 27 Path: "/key", // required path to get key/value+proof 28 Data: []byte("MYKEY"), 29 Prove: true, 30 }) 31 require.NotNil(t, res.Proof) 32 33 // Verify proof. 34 prt := DefaultProofRuntime() 35 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY", []byte("MYVALUE")) 36 require.Nil(t, err) 37 38 // Verify (bad) proof. 39 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY_NOT", []byte("MYVALUE")) 40 require.NotNil(t, err) 41 42 // Verify (bad) proof. 43 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY/MYKEY", []byte("MYVALUE")) 44 require.NotNil(t, err) 45 46 // Verify (bad) proof. 47 err = prt.VerifyValue(res.Proof, cid.Hash, "MYKEY", []byte("MYVALUE")) 48 require.NotNil(t, err) 49 50 // Verify (bad) proof. 51 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY", []byte("MYVALUE_NOT")) 52 require.NotNil(t, err) 53 54 // Verify (bad) proof. 55 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY", []byte(nil)) 56 require.NotNil(t, err) 57 } 58 59 func TestVerifyMultiStoreQueryProof(t *testing.T) { 60 // Create main tree for testing. 61 types2.UnittestOnlySetMilestoneVenus1Height(-1) 62 db := dbm.NewMemDB() 63 store := NewStore(db) 64 iavlStoreKey := types.NewKVStoreKey("iavlStoreKey") 65 66 store.MountStoreWithDB(iavlStoreKey, types.StoreTypeIAVL, nil) 67 require.NoError(t, store.LoadVersion(0)) 68 69 iavlStore := store.GetCommitStore(iavlStoreKey).(*iavl.Store) 70 iavlStore.Set([]byte("MYKEY"), []byte("MYVALUE")) 71 cid, _ := store.CommitterCommitMap(nil) 72 73 // Get Proof 74 res := store.Query(abci.RequestQuery{ 75 Path: "/iavlStoreKey/key", // required path to get key/value+proof 76 Data: []byte("MYKEY"), 77 Prove: true, 78 }) 79 require.NotNil(t, res.Proof) 80 81 // Verify proof. 82 prt := DefaultProofRuntime() 83 err := prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE")) 84 require.Nil(t, err) 85 86 // Verify proof. 87 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE")) 88 require.Nil(t, err) 89 90 // Verify (bad) proof. 91 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY_NOT", []byte("MYVALUE")) 92 require.NotNil(t, err) 93 94 // Verify (bad) proof. 95 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY/MYKEY", []byte("MYVALUE")) 96 require.NotNil(t, err) 97 98 // Verify (bad) proof. 99 err = prt.VerifyValue(res.Proof, cid.Hash, "iavlStoreKey/MYKEY", []byte("MYVALUE")) 100 require.NotNil(t, err) 101 102 // Verify (bad) proof. 103 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY", []byte("MYVALUE")) 104 require.NotNil(t, err) 105 106 // Verify (bad) proof. 107 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE_NOT")) 108 require.NotNil(t, err) 109 110 // Verify (bad) proof. 111 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte(nil)) 112 require.NotNil(t, err) 113 } 114 115 func TestVerifyMultiStoreQueryProofAbsence(t *testing.T) { 116 types2.UnittestOnlySetMilestoneVenus1Height(-1) 117 // Create main tree for testing. 118 db := dbm.NewMemDB() 119 store := NewStore(db) 120 iavlStoreKey := types.NewKVStoreKey("iavlStoreKey") 121 122 store.MountStoreWithDB(iavlStoreKey, types.StoreTypeIAVL, nil) 123 store.LoadVersion(0) 124 125 iavlStore := store.GetCommitStore(iavlStoreKey).(*iavl.Store) 126 iavlStore.Set([]byte("MYKEY"), []byte("MYVALUE")) 127 cid, _ := store.CommitterCommitMap(nil) // Commit with empty iavl store. 128 129 // Get Proof 130 res := store.Query(abci.RequestQuery{ 131 Path: "/iavlStoreKey/key", // required path to get key/value+proof 132 Data: []byte("MYABSENTKEY"), 133 Prove: true, 134 }) 135 require.NotNil(t, res.Proof) 136 137 // Verify proof. 138 prt := DefaultProofRuntime() 139 err := prt.VerifyAbsence(res.Proof, cid.Hash, "/iavlStoreKey/MYABSENTKEY") 140 require.Nil(t, err) 141 142 // Verify (bad) proof. 143 prt = DefaultProofRuntime() 144 err = prt.VerifyAbsence(res.Proof, cid.Hash, "/MYABSENTKEY") 145 require.NotNil(t, err) 146 147 // Verify (bad) proof. 148 prt = DefaultProofRuntime() 149 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYABSENTKEY", []byte("")) 150 require.NotNil(t, err) 151 }