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  }