github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/iavl/doc.go (about)

     1  // Package iavl implements a versioned, snapshottable (immutable) AVL+ tree
     2  // for persisting key-value pairs.
     3  //
     4  // Basic usage of MutableTree.
     5  //
     6  //	import "github.com/tendermint/classic/iavl"
     7  //	import "github.com/tendermint/classic/db"
     8  //	...
     9  //
    10  //	tree := iavl.NewMutableTree(memdb.NewMemDB(), 128)
    11  //
    12  //	tree.IsEmpty() // true
    13  //
    14  //	tree.Set([]byte("alice"), []byte("abc"))
    15  //	tree.SaveVersion(1)
    16  //
    17  //	tree.Set([]byte("alice"), []byte("xyz"))
    18  //	tree.Set([]byte("bob"), []byte("xyz"))
    19  //	tree.SaveVersion(2)
    20  //
    21  //	tree.LatestVersion() // 2
    22  //
    23  //	tree.GetVersioned([]byte("alice"), 1) // "abc"
    24  //	tree.GetVersioned([]byte("alice"), 2) // "xyz"
    25  //
    26  // Proof of existence:
    27  //
    28  //	root := tree.Hash()
    29  //	val, proof, err := tree.GetVersionedWithProof([]byte("bob"), 2) // "xyz", RangeProof, nil
    30  //	proof.Verify([]byte("bob"), val, root) // nil
    31  //
    32  // Proof of absence:
    33  //
    34  //	_, proof, err = tree.GetVersionedWithProof([]byte("tom"), 2) // nil, RangeProof, nil
    35  //	proof.Verify([]byte("tom"), nil, root) // nil
    36  //
    37  // Now we delete an old version:
    38  //
    39  //	tree.DeleteVersion(1)
    40  //	tree.VersionExists(1) // false
    41  //	tree.Get([]byte("alice")) // "xyz"
    42  //	tree.GetVersioned([]byte("alice"), 1) // nil
    43  //
    44  // Can't create a proof of absence for a version we no longer have:
    45  //
    46  //	_, proof, err = tree.GetVersionedWithProof([]byte("tom"), 1) // nil, nil, error
    47  package iavl