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  }