github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/store/rootmulti/proof_test.go (about) 1 package rootmulti 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 8 abci "github.com/gnolang/gno/tm2/pkg/bft/abci/types" 9 "github.com/gnolang/gno/tm2/pkg/db/memdb" 10 11 "github.com/gnolang/gno/tm2/pkg/store/iavl" 12 "github.com/gnolang/gno/tm2/pkg/store/types" 13 ) 14 15 func TestVerifyIAVLStoreQueryProof(t *testing.T) { 16 t.Parallel() 17 18 // Create main tree for testing. 19 db := memdb.NewMemDB() 20 opts := types.StoreOptions{ 21 PruningOptions: types.PruneNothing, 22 } 23 iStore := iavl.StoreConstructor(db, opts) 24 store := iStore.(*iavl.Store) 25 store.Set([]byte("MYKEY"), []byte("MYVALUE")) 26 cid := store.Commit() 27 28 // Get Proof 29 res := store.Query(abci.RequestQuery{ 30 Path: "/key", // required path to get key/value+proof 31 Data: []byte("MYKEY"), 32 Prove: true, 33 }) 34 require.NotNil(t, res.Proof) 35 36 // Verify proof. 37 prt := DefaultProofRuntime() 38 err := prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY", []byte("MYVALUE")) 39 require.Nil(t, err) 40 41 // Verify (bad) proof. 42 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY_NOT", []byte("MYVALUE")) 43 require.NotNil(t, err) 44 45 // Verify (bad) proof. 46 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY/MYKEY", []byte("MYVALUE")) 47 require.NotNil(t, err) 48 49 // Verify (bad) proof. 50 err = prt.VerifyValue(res.Proof, cid.Hash, "MYKEY", []byte("MYVALUE")) 51 require.NotNil(t, err) 52 53 // Verify (bad) proof. 54 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY", []byte("MYVALUE_NOT")) 55 require.NotNil(t, err) 56 57 // Verify (bad) proof. 58 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY", []byte(nil)) 59 require.NotNil(t, err) 60 } 61 62 func TestVerifyMultiStoreQueryProof(t *testing.T) { 63 t.Parallel() 64 65 // Create main tree for testing. 66 db := memdb.NewMemDB() 67 store := NewMultiStore(db) 68 iavlStoreKey := types.NewStoreKey("iavlStoreKey") 69 70 store.MountStoreWithDB(iavlStoreKey, iavl.StoreConstructor, nil) 71 store.LoadVersion(0) 72 73 iavlStore := store.GetCommitStore(iavlStoreKey).(*iavl.Store) 74 iavlStore.Set([]byte("MYKEY"), []byte("MYVALUE")) 75 cid := store.Commit() 76 77 // Get Proof 78 res := store.Query(abci.RequestQuery{ 79 Path: "/iavlStoreKey/key", // required path to get key/value+proof 80 Data: []byte("MYKEY"), 81 Prove: true, 82 }) 83 require.NotNil(t, res.Proof) 84 85 // Verify proof. 86 prt := DefaultProofRuntime() 87 err := prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE")) 88 require.Nil(t, err) 89 90 // Verify proof. 91 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE")) 92 require.Nil(t, err) 93 94 // Verify (bad) proof. 95 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY_NOT", []byte("MYVALUE")) 96 require.NotNil(t, err) 97 98 // Verify (bad) proof. 99 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY/MYKEY", []byte("MYVALUE")) 100 require.NotNil(t, err) 101 102 // Verify (bad) proof. 103 err = prt.VerifyValue(res.Proof, cid.Hash, "iavlStoreKey/MYKEY", []byte("MYVALUE")) 104 require.NotNil(t, err) 105 106 // Verify (bad) proof. 107 err = prt.VerifyValue(res.Proof, cid.Hash, "/MYKEY", []byte("MYVALUE")) 108 require.NotNil(t, err) 109 110 // Verify (bad) proof. 111 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE_NOT")) 112 require.NotNil(t, err) 113 114 // Verify (bad) proof. 115 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte(nil)) 116 require.NotNil(t, err) 117 } 118 119 func TestVerifyMultiStoreQueryProofEmptyStore(t *testing.T) { 120 t.Parallel() 121 122 // Create main tree for testing. 123 db := memdb.NewMemDB() 124 store := NewMultiStore(db) 125 iavlStoreKey := types.NewStoreKey("iavlStoreKey") 126 127 store.MountStoreWithDB(iavlStoreKey, iavl.StoreConstructor, nil) 128 store.LoadVersion(0) 129 cid := store.Commit() // Commit with empty iavl store. 130 131 // Get Proof 132 res := store.Query(abci.RequestQuery{ 133 Path: "/iavlStoreKey/key", // required path to get key/value+proof 134 Data: []byte("MYKEY"), 135 Prove: true, 136 }) 137 require.NotNil(t, res.Proof) 138 139 // Verify proof. 140 prt := DefaultProofRuntime() 141 err := prt.VerifyAbsence(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY") 142 require.Nil(t, err) 143 144 // Verify (bad) proof. 145 prt = DefaultProofRuntime() 146 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE")) 147 require.NotNil(t, err) 148 } 149 150 func TestVerifyMultiStoreQueryProofAbsence(t *testing.T) { 151 t.Parallel() 152 153 // Create main tree for testing. 154 db := memdb.NewMemDB() 155 store := NewMultiStore(db) 156 iavlStoreKey := types.NewStoreKey("iavlStoreKey") 157 158 store.MountStoreWithDB(iavlStoreKey, iavl.StoreConstructor, nil) 159 store.LoadVersion(0) 160 161 iavlStore := store.GetCommitStore(iavlStoreKey).(*iavl.Store) 162 iavlStore.Set([]byte("MYKEY"), []byte("MYVALUE")) 163 cid := store.Commit() // Commit with empty iavl store. 164 165 // Get Proof 166 res := store.Query(abci.RequestQuery{ 167 Path: "/iavlStoreKey/key", // required path to get key/value+proof 168 Data: []byte("MYABSENTKEY"), 169 Prove: true, 170 }) 171 require.NotNil(t, res.Proof) 172 173 // Verify proof. 174 prt := DefaultProofRuntime() 175 err := prt.VerifyAbsence(res.Proof, cid.Hash, "/iavlStoreKey/MYABSENTKEY") 176 require.Nil(t, err) 177 178 // Verify (bad) proof. 179 prt = DefaultProofRuntime() 180 err = prt.VerifyAbsence(res.Proof, cid.Hash, "/MYABSENTKEY") 181 require.NotNil(t, err) 182 183 // Verify (bad) proof. 184 prt = DefaultProofRuntime() 185 err = prt.VerifyValue(res.Proof, cid.Hash, "/iavlStoreKey/MYABSENTKEY", []byte("")) 186 require.NotNil(t, err) 187 }