chain

package
v1.0.4 Latest Latest
Warning

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

Go to latest
Published: Apr 14, 2023 License: MIT Imports: 21 Imported by: 0

README

Chain Validator Design

Chain validators are organized by transaction type. The executor handles mundane tasks that are common to all chain validators, such as authentication and authorization.

In general, every transaction requires an origin record. Thus, the executor validates and loads the origin before delegating to the chain validator. However, certain transaction types, specifically synthetic transactions that create records, may not need an extant origin. The executor has a specific clause for these special cases.

Chain Validator Implementation

Chain validators must satisfy the TxExecutor interface:

type TxExecutor interface {
	Type() protocol.TransactionType
	Validate(*StateManager, *protocol.Envelope) error
}

All state manipulation (mutating and loading) must go through the state manager. There are three methods that can be used to modify records and/or create synthetic transactions:

  • Implementing a user transaction executor
    • Update(record) - Update one or more existing records. Cannot be used to create records.
    • Create(record) - Create one or more new records. Produces a synthetic chain create transaction.
    • Submit(url, body) - Submit a synthetic transaction.
  • Implementing a synthetic transaction executor
    • Update(record) - Create or update one or more existing records.
    • Create(record) - Cannot be used by synthetic transactions.
    • Submit(url, body) - Cannot be used by synthetic transactions.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AcmeFaucet

type AcmeFaucet struct{}

func (AcmeFaucet) Execute added in v0.6.0

func (AcmeFaucet) Type

func (AcmeFaucet) Validate

type ActivateProtocolVersion added in v1.0.2

type ActivateProtocolVersion struct{}

func (ActivateProtocolVersion) Execute added in v1.0.2

func (ActivateProtocolVersion) Type added in v1.0.2

func (ActivateProtocolVersion) Validate added in v1.0.2

type AddCredits

type AddCredits struct{}

func (AddCredits) Execute added in v0.6.0

func (AddCredits) Type

func (AddCredits) Validate

type AuthDelegate added in v1.0.0

type AuthDelegate interface {
	GetAccountAuthoritySet(*database.Batch, protocol.Account) (*protocol.AccountAuth, error)
	SignerIsAuthorized(batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, checkAuthz bool) error
	AuthorityIsSatisfied(batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus, authUrl *url.URL) (bool, error)
	SignerIsSatisfied(batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus, signer protocol.Signer) (bool, error)
}

type BurnTokens

type BurnTokens struct{}

func (BurnTokens) Execute added in v0.6.0

func (BurnTokens) Type

func (BurnTokens) Validate

type ChainUpdates added in v0.5.1

type ChainUpdates struct {
	Entries      []*protocol.BlockEntry
	SynthEntries []*database.BlockStateSynthTxnEntry
}

func (*ChainUpdates) AddChainEntry added in v0.5.1

func (u *ChainUpdates) AddChainEntry(batch *database.Batch, chain *database.Chain2, entry []byte, sourceIndex, sourceBlock uint64) error

AddChainEntry adds an entry to a chain and records the chain update in the block state.

func (*ChainUpdates) AddChainEntry2 added in v1.0.0

func (u *ChainUpdates) AddChainEntry2(batch *database.Batch, chain *database.Chain2, entry []byte, sourceIndex, sourceBlock uint64, unique bool) (int64, error)

func (*ChainUpdates) DidAddChainEntry added in v0.5.1

func (c *ChainUpdates) DidAddChainEntry(batch *database.Batch, u *url.URL, name string, typ protocol.ChainType, entry []byte, index, sourceIndex, sourceBlock uint64) error

DidAddChainEntry records a chain update in the block state.

func (*ChainUpdates) DidUpdateChain added in v0.5.1

func (c *ChainUpdates) DidUpdateChain(update *protocol.BlockEntry)

DidUpdateChain records a chain update.

func (*ChainUpdates) Merge added in v0.5.1

func (c *ChainUpdates) Merge(d *ChainUpdates)

type CreateDataAccount

type CreateDataAccount struct{}

func (CreateDataAccount) Execute added in v0.6.0

func (CreateDataAccount) SignerIsAuthorized added in v1.0.0

func (CreateDataAccount) SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

func (CreateDataAccount) TransactionIsReady added in v1.0.0

func (CreateDataAccount) TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

func (CreateDataAccount) Type

func (CreateDataAccount) Validate

type CreateIdentity

type CreateIdentity struct{}

func (CreateIdentity) AllowMissingPrincipal added in v0.6.0

func (CreateIdentity) AllowMissingPrincipal(transaction *protocol.Transaction) bool

func (CreateIdentity) Execute added in v0.6.0

func (CreateIdentity) SignerIsAuthorized added in v0.6.0

func (CreateIdentity) SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

func (CreateIdentity) TransactionIsReady added in v0.6.0

func (CreateIdentity) TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

func (CreateIdentity) Type

func (CreateIdentity) Validate

type CreateKeyBook

type CreateKeyBook struct{}

func (CreateKeyBook) Execute added in v0.6.0

func (CreateKeyBook) SignerIsAuthorized added in v1.0.0

func (CreateKeyBook) SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

func (CreateKeyBook) TransactionIsReady added in v1.0.0

func (CreateKeyBook) TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

func (CreateKeyBook) Type

func (CreateKeyBook) Validate

type CreateKeyPage

type CreateKeyPage struct{}

func (CreateKeyPage) Execute added in v0.6.0

func (CreateKeyPage) Type

func (CreateKeyPage) Validate

type CreateLiteTokenAccount added in v1.0.0

type CreateLiteTokenAccount struct{}

func (CreateLiteTokenAccount) AllowMissingPrincipal added in v1.0.0

func (CreateLiteTokenAccount) AllowMissingPrincipal(transaction *protocol.Transaction) bool

func (CreateLiteTokenAccount) Execute added in v1.0.0

func (CreateLiteTokenAccount) SignerIsAuthorized added in v1.0.0

func (CreateLiteTokenAccount) SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

func (CreateLiteTokenAccount) TransactionIsReady added in v1.0.0

func (CreateLiteTokenAccount) TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

func (CreateLiteTokenAccount) Type added in v1.0.0

func (CreateLiteTokenAccount) Validate added in v1.0.0

type CreateToken

type CreateToken struct{}

func (CreateToken) Execute added in v0.6.0

func (CreateToken) SignerIsAuthorized added in v1.0.0

func (CreateToken) SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

func (CreateToken) TransactionIsReady added in v1.0.0

func (CreateToken) TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

func (CreateToken) Type

func (CreateToken) Validate

type CreateTokenAccount

type CreateTokenAccount struct{}

func (CreateTokenAccount) Execute added in v0.6.0

func (CreateTokenAccount) SignerIsAuthorized added in v1.0.0

func (CreateTokenAccount) SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

func (CreateTokenAccount) TransactionIsReady added in v1.0.0

func (CreateTokenAccount) TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

func (CreateTokenAccount) Type

func (CreateTokenAccount) Validate

type Delivery added in v0.6.0

type Delivery struct {
	Signatures  []protocol.Signature
	Transaction *protocol.Transaction
	State       ProcessTransactionState

	// For synthetic transactions
	SequenceNumber uint64
	SourceNetwork  *url.URL
	// contains filtered or unexported fields
}

func NormalizeEnvelope added in v0.6.0

func NormalizeEnvelope(envelope *protocol.Envelope) ([]*Delivery, error)

NormalizeEnvelope normalizes the envelope into one or more deliveries.

func (*Delivery) IsForwarded added in v0.6.0

func (d *Delivery) IsForwarded() bool

IsForwarded returns true if the transaction was delivered within a SyntheticForwardedTransaction.

func (*Delivery) LoadSyntheticMetadata added in v1.0.0

func (d *Delivery) LoadSyntheticMetadata(batch *database.Batch, typ protocol.TransactionType, status *protocol.TransactionStatus) error

func (*Delivery) LoadTransaction added in v0.6.0

func (d *Delivery) LoadTransaction(batch *database.Batch) (*protocol.TransactionStatus, error)

LoadTransaction attempts to load the transaction from the database.

func (*Delivery) NewChild added in v1.0.0

func (d *Delivery) NewChild(transaction *protocol.Transaction, signatures []protocol.Signature) *Delivery

func (*Delivery) NewForwarded added in v0.6.0

func (d *Delivery) NewForwarded(fwd *protocol.SyntheticForwardTransaction) *Delivery

func (*Delivery) NewInternal added in v1.0.0

func (d *Delivery) NewInternal(transaction *protocol.Transaction) *Delivery

func (*Delivery) NewSyntheticFromSequence added in v1.0.0

func (d *Delivery) NewSyntheticFromSequence(hash [32]byte) *Delivery

func (*Delivery) NewSyntheticReceipt added in v0.6.0

func (d *Delivery) NewSyntheticReceipt(hash [32]byte, source *url.URL, receipt *managed.Receipt) *Delivery

func (*Delivery) Parent added in v1.0.0

func (d *Delivery) Parent() *Delivery

func (*Delivery) WasProducedByPushedUpdate added in v1.0.0

func (d *Delivery) WasProducedByPushedUpdate() bool

WasProducedByPushedUpdate returns true if the transaction was produced by an update pushed via an anchor from the directory network.

func (*Delivery) WasProducedInternally added in v1.0.0

func (d *Delivery) WasProducedInternally() bool

type DirectoryAnchor added in v1.0.0

type DirectoryAnchor struct{}

func (DirectoryAnchor) Execute added in v1.0.0

func (DirectoryAnchor) Type added in v1.0.0

func (DirectoryAnchor) Validate added in v1.0.0

type IssueTokens

type IssueTokens struct{}

func (IssueTokens) Execute added in v0.6.0

func (IssueTokens) Type

func (IssueTokens) Validate

type LockAccount added in v1.0.0

type LockAccount struct{}

func (LockAccount) Execute added in v1.0.0

func (LockAccount) Type added in v1.0.0

func (LockAccount) Validate added in v1.0.0

type PartitionAnchor added in v1.0.0

type PartitionAnchor struct{}

func (PartitionAnchor) Execute added in v1.0.0

func (PartitionAnchor) Type added in v1.0.0

func (PartitionAnchor) Validate added in v1.0.0

type PrincipalValidator added in v1.0.0

type PrincipalValidator interface {
	TransactionExecutor

	AllowMissingPrincipal(*protocol.Transaction) bool
}

PrincipalValidator validates the principal for a specific type of transaction.

type ProcessTransactionState added in v0.5.1

type ProcessTransactionState struct {
	ProducedTxns           []*protocol.Transaction
	AdditionalTransactions []*Delivery
	ChainUpdates           ChainUpdates
	MakeMajorBlock         uint64
	MakeMajorBlockTime     time.Time
	ReceivedAnchors        []*ReceivedAnchor
}

func (*ProcessTransactionState) DidProduceTxn added in v0.5.1

func (s *ProcessTransactionState) DidProduceTxn(url *url.URL, body protocol.TransactionBody)

DidProduceTxn records a produced transaction.

func (*ProcessTransactionState) DidReceiveAnchor added in v1.0.0

func (s *ProcessTransactionState) DidReceiveAnchor(partition string, body protocol.AnchorBody, index int64)

func (*ProcessTransactionState) Merge added in v0.5.1

func (*ProcessTransactionState) ProcessAdditionalTransaction added in v0.6.0

func (s *ProcessTransactionState) ProcessAdditionalTransaction(txn *Delivery)

type ReceivedAnchor added in v1.0.0

type ReceivedAnchor struct {
	Partition string
	Body      protocol.AnchorBody
	Index     int64
}

type SendTokens

type SendTokens struct{}

func (SendTokens) Execute added in v0.6.0

func (SendTokens) Type

func (SendTokens) Validate

type SignatureValidationMetadata added in v1.0.0

type SignatureValidationMetadata struct {
	Location    *url.URL
	IsInitiator bool
	Delegated   bool
	Forwarded   bool
}

func (SignatureValidationMetadata) Nested added in v1.0.0

func (d SignatureValidationMetadata) Nested() bool

func (SignatureValidationMetadata) SetDelegated added in v1.0.0

func (SignatureValidationMetadata) SetForwarded added in v1.0.0

type SignerValidator added in v1.0.0

type SignerValidator interface {
	TransactionExecutor

	// SignerIsAuthorized checks if the signature is authorized for the
	// transaction.
	SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

	// TransactionIsReady checks if the transaction is ready to be executed.
	TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)
}

SignerValidator validates signatures for a specific type of transaction.

type StateManager

type StateManager struct {
	Origin    protocol.Account
	OriginUrl *url.URL
	// contains filtered or unexported fields
}

func LoadStateManager added in v0.6.0

func LoadStateManager(net *config.Describe, globals *core.GlobalValues, batch *database.Batch, principal protocol.Account, transaction *protocol.Transaction, status *protocol.TransactionStatus, logger log.Logger) (*StateManager, error)

func NewStateManager

func NewStateManager(net *config.Describe, globals *core.GlobalValues, batch *database.Batch, principal protocol.Account, transaction *protocol.Transaction, logger log.Logger) *StateManager

NewStateManager creates a new state manager and loads the transaction's origin. If the origin is not found, NewStateManager returns a valid state manager along with a not-found error.

func (*StateManager) AddAuthority added in v0.6.0

func (m *StateManager) AddAuthority(account protocol.FullAccount, authority *url.URL) error

func (*StateManager) AddDirectoryEntry

func (c *StateManager) AddDirectoryEntry(directory *url.URL, u ...*url.URL) error

func (*StateManager) Commit

func (m *StateManager) Commit() (*ProcessTransactionState, error)

commit writes pending records to the database.

func (*StateManager) Create

func (st *StateManager) Create(accounts ...protocol.Account) error

func (*StateManager) Discard added in v0.5.1

func (m *StateManager) Discard()

func (*StateManager) GetBatch added in v1.0.0

func (m *StateManager) GetBatch() *database.Batch

func (*StateManager) GetHash added in v1.0.0

func (m *StateManager) GetHash() []byte

func (*StateManager) GetHeight

func (c *StateManager) GetHeight(u *url.URL) (uint64, error)

GetHeight loads the height of the chain

func (*StateManager) InheritAuth added in v0.6.0

func (m *StateManager) InheritAuth(account protocol.FullAccount) error

func (*StateManager) LoadTxn

func (c *StateManager) LoadTxn(txid [32]byte) (*protocol.Transaction, error)

LoadTxn loads and unmarshals a saved transaction

func (*StateManager) LoadUrl

func (c *StateManager) LoadUrl(account *url.URL) (protocol.Account, error)

LoadUrl loads a chain by URL and unmarshals it.

func (*StateManager) LoadUrlAs

func (c *StateManager) LoadUrlAs(account *url.URL, target interface{}) error

LoadUrlAs loads a chain by URL and unmarshals it as a specific type.

func (*StateManager) SetAuth added in v0.6.0

func (m *StateManager) SetAuth(account protocol.FullAccount, authorities []*url.URL) error

func (*StateManager) Submit

func (m *StateManager) Submit(url *url.URL, body protocol.TransactionBody)

Submit queues a synthetic transaction for submission.

func (*StateManager) Update

func (st *StateManager) Update(accounts ...protocol.Account) error

Update queues a record for storage in the database. The queued update will fail if the record does not already exist, unless it is created by a synthetic transaction, or the record is a transaction.

func (*StateManager) UpdateData

func (m *StateManager) UpdateData(record protocol.Account, entryHash []byte, dataEntry protocol.DataEntry)

UpdateData will cache a data associated with a DataAccount chain. the cache data will not be stored directly in the state but can be used upstream for storing a chain in the state database.

type SyntheticBurnTokens

type SyntheticBurnTokens struct{}

func (SyntheticBurnTokens) Execute added in v0.6.0

func (SyntheticBurnTokens) Type

func (SyntheticBurnTokens) Validate

type SyntheticCreateIdentity added in v0.6.0

type SyntheticCreateIdentity struct{}

func (SyntheticCreateIdentity) AllowMissingPrincipal added in v1.0.0

func (SyntheticCreateIdentity) AllowMissingPrincipal(transaction *protocol.Transaction) bool

func (SyntheticCreateIdentity) Execute added in v0.6.0

func (SyntheticCreateIdentity) Type added in v0.6.0

func (SyntheticCreateIdentity) Validate added in v0.6.0

type SyntheticDepositCredits

type SyntheticDepositCredits struct{}

func (SyntheticDepositCredits) AllowMissingPrincipal added in v1.0.0

func (SyntheticDepositCredits) AllowMissingPrincipal(transaction *protocol.Transaction) bool

func (SyntheticDepositCredits) DidFail added in v1.0.0

func (SyntheticDepositCredits) Execute added in v0.6.0

func (SyntheticDepositCredits) Type

func (SyntheticDepositCredits) Validate

type SyntheticDepositTokens

type SyntheticDepositTokens struct{}

func (SyntheticDepositTokens) AllowMissingPrincipal added in v1.0.0

func (SyntheticDepositTokens) AllowMissingPrincipal(transaction *protocol.Transaction) bool

func (SyntheticDepositTokens) DidFail added in v0.6.0

func (SyntheticDepositTokens) Execute added in v0.6.0

func (SyntheticDepositTokens) Type

func (SyntheticDepositTokens) Validate

type SyntheticForwardTransaction added in v0.6.0

type SyntheticForwardTransaction struct{}

func (SyntheticForwardTransaction) AllowMissingPrincipal added in v1.0.0

func (SyntheticForwardTransaction) AllowMissingPrincipal(transaction *protocol.Transaction) bool

func (SyntheticForwardTransaction) Execute added in v0.6.0

func (SyntheticForwardTransaction) Type added in v0.6.0

func (SyntheticForwardTransaction) Validate added in v0.6.0

type SyntheticWriteData

type SyntheticWriteData struct{}

func (SyntheticWriteData) AllowMissingPrincipal added in v1.0.0

func (SyntheticWriteData) AllowMissingPrincipal(transaction *protocol.Transaction) bool

func (SyntheticWriteData) Execute added in v0.6.0

func (SyntheticWriteData) Type

func (SyntheticWriteData) Validate

type SystemWriteData added in v1.0.0

type SystemWriteData struct{}

func (SystemWriteData) Execute added in v1.0.0

func (SystemWriteData) Type added in v1.0.0

func (SystemWriteData) Validate added in v1.0.0

type TransactionExecutor added in v1.0.0

type TransactionExecutor interface {
	// Type is the transaction type the executor can execute.
	Type() protocol.TransactionType

	// Validate validates the transaction for acceptance.
	Validate(*StateManager, *Delivery) (protocol.TransactionResult, error)

	// Execute fully validates and executes the transaction.
	Execute(*StateManager, *Delivery) (protocol.TransactionResult, error)
}

TransactionExecutor executes a specific type of transaction.

type TransactionExecutorCleanup added in v1.0.0

type TransactionExecutorCleanup interface {
	// DidFail is called if the transaction failed.
	DidFail(*ProcessTransactionState, *protocol.Transaction) error
}

TransactionExecutorCleanup cleans up after a failed transaction.

type UpdateAccountAuth added in v0.6.0

type UpdateAccountAuth struct{}

func (UpdateAccountAuth) Execute added in v0.6.0

func (UpdateAccountAuth) SignerIsAuthorized added in v1.0.0

func (UpdateAccountAuth) SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

func (UpdateAccountAuth) TransactionIsReady added in v1.0.0

func (UpdateAccountAuth) TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

func (UpdateAccountAuth) Type added in v0.6.0

func (UpdateAccountAuth) Validate added in v0.6.0

type UpdateKey added in v0.6.0

type UpdateKey struct{}

func (UpdateKey) Execute added in v0.6.0

func (UpdateKey) Type added in v0.6.0

func (UpdateKey) Validate added in v0.6.0

type UpdateKeyPage

type UpdateKeyPage struct{}

func (UpdateKeyPage) Execute added in v0.6.0

func (UpdateKeyPage) SignerIsAuthorized added in v1.0.0

func (UpdateKeyPage) SignerIsAuthorized(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, signer protocol.Signer, md SignatureValidationMetadata) (fallback bool, err error)

func (UpdateKeyPage) TransactionIsReady added in v1.0.0

func (UpdateKeyPage) TransactionIsReady(delegate AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

func (UpdateKeyPage) Type

func (UpdateKeyPage) Validate

type WriteData

type WriteData struct{}

func (WriteData) AllowMissingPrincipal added in v1.0.0

func (WriteData) AllowMissingPrincipal(transaction *protocol.Transaction) bool

func (WriteData) Execute added in v0.6.0

func (WriteData) SignerIsAuthorized added in v0.6.0

func (WriteData) SignerIsAuthorized(_ AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, _ protocol.Signer, _ SignatureValidationMetadata) (fallback bool, err error)

SignerIsAuthorized returns nil if the transaction is writing to a lite data account.

func (WriteData) TransactionIsReady added in v0.6.0

func (WriteData) TransactionIsReady(_ AuthDelegate, batch *database.Batch, transaction *protocol.Transaction, status *protocol.TransactionStatus) (ready, fallback bool, err error)

TransactionIsReady returns true if the transaction is writing to a lite data account.

func (WriteData) Type

func (WriteData) Validate

type WriteDataTo

type WriteDataTo struct{}

func (WriteDataTo) Execute added in v0.6.0

func (WriteDataTo) Type

func (WriteDataTo) Validate

Jump to

Keyboard shortcuts

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