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  }