github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/iavl/doc.go (about) 1 // Package iavl implements a versioned, snapshottable (immutable) AVL+ tree 2 // for persisting key-value pairs. 3 // 4 // The tree is not safe for concurrent use, and must be guarded by a Mutex 5 // or RWLock as appropriate - the exception is immutable trees returned by 6 // MutableTree.GetImmutable() which are safe for concurrent use as long as 7 // the version is not deleted via DeleteVersion(). 8 // 9 // Basic usage of MutableTree: 10 // 11 // import "github.com/fibonacci-chain/fbc/libs/iavl" 12 // import "github.com/fibonacci-chain/fbc/libs/tm-db" 13 // ... 14 // 15 // tree := iavl.NewMutableTree(db.NewMemDB(), 128) 16 // 17 // tree.IsEmpty() // true 18 // 19 // tree.Set([]byte("alice"), []byte("abc")) 20 // tree.SaveVersion(1) 21 // 22 // tree.Set([]byte("alice"), []byte("xyz")) 23 // tree.Set([]byte("bob"), []byte("xyz")) 24 // tree.SaveVersion(2) 25 // 26 // tree.LatestVersion() // 2 27 // 28 // tree.GetVersioned([]byte("alice"), 1) // "abc" 29 // tree.GetVersioned([]byte("alice"), 2) // "xyz" 30 // 31 // Proof of existence: 32 // 33 // root := tree.Hash() 34 // val, proof, err := tree.GetVersionedWithProof([]byte("bob"), 2) // "xyz", RangeProof, nil 35 // proof.Verify([]byte("bob"), val, root) // nil 36 // 37 // Proof of absence: 38 // 39 // _, proof, err = tree.GetVersionedWithProof([]byte("tom"), 2) // nil, RangeProof, nil 40 // proof.Verify([]byte("tom"), nil, root) // nil 41 // 42 // Now we delete an old version: 43 // 44 // tree.DeleteVersion(1) 45 // tree.VersionExists(1) // false 46 // tree.Get([]byte("alice")) // "xyz" 47 // tree.GetVersioned([]byte("alice"), 1) // nil 48 // 49 // Can't create a proof of absence for a version we no longer have: 50 // 51 // _, proof, err = tree.GetVersionedWithProof([]byte("tom"), 1) // nil, nil, error 52 package iavl