database

package
v1.1.0-rc.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 25, 2023 License: MIT Imports: 31 Imported by: 0

Documentation

Overview

For key value stores where buckets are not supported, we add a byte to the key to represent a bucket. For now, all buckets are hard coded, but we could change that in the future.

Buckets are not really enough to index everything we wish to index. So we have labels as well. Labels are shifted 8 bits left, so they can be combined with the buckets to create a unique key.

This allows us to put the raw directory block at DBlockBucket+L_raw, and meta data about the directory block at DBlockBucket+MetaLabel

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetReceipt added in v1.1.0

func GetReceipt(manager *MerkleManager, element Hash, anchor Hash) (r *merkle.Receipt, err error)

GetReceipt Given a merkle tree and two elements, produce a proof that the element was used to derive the DAG at the anchor Note that the element must be added to the Merkle Tree before the anchor, but the anchor can be any element after the element, or even the element itself.

func GetSha256 added in v1.1.0

func GetSha256() func(data []byte) Hash

GetSha256 Get the a Sha256 function that can be used to create hashes compatible with a Stateful Merkle tree using sha256

func GetSignaturesForSigner added in v1.0.0

func GetSignaturesForSigner(transaction *Transaction, signer protocol.Signer) ([]protocol.Signature, error)

func UpdateAccount added in v1.0.0

func UpdateAccount[T protocol.Account](batch *Batch, url *url.URL, fn func(T) error) (T, error)

Types

type Account

type Account struct {
	// contains filtered or unexported fields
}

func (*Account) AddPending added in v1.0.0

func (r *Account) AddPending(txid *url.TxID) error

func (*Account) AddSyntheticForAnchor added in v0.6.0

func (r *Account) AddSyntheticForAnchor(anchor [32]byte, txid *url.TxID) error

func (*Account) AnchorChain added in v1.0.0

func (c *Account) AnchorChain(partition string) *AccountAnchorChain

func (*Account) AnchorSequenceChain added in v1.0.0

func (c *Account) AnchorSequenceChain() *Chain2

func (*Account) BptReceipt added in v1.0.0

func (a *Account) BptReceipt() (*merkle.Receipt, error)

BptReceipt builds a BPT receipt for the account.

func (*Account) ChainByName added in v1.0.0

func (a *Account) ChainByName(name string) (*Chain2, error)

ChainByName returns account Chain2 for the named chain, or a not found error if there is no such chain.

func (*Account) Chains added in v1.0.0

func (c *Account) Chains() record.Set[*protocol.ChainMetadata]

func (*Account) Commit added in v1.0.0

func (a *Account) Commit() error

func (*Account) Data

func (c *Account) Data() *AccountData

func (*Account) Directory added in v1.0.0

func (c *Account) Directory() record.Set[*url.URL]

func (*Account) GetChainByName added in v1.0.0

func (a *Account) GetChainByName(name string) (*Chain, error)

GetChainByName calls ChainByName and Get.

func (*Account) GetIndexChainByName added in v1.0.0

func (a *Account) GetIndexChainByName(name string) (*Chain, error)

GetChainByName calls ChainByName, Index, and Get.

func (*Account) GetPending added in v1.0.0

func (r *Account) GetPending() (*protocol.TxIdSet, error)

func (*Account) GetState

func (r *Account) GetState() (protocol.Account, error)

GetState loads the record state.

func (*Account) GetStateAs

func (r *Account) GetStateAs(state interface{}) error

GetStateAs loads the record state and unmarshals into the given value. In most cases `state` should be a double pointer.

func (*Account) GetSyntheticForAnchor added in v1.0.0

func (r *Account) GetSyntheticForAnchor(anchor [32]byte) ([]*url.TxID, error)

func (*Account) Hash added in v1.1.0

func (a *Account) Hash() ([32]byte, error)

Hash retrieves or calculates the state hash of the account.

func (*Account) IsDirty added in v1.0.0

func (c *Account) IsDirty() bool

func (*Account) Main added in v1.0.0

func (c *Account) Main() record.Value[protocol.Account]

func (*Account) MainChain added in v1.0.0

func (c *Account) MainChain() *Chain2

func (*Account) MajorBlockChain added in v1.0.0

func (c *Account) MajorBlockChain() *Chain2

func (*Account) Pending added in v1.0.0

func (c *Account) Pending() record.Set[*url.TxID]

func (*Account) PutState

func (r *Account) PutState(state protocol.Account) error

PutState stores the record state.

func (*Account) RemovePending added in v1.0.0

func (r *Account) RemovePending(txid *url.TxID) error

func (*Account) Resolve added in v1.0.0

func (c *Account) Resolve(key record.Key) (record.Record, record.Key, error)

func (*Account) RootChain added in v1.0.0

func (c *Account) RootChain() *Chain2

func (*Account) ScratchChain added in v1.0.0

func (c *Account) ScratchChain() *Chain2

func (*Account) SignatureChain added in v1.0.0

func (c *Account) SignatureChain() *Chain2

func (*Account) StateReceipt added in v0.5.1

func (a *Account) StateReceipt() (*merkle.Receipt, error)

StateReceipt returns a Merkle receipt for the account state in the BPT.

func (*Account) SyntheticAnchors added in v1.0.0

func (c *Account) SyntheticAnchors() record.Set[[32]byte]

func (*Account) SyntheticForAnchor added in v0.6.0

func (c *Account) SyntheticForAnchor(anchor [32]byte) record.Set[*url.TxID]

func (*Account) SyntheticSequenceChain added in v1.0.0

func (c *Account) SyntheticSequenceChain(partition string) *Chain2

func (*Account) Transaction added in v1.1.0

func (c *Account) Transaction(hash [32]byte) *AccountTransaction

func (*Account) UpdatedChains added in v1.0.2

func (a *Account) UpdatedChains() ([]*protocol.BlockEntry, error)

UpdatedChains returns a block entry for every chain updated in the current database batch.

func (*Account) Url added in v1.0.0

func (r *Account) Url() *url.URL

func (*Account) VerifyHash added in v1.0.0

func (a *Account) VerifyHash(hash []byte) error

func (*Account) WalkChanges added in v1.1.0

func (c *Account) WalkChanges(fn record.WalkFunc) error

type AccountAnchorChain added in v1.0.0

type AccountAnchorChain struct {
	// contains filtered or unexported fields
}

func (*AccountAnchorChain) BPT added in v1.0.0

func (c *AccountAnchorChain) BPT() *Chain2

func (*AccountAnchorChain) Commit added in v1.0.0

func (c *AccountAnchorChain) Commit() error

func (*AccountAnchorChain) IsDirty added in v1.0.0

func (c *AccountAnchorChain) IsDirty() bool

func (*AccountAnchorChain) Resolve added in v1.0.0

func (c *AccountAnchorChain) Resolve(key record.Key) (record.Record, record.Key, error)

func (*AccountAnchorChain) Root added in v1.0.0

func (c *AccountAnchorChain) Root() *Chain2

func (*AccountAnchorChain) WalkChanges added in v1.1.0

func (c *AccountAnchorChain) WalkChanges(fn record.WalkFunc) error

type AccountData added in v1.0.0

type AccountData struct {
	// contains filtered or unexported fields
}

func (*AccountData) Commit added in v1.0.0

func (c *AccountData) Commit() error

func (*AccountData) Entry added in v1.0.0

func (c *AccountData) Entry() record.Counted[[32]byte]

func (*AccountData) IsDirty added in v1.0.0

func (c *AccountData) IsDirty() bool

func (*AccountData) Resolve added in v1.0.0

func (c *AccountData) Resolve(key record.Key) (record.Record, record.Key, error)

func (*AccountData) Transaction added in v1.0.0

func (c *AccountData) Transaction(entryHash [32]byte) record.Value[[32]byte]

func (*AccountData) WalkChanges added in v1.1.0

func (c *AccountData) WalkChanges(fn record.WalkFunc) error

type AccountTransaction added in v1.1.0

type AccountTransaction struct {
	// contains filtered or unexported fields
}

func (*AccountTransaction) Commit added in v1.1.0

func (c *AccountTransaction) Commit() error

func (*AccountTransaction) History added in v1.1.0

func (c *AccountTransaction) History() record.Set[uint64]

func (*AccountTransaction) IsDirty added in v1.1.0

func (c *AccountTransaction) IsDirty() bool

func (*AccountTransaction) Payments added in v1.1.0

func (c *AccountTransaction) Payments() record.Set[[32]byte]

func (*AccountTransaction) RecordHistory added in v1.1.0

func (c *AccountTransaction) RecordHistory(msg messaging.Message) error

RecordHistory adds the message to the signature chain and history.

func (*AccountTransaction) Resolve added in v1.1.0

func (c *AccountTransaction) Resolve(key record.Key) (record.Record, record.Key, error)

func (*AccountTransaction) Signatures added in v1.1.0

func (c *AccountTransaction) Signatures() record.Set[*SignatureSetEntry]

func (*AccountTransaction) ValidatorSignatures added in v1.1.0

func (c *AccountTransaction) ValidatorSignatures() record.Set[protocol.KeySignature]

func (*AccountTransaction) Votes added in v1.1.0

func (c *AccountTransaction) Votes() record.Set[*VoteEntry]

func (*AccountTransaction) WalkChanges added in v1.1.0

func (c *AccountTransaction) WalkChanges(fn record.WalkFunc) error

type Batch

type Batch struct {
	// contains filtered or unexported fields
}

func NewBatch added in v1.1.0

func NewBatch(id string, store storage.KeyValueTxn, writable bool, logger log.Logger) *Batch

func (*Batch) Account

func (b *Batch) Account(u *url.URL) *Account

func (*Batch) AccountByID deprecated

func (b *Batch) AccountByID(id []byte) (*Account, error)

AccountByID returns an Account for the given ID.

This is still needed in one place, so the deprecation warning is disabled in order to pass static analysis.

Deprecated: Use Account.

func (*Batch) AccountTransaction added in v1.1.0

func (b *Batch) AccountTransaction(id *url.TxID) *AccountTransaction

func (*Batch) Begin added in v0.5.1

func (b *Batch) Begin(writable bool) *Batch

func (*Batch) BptReceipt added in v0.5.1

func (b *Batch) BptReceipt(key storage.Key, value [32]byte) (*merkle.Receipt, error)

BptReceipt builds a BPT receipt for the given key.

func (*Batch) BptRoot added in v1.0.0

func (b *Batch) BptRoot() []byte

BptRoot returns the root of the BPT. BptRoot panics if there are any uncommitted BPT changes.

func (*Batch) Commit

func (b *Batch) Commit() error

Commit commits pending writes to the key-value store or the parent batch. Attempting to use the Batch after calling Commit or Discard will result in a panic.

func (*Batch) DeleteAccountState_TESTONLY added in v1.0.0

func (b *Batch) DeleteAccountState_TESTONLY(url *url.URL) error

DeleteAccountState_TESTONLY is intended for testing purposes only. It deletes an account from the database.

func (*Batch) Discard

func (b *Batch) Discard()

Discard discards pending writes. Attempting to use the Batch after calling Discard will result in a panic.

func (*Batch) ForEachAccount added in v1.1.0

func (b *Batch) ForEachAccount(fn func(account *Account, hash [32]byte) error) error

func (*Batch) GetMinorRootChainAnchor added in v0.5.1

func (b *Batch) GetMinorRootChainAnchor(describe *config.Describe) ([]byte, error)

func (*Batch) GetValue added in v1.0.0

func (b *Batch) GetValue(key record.Key, value record.ValueWriter) error

GetValue implements record.Store.

func (*Batch) Import

func (b *Batch) Import(db interface{ Export() map[storage.Key][]byte }) error

Import imports values from another database.

func (*Batch) IsDirty added in v1.0.0

func (c *Batch) IsDirty() bool

func (*Batch) Message added in v1.1.0

func (c *Batch) Message(hash [32]byte) *Message

func (*Batch) Message2 added in v1.1.0

func (b *Batch) Message2(hash []byte) *Message

func (*Batch) PutValue added in v1.0.0

func (b *Batch) PutValue(key record.Key, value record.ValueReader) error

PutValue implements record.Store.

func (*Batch) Resolve added in v1.0.0

func (c *Batch) Resolve(key record.Key) (record.Record, record.Key, error)

func (*Batch) SaveAccounts added in v1.0.0

func (b *Batch) SaveAccounts(file io.WriteSeeker, collect func(*Account) ([]byte, error)) error

func (*Batch) SetObserver added in v1.1.0

func (b *Batch) SetObserver(observer Observer)

SetObserver sets the database observer.

func (*Batch) SystemData added in v1.0.0

func (c *Batch) SystemData(partition string) *SystemData

func (*Batch) Transaction

func (b *Batch) Transaction(id []byte) *Transaction

Transaction returns an Transaction for the given hash.

func (*Batch) Transaction2 added in v1.1.0

func (b *Batch) Transaction2(id [32]byte) *Transaction

func (*Batch) Update added in v0.5.1

func (b *Batch) Update(fn func(batch *Batch) error) error

Update runs the function with a writable transaction and commits if the function succeeds.

func (*Batch) UpdatedAccounts added in v1.0.2

func (b *Batch) UpdatedAccounts() []*Account

UpdatedAccounts returns every account updated in this database batch.

func (*Batch) View added in v0.5.1

func (b *Batch) View(fn func(batch *Batch) error) error

View runs the function with a read-only transaction.

func (*Batch) VisitAccounts added in v1.0.0

func (b *Batch) VisitAccounts(visit func(*Account) error) error

func (*Batch) WalkChanges added in v1.1.0

func (c *Batch) WalkChanges(fn record.WalkFunc) error

type Beginner added in v1.0.0

type Beginner interface {
	Updater
	Begin(bool) *Batch
	SetObserver(Observer)
}

A Beginner can be a Database or a Batch

type BlockStateSynthTxnEntry added in v1.0.0

type BlockStateSynthTxnEntry struct {
	Account     *url.URL `json:"account,omitempty" form:"account" query:"account" validate:"required"`
	Transaction []byte   `json:"transaction,omitempty" form:"transaction" query:"transaction" validate:"required"`
	ChainEntry  uint64   `json:"chainEntry,omitempty" form:"chainEntry" query:"chainEntry" validate:"required"`
	// contains filtered or unexported fields
}

func (*BlockStateSynthTxnEntry) Compare added in v1.0.0

func (*BlockStateSynthTxnEntry) Copy added in v1.0.0

func (*BlockStateSynthTxnEntry) CopyAsInterface added in v1.0.0

func (v *BlockStateSynthTxnEntry) CopyAsInterface() interface{}

func (*BlockStateSynthTxnEntry) Equal added in v1.0.0

func (*BlockStateSynthTxnEntry) IsValid added in v1.0.0

func (v *BlockStateSynthTxnEntry) IsValid() error

func (*BlockStateSynthTxnEntry) MarshalBinary added in v1.0.0

func (v *BlockStateSynthTxnEntry) MarshalBinary() ([]byte, error)

func (*BlockStateSynthTxnEntry) MarshalJSON added in v1.0.0

func (v *BlockStateSynthTxnEntry) MarshalJSON() ([]byte, error)

func (*BlockStateSynthTxnEntry) UnmarshalBinary added in v1.0.0

func (v *BlockStateSynthTxnEntry) UnmarshalBinary(data []byte) error

func (*BlockStateSynthTxnEntry) UnmarshalBinaryFrom added in v1.0.0

func (v *BlockStateSynthTxnEntry) UnmarshalBinaryFrom(rd io.Reader) error

func (*BlockStateSynthTxnEntry) UnmarshalJSON added in v1.0.0

func (v *BlockStateSynthTxnEntry) UnmarshalJSON(data []byte) error

type Chain

type Chain struct {
	// contains filtered or unexported fields
}

Chain manages a Merkle tree (chain).

func (*Chain) AddEntry

func (c *Chain) AddEntry(entry []byte, unique bool) error

AddEntry adds an entry to the chain

func (*Chain) Anchor

func (c *Chain) Anchor() []byte

Anchor calculates the anchor of the current Merkle state.

func (*Chain) AnchorAt added in v0.5.1

func (c *Chain) AnchorAt(height uint64) ([]byte, error)

AnchorAt calculates the anchor of the chain at the given height.

func (*Chain) CurrentState added in v0.5.1

func (c *Chain) CurrentState() *MerkleState

CurrentState returns the current state of the chain.

func (*Chain) Entries

func (c *Chain) Entries(start int64, end int64) ([][]byte, error)

Entries returns entries in the given range.

func (*Chain) Entry

func (c *Chain) Entry(height int64) ([]byte, error)

Entry loads the entry in the chain at the given height.

func (*Chain) EntryAs added in v0.5.1

func (c *Chain) EntryAs(height int64, value encoding.BinaryUnmarshaler) error

EntryAs loads and unmarshals the entry in the chain at the given height.

func (*Chain) Height

func (c *Chain) Height() int64

Height returns the height of the chain.

func (*Chain) HeightOf

func (c *Chain) HeightOf(hash []byte) (int64, error)

HeightOf returns the height of the given entry in the chain.

func (*Chain) Pending

func (c *Chain) Pending() [][]byte

Pending returns the pending roots of the current Merkle state.

func (*Chain) Receipt

func (c *Chain) Receipt(from, to int64) (*merkle.Receipt, error)

Receipt builds a receipt from one index to another

func (*Chain) State

func (c *Chain) State(height int64) (*MerkleState, error)

State returns the state of the chain at the given height.

type Chain2 added in v1.0.0

type Chain2 struct {
	// contains filtered or unexported fields
}

Chain2 is a wrapper for Chain.

func (*Chain2) Account added in v1.0.0

func (c *Chain2) Account() *url.URL

Account returns the URL of the account.

func (*Chain2) Commit added in v1.0.0

func (c *Chain2) Commit() error

func (*Chain2) Entry added in v1.1.0

func (c *Chain2) Entry(height int64) ([]byte, error)

Entry loads the entry in the chain at the given height.

func (*Chain2) Get added in v1.0.0

func (c *Chain2) Get() (*Chain, error)

Get converts the Chain2 to a Chain, updating the account's chains index and loading the chain head.

func (*Chain2) Head added in v1.1.0

func (c *Chain2) Head() record.Value[*MerkleState]

func (*Chain2) Index added in v1.0.0

func (c *Chain2) Index() *Chain2

Index returns the index chain of this chain. Index will panic if called on an index chain.

func (*Chain2) IndexOf added in v1.1.0

func (c *Chain2) IndexOf(hash []byte) (int64, error)

IndexOf returns the index of the given entry in the chain.

func (*Chain2) Inner added in v1.0.0

func (c *Chain2) Inner() *MerkleManager

func (*Chain2) IsDirty added in v1.0.0

func (c *Chain2) IsDirty() bool

func (*Chain2) Key added in v1.0.0

func (c *Chain2) Key(i int) interface{}

Key returns the Ith key of the chain record.

func (*Chain2) Name added in v1.0.0

func (c *Chain2) Name() string

Name returns the name of the chain.

func (*Chain2) Resolve added in v1.0.0

func (c *Chain2) Resolve(key record.Key) (record.Record, record.Key, error)

func (*Chain2) Type added in v1.0.0

func (c *Chain2) Type() merkle.ChainType

Type returns the type of the chain.

func (*Chain2) Url added in v1.0.0

func (c *Chain2) Url() *url.URL

Url returns the URL of the chain: {account}#chain/{name}.

func (*Chain2) WalkChanges added in v1.1.0

func (c *Chain2) WalkChanges(fn record.WalkFunc) error

type Database

type Database struct {
	// contains filtered or unexported fields
}

Database is an Accumulate database.

func New

func New(store storage.KeyValueStore, logger log.Logger) *Database

New creates a new database using the given key-value store.

func Open

func Open(cfg *config.Config, logger log.Logger) (*Database, error)

Open opens a key-value store and creates a new database with it.

func OpenBadger added in v0.5.1

func OpenBadger(filepath string, logger log.Logger) (*Database, error)

func OpenInMemory added in v0.5.1

func OpenInMemory(logger log.Logger) *Database

func (*Database) Begin

func (d *Database) Begin(writable bool) *Batch

Begin starts a new batch.

func (*Database) Close

func (d *Database) Close() error

Close closes the database and the key-value store.

func (*Database) SetObserver added in v1.1.0

func (d *Database) SetObserver(observer Observer)

SetObserver sets the database observer.

func (*Database) Update added in v0.5.1

func (d *Database) Update(fn func(batch *Batch) error) error

Update runs the function with a writable transaction and commits if the function succeeds.

func (*Database) View added in v0.5.1

func (d *Database) View(fn func(batch *Batch) error) error

View runs the function with a read-only transaction.

type Hash added in v1.1.0

type Hash []byte

This Stateful Merkle Tree implementation handles 256 bit hashes

func Sha256 added in v1.1.0

func Sha256(b []byte) Hash

func (Hash) BinarySize added in v1.1.0

func (h Hash) BinarySize() int

func (Hash) Bytes added in v1.1.0

func (h Hash) Bytes() []byte

func (Hash) Bytes32 added in v1.1.0

func (h Hash) Bytes32() [32]byte

func (Hash) Combine added in v1.1.0

func (h Hash) Combine(hf HashFunc, right Hash) Hash

Combine Hash this hash (the left hash) with the given right hash to produce a new hash

func (Hash) Copy added in v1.1.0

func (h Hash) Copy() Hash

Copy Make a copy of a Hash (so the caller cannot modify the original version)

func (Hash) Equal added in v1.1.0

func (h Hash) Equal(g Hash) bool

func (Hash) MarshalBinary added in v1.1.0

func (h Hash) MarshalBinary() ([]byte, error)

func (*Hash) UnmarhsalBinary added in v1.1.0

func (h *Hash) UnmarhsalBinary(b []byte) error

type HashFunc added in v1.1.0

type HashFunc func([]byte) Hash

type HashList added in v1.1.0

type HashList [][]byte

func (HashList) BinarySize added in v1.1.0

func (l HashList) BinarySize() int

func (HashList) MarshalBinary added in v1.1.0

func (l HashList) MarshalBinary() ([]byte, error)

func (*HashList) UnmarhsalBinary added in v1.1.0

func (l *HashList) UnmarhsalBinary(b []byte) error

type MerkleManager added in v1.1.0

type MerkleManager struct {
	// contains filtered or unexported fields
}

func NewChain added in v1.1.0

func NewChain(logger log.Logger, store record.Store, key record.Key, markPower int64, typ merkle.ChainType, namefmt, labelfmt string) *MerkleManager

func (*MerkleManager) AddHash added in v1.1.0

func (m *MerkleManager) AddHash(hash Hash, unique bool) error

AddHash adds a Hash to the Chain controlled by the ChainManager. If unique is true, the hash will not be added if it is already in the chain.

func (*MerkleManager) BuildReceipt added in v1.1.0

func (m *MerkleManager) BuildReceipt(r *merkle.Receipt) error

BuildReceipt takes the values collected by GetReceipt and flushes out the data structures in the receipt to represent a fully populated version.

func (*MerkleManager) Commit added in v1.1.0

func (c *MerkleManager) Commit() error

func (*MerkleManager) Element added in v1.1.0

func (c *MerkleManager) Element(index uint64) record.Value[[]byte]

func (*MerkleManager) ElementIndex added in v1.1.0

func (c *MerkleManager) ElementIndex(hash []byte) record.Value[uint64]

func (*MerkleManager) Get added in v1.1.0

func (m *MerkleManager) Get(element int64) (Hash, error)

Get the nth leaf node

func (*MerkleManager) GetAnyState added in v1.1.0

func (m *MerkleManager) GetAnyState(element int64) (ms *MerkleState, err error)

GetAnyState We only store the state at MarkPoints. This function computes a missing state even if one isn't stored for a particular element.

func (*MerkleManager) GetElementIndex added in v1.1.0

func (m *MerkleManager) GetElementIndex(hash []byte) (int64, error)

GetElementIndex Get an Element of a Merkle Tree from the database

func (*MerkleManager) GetIntermediate added in v1.1.0

func (m *MerkleManager) GetIntermediate(element, height int64) (Left, Right Hash, err error)

GetIntermediate Return the last two hashes that were combined to create the local Merkle Root at the given index. The element provided must be odd, and the Pending List must be fully populated up to height specified.

func (*MerkleManager) GetRange added in v1.1.0

func (m *MerkleManager) GetRange(begin, end int64) ([][]byte, error)

GetRange returns the list of hashes with indexes indicated by range: (begin,end) begin must be before or equal to end. The hash with index begin upto but not including end are the hashes returned. Indexes are zero based, so the first hash in the MerkleState is at 0

func (*MerkleManager) GetState added in v1.1.0

func (m *MerkleManager) GetState(element int64) *MerkleState

GetState Query the database for the MerkleState for a given index, i.e. the state Note that not every element in the Merkle Tree has a stored state; states are stored at the frequency indicated by the Mark Power. We also store the state of the chain at the end of a block regardless, but this state overwrites the previous block state.

If no state exists in the database for the element, GetState returns nil

func (*MerkleManager) Head added in v1.1.0

func (c *MerkleManager) Head() record.Value[*MerkleState]

func (*MerkleManager) IsDirty added in v1.1.0

func (c *MerkleManager) IsDirty() bool

func (*MerkleManager) MarkFreq added in v1.1.0

func (c *MerkleManager) MarkFreq() int64

func (*MerkleManager) MarkMask added in v1.1.0

func (c *MerkleManager) MarkMask() int64

func (*MerkleManager) MarkPower added in v1.1.0

func (c *MerkleManager) MarkPower() int64

func (*MerkleManager) Name added in v1.1.0

func (c *MerkleManager) Name() string

func (*MerkleManager) Resolve added in v1.1.0

func (c *MerkleManager) Resolve(key record.Key) (record.Record, record.Key, error)

func (*MerkleManager) States added in v1.1.0

func (c *MerkleManager) States(index uint64) record.Value[*MerkleState]

func (*MerkleManager) Type added in v1.1.0

func (c *MerkleManager) Type() merkle.ChainType

func (*MerkleManager) WalkChanges added in v1.1.0

func (c *MerkleManager) WalkChanges(fn record.WalkFunc) error

type MerkleState added in v1.1.0

type MerkleState struct {
	merkle.State
}

MerkleState A Merkle Dag State is the state kept while building a Merkle Tree. Except where a Merkle Tree has a clean power of two number of elements as leaf nodes, there will be multiple Sub Merkle Trees that make up a dynamic Merkle Tree. The Merkle State is the list of the roots of these sub Merkle Trees, and the combination of these roots provides a Directed Acyclic Graph (DAG) to all the leaves.

                                                     Merkle State
1  2   3  4   5  6   7  8   9 10  11 12  13 --->         13
 1-2    3-4    5-6    7-8   0-10  11-12     --->         --
    1-2-3-4       5-6-7-8    0-10-11-12     --->     0-10-11-12
          1-2-3-4-5-6-7-8                   --->   1-2-3-4-5-6-7-8

Interestingly, the state of building such a Merkle Tree looks just like counting in binary. And the higher order bits set will correspond to where the binary roots must be kept in a Merkle state.

func (*MerkleState) AddToMerkleTree added in v1.1.0

func (m *MerkleState) AddToMerkleTree(hash_ []byte)

AddToMerkleTree Add a Hash to the merkle tree and incrementally build the MerkleState

func (*MerkleState) Copy added in v1.1.0

func (m *MerkleState) Copy() *MerkleState

Copy Make a completely independent copy of the Merkle State that removes all references to the structures in the given Merkle State. This means copying any entries in the Pending slice

func (*MerkleState) CopyAsInterface added in v1.1.0

func (m *MerkleState) CopyAsInterface() interface{}

func (*MerkleState) Equal added in v1.1.0

func (m *MerkleState) Equal(n *MerkleState) bool

Equal Compares one MerkleState to another, and returns true if they are the same

func (*MerkleState) GetIntermediate added in v1.1.0

func (m *MerkleState) GetIntermediate(hash Hash, height int64) (left, right Hash, err error)

GetIntermediate returns the last two hashes that were combined to create the local Merkle Root at the given index. The element Pending List must be fully populated up to height specified.

func (*MerkleState) GetMDRoot added in v1.1.0

func (m *MerkleState) GetMDRoot() (MDRoot Hash)

GetMDRoot Compute the Merkle Directed Acyclic Graph (Merkle DAG or MerkleState) for the MerkleState at this point We take any trailing hashes in MerkleState, hash them up and combine to create the Merkle Dag Root. Getting the closing ListMDRoot is non-destructive, which is useful for some use cases.

Returns a nil if the MerkleSate is empty.

func (*MerkleState) InitSha256 added in v1.1.0

func (m *MerkleState) InitSha256()

InitSha256 Set the hashing function of this Merkle State to Sha256 TODO: Actually update the library to be able to use various hash algorithms

func (*MerkleState) PrintMR added in v1.1.0

func (m *MerkleState) PrintMR() (mr string)

PrintMR For debugging purposes, it is nice to get a string that shows the nil and non nil entries in c.MerkleState Note that the "low order" entries are first in the string, so the binary is going from low order on the left to high order going right in the string rather than how binary is normally represented.

func (MerkleState) String added in v1.1.0

func (m MerkleState) String() string

String convert the MerkleState to a human readable string

func (*MerkleState) UnMarshal added in v1.1.0

func (m *MerkleState) UnMarshal(MSBytes []byte) (err error)

UnMarshal Take the state of an MSMarshal instance defined by MSBytes, and set all the values in this instance of MSMarshal to the state defined by MSBytes. It is assumed that the hash function has been set by the caller.

func (*MerkleState) UnmarshalBinary added in v1.1.0

func (m *MerkleState) UnmarshalBinary(data []byte) error

func (*MerkleState) UnmarshalBinaryFrom added in v1.1.0

func (m *MerkleState) UnmarshalBinaryFrom(rd io.Reader) error

type MerkleTestCase added in v1.1.0

type MerkleTestCase struct {
	Root    YamlHexString
	Entries []YamlHexString
	Cascade []YamlHexString
}

type Message added in v1.1.0

type Message struct {
	// contains filtered or unexported fields
}

func (*Message) Cause added in v1.1.0

func (c *Message) Cause() record.Set[*url.TxID]

func (*Message) Commit added in v1.1.0

func (c *Message) Commit() error

func (*Message) FindSigners added in v1.1.0

func (m *Message) FindSigners(u *url.URL) ([]*url.URL, error)

FindSigners return signers that are equal to or a child of the given URL. FindSigners only returns an error if the signer list cannot be retrieved. FindSigners returns nil, if no matching signers are found.

func (*Message) IsDirty added in v1.1.0

func (c *Message) IsDirty() bool

func (*Message) Main added in v1.1.0

func (m *Message) Main() record.Value[messaging.Message]

func (*Message) Produced added in v1.1.0

func (c *Message) Produced() record.Set[*url.TxID]

func (*Message) Resolve added in v1.1.0

func (c *Message) Resolve(key record.Key) (record.Record, record.Key, error)

func (*Message) Signers added in v1.1.0

func (c *Message) Signers() record.Set[*url.URL]

func (*Message) WalkChanges added in v1.1.0

func (c *Message) WalkChanges(fn record.WalkFunc) error

type Observer added in v1.1.0

type Observer interface {
	DidChangeAccount(batch *Batch, account *Account) (hash.Hasher, error)
}

type ReceiptList added in v1.1.0

type ReceiptList struct {

	// MerkleState MerkleState at the beginning of the list.
	MerkleState      *MerkleState    `json:"merkleState,omitempty" form:"merkleState" query:"merkleState" validate:"required"`
	Elements         [][]byte        `json:"elements,omitempty" form:"elements" query:"elements" validate:"required"`
	Receipt          *merkle.Receipt `json:"receipt,omitempty" form:"receipt" query:"receipt" validate:"required"`
	ContinuedReceipt *merkle.Receipt `json:"continuedReceipt,omitempty" form:"continuedReceipt" query:"continuedReceipt" validate:"required"`
	// contains filtered or unexported fields
}

func GetReceiptList added in v1.1.0

func GetReceiptList(manager *MerkleManager, Start int64, End int64) (r *ReceiptList, err error)

GetReceiptList Given a merkle tree with a start point and an end point, create a ReceiptList for all the elements from the start hash to the end hash, inclusive.

func NewReceiptList added in v1.1.0

func NewReceiptList() *ReceiptList

NewReceiptList Return a new ReceiptList with at least a MerkleState initialized

func (*ReceiptList) Copy added in v1.1.0

func (v *ReceiptList) Copy() *ReceiptList

func (*ReceiptList) CopyAsInterface added in v1.1.0

func (v *ReceiptList) CopyAsInterface() interface{}

func (*ReceiptList) Equal added in v1.1.0

func (v *ReceiptList) Equal(u *ReceiptList) bool

func (*ReceiptList) Included added in v1.1.0

func (r *ReceiptList) Included(entry []byte) bool

Included Tests an entry for inclusion in the given ReceiptList Note that while a ReceiptList proves inclusion in a Merkle Tree, and the fact that the list of elements proceed in order up to and including the anchor point, the ReceiptList does not necessarily prove the indices of the elements in the Merkle Tree. This could be solved by salting Receipts with the index of the hash at the anchor point.

func (*ReceiptList) IsValid added in v1.1.0

func (v *ReceiptList) IsValid() error

func (*ReceiptList) MarshalBinary added in v1.1.0

func (v *ReceiptList) MarshalBinary() ([]byte, error)

func (*ReceiptList) MarshalJSON added in v1.1.0

func (v *ReceiptList) MarshalJSON() ([]byte, error)

func (*ReceiptList) UnmarshalBinary added in v1.1.0

func (v *ReceiptList) UnmarshalBinary(data []byte) error

func (*ReceiptList) UnmarshalBinaryFrom added in v1.1.0

func (v *ReceiptList) UnmarshalBinaryFrom(rd io.Reader) error

func (*ReceiptList) UnmarshalJSON added in v1.1.0

func (v *ReceiptList) UnmarshalJSON(data []byte) error

func (*ReceiptList) Validate added in v1.1.0

func (r *ReceiptList) Validate(opts *merkle.ValidateOptions) bool

Validate Take a receipt and validate that the element hash progresses to the Merkle Dag Root hash (MDRoot) in the receipt

type SigOrTxn added in v0.6.0

type SigOrTxn struct {
	Transaction *protocol.Transaction `json:"transaction,omitempty" form:"transaction" query:"transaction" validate:"required"`
	Signature   protocol.Signature    `json:"signature,omitempty" form:"signature" query:"signature" validate:"required"`
	Txid        *url.TxID             `json:"txid,omitempty" form:"txid" query:"txid" validate:"required"`
	// contains filtered or unexported fields
}

func (*SigOrTxn) Copy added in v0.6.0

func (v *SigOrTxn) Copy() *SigOrTxn

func (*SigOrTxn) CopyAsInterface added in v0.6.0

func (v *SigOrTxn) CopyAsInterface() interface{}

func (*SigOrTxn) Equal added in v0.6.0

func (v *SigOrTxn) Equal(u *SigOrTxn) bool

func (*SigOrTxn) IsValid added in v0.6.0

func (v *SigOrTxn) IsValid() error

func (*SigOrTxn) MarshalBinary added in v0.6.0

func (v *SigOrTxn) MarshalBinary() ([]byte, error)

func (*SigOrTxn) MarshalJSON added in v0.6.0

func (v *SigOrTxn) MarshalJSON() ([]byte, error)

func (*SigOrTxn) UnmarshalBinary added in v0.6.0

func (v *SigOrTxn) UnmarshalBinary(data []byte) error

func (*SigOrTxn) UnmarshalBinaryFrom added in v0.6.0

func (v *SigOrTxn) UnmarshalBinaryFrom(rd io.Reader) error

func (*SigOrTxn) UnmarshalJSON added in v0.6.0

func (v *SigOrTxn) UnmarshalJSON(data []byte) error

type SigSetEntry added in v1.0.0

type SigSetEntry struct {
	Type             protocol.SignatureType `json:"type,omitempty" form:"type" query:"type" validate:"required"`
	KeyEntryIndex    uint64                 `json:"keyEntryIndex,omitempty" form:"keyEntryIndex" query:"keyEntryIndex" validate:"required"`
	SignatureHash    [32]byte               `json:"signatureHash,omitempty" form:"signatureHash" query:"signatureHash" validate:"required"`
	ValidatorKeyHash *[32]byte              `json:"validatorKeyHash,omitempty" form:"validatorKeyHash" query:"validatorKeyHash" validate:"required"`
	// contains filtered or unexported fields
}

func (*SigSetEntry) Compare added in v1.0.0

func (s *SigSetEntry) Compare(t *SigSetEntry) int

func (*SigSetEntry) Copy added in v1.0.0

func (v *SigSetEntry) Copy() *SigSetEntry

func (*SigSetEntry) CopyAsInterface added in v1.0.0

func (v *SigSetEntry) CopyAsInterface() interface{}

func (*SigSetEntry) Equal added in v1.0.0

func (v *SigSetEntry) Equal(u *SigSetEntry) bool

func (*SigSetEntry) IsValid added in v1.0.0

func (v *SigSetEntry) IsValid() error

func (*SigSetEntry) MarshalBinary added in v1.0.0

func (v *SigSetEntry) MarshalBinary() ([]byte, error)

func (*SigSetEntry) MarshalJSON added in v1.0.0

func (v *SigSetEntry) MarshalJSON() ([]byte, error)

func (*SigSetEntry) UnmarshalBinary added in v1.0.0

func (v *SigSetEntry) UnmarshalBinary(data []byte) error

func (*SigSetEntry) UnmarshalBinaryFrom added in v1.0.0

func (v *SigSetEntry) UnmarshalBinaryFrom(rd io.Reader) error

func (*SigSetEntry) UnmarshalJSON added in v1.0.0

func (v *SigSetEntry) UnmarshalJSON(data []byte) error

type SignatureSet added in v0.5.1

type SignatureSet struct {
	// contains filtered or unexported fields
}

func (*SignatureSet) Add added in v0.5.1

func (s *SignatureSet) Add(keyEntryIndex uint64, newSignature protocol.Signature) (int, error)

Add adds a signature to the signature set. Add does nothing if the signature set already includes the signer's public key. The entry hash must refer to a signature chain entry.

func (*SignatureSet) Count added in v0.5.1

func (s *SignatureSet) Count() int

func (*SignatureSet) Entries added in v1.0.0

func (s *SignatureSet) Entries() []SigSetEntry

func (*SignatureSet) Version added in v1.0.0

func (s *SignatureSet) Version() uint64

type SignatureSetEntry added in v1.1.0

type SignatureSetEntry struct {

	// KeyIndex is the index of the public key entry in the signer.
	KeyIndex uint64 `json:"keyIndex" form:"keyIndex" query:"keyIndex" validate:"required"`
	// Version is the signer version.
	Version uint64 `json:"version,omitempty" form:"version" query:"version" validate:"required"`
	// Path is the authority/delegation path.
	Path []*url.URL `json:"path,omitempty" form:"path" query:"path" validate:"required"`
	// Hash is the hash of the signature.
	Hash [32]byte `json:"hash,omitempty" form:"hash" query:"hash" validate:"required"`
	// contains filtered or unexported fields
}

func (*SignatureSetEntry) Copy added in v1.1.0

func (*SignatureSetEntry) CopyAsInterface added in v1.1.0

func (v *SignatureSetEntry) CopyAsInterface() interface{}

func (*SignatureSetEntry) Equal added in v1.1.0

func (*SignatureSetEntry) IsValid added in v1.1.0

func (v *SignatureSetEntry) IsValid() error

func (*SignatureSetEntry) MarshalBinary added in v1.1.0

func (v *SignatureSetEntry) MarshalBinary() ([]byte, error)

func (*SignatureSetEntry) MarshalJSON added in v1.1.0

func (v *SignatureSetEntry) MarshalJSON() ([]byte, error)

func (*SignatureSetEntry) PathHash added in v1.1.0

func (a *SignatureSetEntry) PathHash() [32]byte

PathHash returns a hash derived from the delegation path.

func (*SignatureSetEntry) UnmarshalBinary added in v1.1.0

func (v *SignatureSetEntry) UnmarshalBinary(data []byte) error

func (*SignatureSetEntry) UnmarshalBinaryFrom added in v1.1.0

func (v *SignatureSetEntry) UnmarshalBinaryFrom(rd io.Reader) error

func (*SignatureSetEntry) UnmarshalJSON added in v1.1.0

func (v *SignatureSetEntry) UnmarshalJSON(data []byte) error

type SparseHashList added in v1.1.0

type SparseHashList [][]byte

func (SparseHashList) BinarySize added in v1.1.0

func (l SparseHashList) BinarySize(height int64) int

func (SparseHashList) Copy added in v1.1.0

func (l SparseHashList) Copy() SparseHashList

func (SparseHashList) MarshalBinary added in v1.1.0

func (l SparseHashList) MarshalBinary(height int64) ([]byte, error)

func (*SparseHashList) UnmarshalBinary added in v1.1.0

func (l *SparseHashList) UnmarshalBinary(height int64, data []byte) error

type SystemData added in v1.0.0

type SystemData struct {
	// contains filtered or unexported fields
}

func (*SystemData) Commit added in v1.0.0

func (c *SystemData) Commit() error

func (*SystemData) IsDirty added in v1.0.0

func (c *SystemData) IsDirty() bool

func (*SystemData) Resolve added in v1.0.0

func (c *SystemData) Resolve(key record.Key) (record.Record, record.Key, error)

func (*SystemData) SyntheticIndexIndex added in v1.0.0

func (c *SystemData) SyntheticIndexIndex(block uint64) record.Value[uint64]

func (*SystemData) WalkChanges added in v1.1.0

func (c *SystemData) WalkChanges(fn record.WalkFunc) error

type Transaction

type Transaction struct {
	// contains filtered or unexported fields
}

func (*Transaction) AddSignature added in v0.5.1

func (t *Transaction) AddSignature(keyEntryIndex uint64, newSignature protocol.Signature) (int, error)

AddSignature loads the appropriate signature set and adds the signature to it.

func (*Transaction) AddSyntheticTxns

func (t *Transaction) AddSyntheticTxns(txids ...*url.TxID) error

AddSyntheticTxns is a convenience method that calls GetSyntheticTxns, adds the IDs, and calls PutSyntheticTxns.

func (*Transaction) AddSystemSignature added in v1.0.0

func (t *Transaction) AddSystemSignature(net *config.Describe, newSignature protocol.Signature) (int, error)

AddSystemSignature adds a system signature to the operator signature set. AddSystemSignature panics if the signature is not a system signature.

func (*Transaction) Chains added in v1.0.0

func (*Transaction) Commit added in v1.0.0

func (c *Transaction) Commit() error

func (*Transaction) GetState

func (t *Transaction) GetState() (*SigOrTxn, error)

GetState loads the transaction state.

func (*Transaction) GetStatus

func (t *Transaction) GetStatus() (*protocol.TransactionStatus, error)

GetStatus loads the transaction status.

func (*Transaction) GetSyntheticTxns

func (t *Transaction) GetSyntheticTxns() (*protocol.TxIdSet, error)

GetSyntheticTxns loads the IDs of synthetic transactions produced by the transaction.

func (*Transaction) IsDirty added in v1.0.0

func (c *Transaction) IsDirty() bool

func (*Transaction) Main added in v1.0.0

func (c *Transaction) Main() record.Value[*SigOrTxn]

func (*Transaction) Produced added in v1.0.0

func (c *Transaction) Produced() record.Set[*url.TxID]

func (*Transaction) PutState

func (t *Transaction) PutState(v *SigOrTxn) error

PutState stores the transaction state.

func (*Transaction) PutStatus

func (t *Transaction) PutStatus(v *protocol.TransactionStatus) error

PutStatus stores the transaction status.

func (*Transaction) PutSyntheticTxns added in v0.5.1

func (t *Transaction) PutSyntheticTxns(v *protocol.TxIdSet) error

PutSyntheticTxns stores the IDs of synthetic transactions produced by the transaction.

func (*Transaction) ReadSignatures added in v0.5.1

func (t *Transaction) ReadSignatures(signer *url.URL) (*SignatureSet, error)

ReadSignatures returns a read-only signature set for the given signer.

func (*Transaction) ReadSignaturesForSigner added in v0.6.0

func (t *Transaction) ReadSignaturesForSigner(signer protocol.Signer2) (*SignatureSet, error)

SignaturesForSigner returns a read-only signature set for the given signer account.

func (*Transaction) Resolve added in v1.0.0

func (c *Transaction) Resolve(key record.Key) (record.Record, record.Key, error)

func (*Transaction) RestoreSignatureSets added in v1.0.0

func (t *Transaction) RestoreSignatureSets(signer *url.URL, version uint64, entries []SigSetEntry) error

RestoreSignatureSets is specifically only to be used to restore a transaction's signature sets from a snapshot.

func (*Transaction) Signatures added in v0.5.1

func (t *Transaction) Signatures(signer *url.URL) (*SignatureSet, error)

Signatures returns a signature set for the given signer.

func (*Transaction) SignaturesForSigner added in v0.6.0

func (t *Transaction) SignaturesForSigner(signer protocol.Signer2) (*SignatureSet, error)

SignaturesForSigner returns a signature set for the given signer account.

func (*Transaction) Status added in v1.0.0

func (*Transaction) WalkChanges added in v1.1.0

func (c *Transaction) WalkChanges(fn record.WalkFunc) error

type TransactionChainEntry added in v1.0.0

type TransactionChainEntry struct {
	Account *url.URL `json:"account,omitempty" form:"account" query:"account" validate:"required"`
	// Chain is the name of the chain.
	Chain string `json:"chain,omitempty" form:"chain" query:"chain" validate:"required"`
	// ChainIndex is the index of the entry in the chain's index chain.
	ChainIndex uint64 `json:"chainIndex,omitempty" form:"chainIndex" query:"chainIndex" validate:"required"`
	// AnchorIndex is the index of the entry in the anchor chain's index chain.
	AnchorIndex uint64 `json:"anchorIndex,omitempty" form:"anchorIndex" query:"anchorIndex" validate:"required"`
	// contains filtered or unexported fields
}

func (*TransactionChainEntry) Compare added in v1.0.0

func (*TransactionChainEntry) Copy added in v1.0.0

func (*TransactionChainEntry) CopyAsInterface added in v1.0.0

func (v *TransactionChainEntry) CopyAsInterface() interface{}

func (*TransactionChainEntry) Equal added in v1.0.0

func (*TransactionChainEntry) IsValid added in v1.0.0

func (v *TransactionChainEntry) IsValid() error

func (*TransactionChainEntry) MarshalBinary added in v1.0.0

func (v *TransactionChainEntry) MarshalBinary() ([]byte, error)

func (*TransactionChainEntry) UnmarshalBinary added in v1.0.0

func (v *TransactionChainEntry) UnmarshalBinary(data []byte) error

func (*TransactionChainEntry) UnmarshalBinaryFrom added in v1.0.0

func (v *TransactionChainEntry) UnmarshalBinaryFrom(rd io.Reader) error

type Updater added in v1.0.0

type Updater interface {
	Viewer
	Update(func(batch *Batch) error) error
}

type Viewer added in v1.0.0

type Viewer interface {
	View(func(batch *Batch) error) error
}

type VoteEntry added in v1.1.0

type VoteEntry struct {

	// Authority is the URL of the authority.
	Authority *url.URL `json:"authority,omitempty" form:"authority" query:"authority" validate:"required"`
	// Hash is the hash of the signature.
	Hash [32]byte `json:"hash,omitempty" form:"hash" query:"hash" validate:"required"`
	// contains filtered or unexported fields
}

func (*VoteEntry) Copy added in v1.1.0

func (v *VoteEntry) Copy() *VoteEntry

func (*VoteEntry) CopyAsInterface added in v1.1.0

func (v *VoteEntry) CopyAsInterface() interface{}

func (*VoteEntry) Equal added in v1.1.0

func (v *VoteEntry) Equal(u *VoteEntry) bool

func (*VoteEntry) IsValid added in v1.1.0

func (v *VoteEntry) IsValid() error

func (*VoteEntry) MarshalBinary added in v1.1.0

func (v *VoteEntry) MarshalBinary() ([]byte, error)

func (*VoteEntry) MarshalJSON added in v1.1.0

func (v *VoteEntry) MarshalJSON() ([]byte, error)

func (*VoteEntry) UnmarshalBinary added in v1.1.0

func (v *VoteEntry) UnmarshalBinary(data []byte) error

func (*VoteEntry) UnmarshalBinaryFrom added in v1.1.0

func (v *VoteEntry) UnmarshalBinaryFrom(rd io.Reader) error

func (*VoteEntry) UnmarshalJSON added in v1.1.0

func (v *VoteEntry) UnmarshalJSON(data []byte) error

type YamlHexString added in v1.1.0

type YamlHexString []byte

func (*YamlHexString) UnmarshalYAML added in v1.1.0

func (s *YamlHexString) UnmarshalYAML(value *yaml.Node) error

Directories

Path Synopsis
smt
common
For key value stores where buckets are not supported, we add a byte to the key to represent a bucket.
For key value stores where buckets are not supported, we add a byte to the key to represent a bucket.
pmt

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL