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