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