Documentation ¶
Index ¶
- Constants
- type BlockDerivedData
- func (block *BlockDerivedData[TKey, TVal]) EntriesForTestingOnly() map[TKey]*invalidatableEntry[TVal]
- func (block *BlockDerivedData[TKey, TVal]) GetForTestingOnly(key TKey) *TVal
- func (block *BlockDerivedData[TKey, TVal]) InvalidatorsForTestingOnly() chainedDerivedDataInvalidators[TVal]
- func (block *BlockDerivedData[TKey, TVal]) LatestCommitExecutionTimeForTestingOnly() LogicalTime
- func (block *BlockDerivedData[TKey, TVal]) NewChildBlockDerivedData() *BlockDerivedData[TKey, TVal]
- func (block *BlockDerivedData[TKey, TVal]) NewSnapshotReadTransactionDerivedData(snapshotTime LogicalTime, executionTime LogicalTime) (*TransactionDerivedData[TKey, TVal], error)
- func (block *BlockDerivedData[TKey, TVal]) NewTransactionDerivedData(snapshotTime LogicalTime, executionTime LogicalTime) (*TransactionDerivedData[TKey, TVal], error)
- func (block *BlockDerivedData[TKey, TVal]) NextTxIndexForTestingOnly() uint32
- type BlockPrograms
- func (block *BlockPrograms) EntriesForTestingOnly() map[common.Location]*invalidatableProgramEntry
- func (block *BlockPrograms) GetForTestingOnly(location common.Location) (*interpreter.Program, *state.State, bool)
- func (block *BlockPrograms) InvalidatorsForTestingOnly() chainedInvalidators
- func (block *BlockPrograms) LatestCommitExecutionTimeForTestingOnly() LogicalTime
- func (block *BlockPrograms) NewChildBlockPrograms() *BlockPrograms
- func (block *BlockPrograms) NewSnapshotReadTransactionPrograms(snapshotTime LogicalTime, executionTime LogicalTime) (*TransactionPrograms, error)
- func (block *BlockPrograms) NewTransactionPrograms(snapshotTime LogicalTime, executionTime LogicalTime) (*TransactionPrograms, error)
- func (block *BlockPrograms) NextTxIndexForTestingOnly() uint32
- type ChainPrograms
- func (chain *ChainPrograms) Get(currentBlockId flow.Identifier) *BlockPrograms
- func (chain *ChainPrograms) GetOrCreateBlockPrograms(currentBlockId flow.Identifier, parentBlockId flow.Identifier) *BlockPrograms
- func (chain *ChainPrograms) NewBlockProgramsForScript(currentBlockId flow.Identifier) *BlockPrograms
- type ContractUpdate
- type ContractUpdateKey
- type DerivedDataInvalidator
- type Invalidator
- type LogicalTime
- type ModifiedSetsInvalidator
- type ProgramEntry
- type Programs
- func (p *Programs) ChildPrograms() *Programs
- func (p *Programs) Cleanup(modifiedSets ModifiedSetsInvalidator)
- func (p *Programs) Get(location common.Location) (*interpreter.Program, *state.State, bool)
- func (p *Programs) GetForTestingOnly(location common.Location) (*interpreter.Program, *state.State, bool)
- func (p *Programs) NextTxIndexForTestingOnly() uint32
- func (p *Programs) Set(location common.Location, program *interpreter.Program, state *state.State)
- type RetryableError
- type TransactionDerivedData
- func (item *TransactionDerivedData[TKey, TVal]) AddInvalidator(invalidator DerivedDataInvalidator[TVal])
- func (item *TransactionDerivedData[TKey, TVal]) Commit() RetryableError
- func (item *TransactionDerivedData[TKey, TVal]) Get(key TKey) *TVal
- func (item *TransactionDerivedData[TKey, TVal]) Set(key TKey, val TVal)
- func (item *TransactionDerivedData[TKey, TVal]) Validate() RetryableError
- type TransactionPrograms
- func (transaction *TransactionPrograms) AddInvalidator(invalidator Invalidator)
- func (transaction *TransactionPrograms) Commit() RetryableError
- func (transaction *TransactionPrograms) Get(location common.Location) (*interpreter.Program, *state.State, bool)
- func (transaction *TransactionPrograms) Set(location common.Location, program *interpreter.Program, state *state.State)
- func (transaction *TransactionPrograms) Validate() RetryableError
Constants ¶
const ( // All events associated with the parent block is assigned the same value. // // Note that we can assign the time to any value in the range // [math.MinInt64, -1]. ParentBlockTime = LogicalTime(-1) // All events associated with a child block is assigned the same value. // // Note that we can assign the time to any value in the range // (math.MaxUint32 + 1, math.MaxInt64]. (The +1 is needed for assigning // EndOfBlockExecutionTime a unique value) ChildBlockTime = LogicalTime(math.MaxInt64) // EndOfBlockExecutionTime is used when the real tx index is unavailable, // such as during script execution. EndOfBlockExecutionTime = ChildBlockTime - 1 // A snapshot read transaction may occur at any time within the range // [0, EndOfBlockExecutionTime] LargestSnapshotReadTransactionExecutionTime = EndOfBlockExecutionTime // A normal transaction cannot commit to EndOfBlockExecutionTime. // // Note that we can assign the time to any value in the range // [max.MathUInt32, EndOfBlockExecutionTime) LargestNormalTransactionExecutionTime = EndOfBlockExecutionTime - 1 )
const DefaultProgramsCacheSize = 1000
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type BlockDerivedData ¶
type BlockDerivedData[TKey comparable, TVal any] struct { // contains filtered or unexported fields }
BlockDerivedData is a simple fork-aware OCC database for "caching" given types of data for a particular block.
Since data are derived from external source, the database need not be durable and can be recreated on the fly.
Furthermore, because data are derived, transaction validation looks a bit unusual when compared with a textbook OCC implementation. In particular, the transaction's invalidator represents "real" writes to the canonical source, whereas the transaction's readSet/writeSet entries represent "real" reads from the canonical source.
func NewEmptyBlockDerivedData ¶
func NewEmptyBlockDerivedData[TKey comparable, TVal any]() *BlockDerivedData[TKey, TVal]
func NewEmptyBlockDerivedDataWithOffset ¶
func NewEmptyBlockDerivedDataWithOffset[TKey comparable, TVal any](offset uint32) *BlockDerivedData[TKey, TVal]
This variant is needed by the chunk verifier, which does not start at the beginning of the block.
func (*BlockDerivedData[TKey, TVal]) EntriesForTestingOnly ¶
func (block *BlockDerivedData[TKey, TVal]) EntriesForTestingOnly() map[TKey]*invalidatableEntry[TVal]
func (*BlockDerivedData[TKey, TVal]) GetForTestingOnly ¶
func (block *BlockDerivedData[TKey, TVal]) GetForTestingOnly( key TKey, ) *TVal
func (*BlockDerivedData[TKey, TVal]) InvalidatorsForTestingOnly ¶
func (block *BlockDerivedData[TKey, TVal]) InvalidatorsForTestingOnly() chainedDerivedDataInvalidators[TVal]
func (*BlockDerivedData[TKey, TVal]) LatestCommitExecutionTimeForTestingOnly ¶
func (block *BlockDerivedData[TKey, TVal]) LatestCommitExecutionTimeForTestingOnly() LogicalTime
func (*BlockDerivedData[TKey, TVal]) NewChildBlockDerivedData ¶
func (block *BlockDerivedData[TKey, TVal]) NewChildBlockDerivedData() *BlockDerivedData[TKey, TVal]
func (*BlockDerivedData[TKey, TVal]) NewSnapshotReadTransactionDerivedData ¶
func (block *BlockDerivedData[TKey, TVal]) NewSnapshotReadTransactionDerivedData( snapshotTime LogicalTime, executionTime LogicalTime, ) ( *TransactionDerivedData[TKey, TVal], error, )
func (*BlockDerivedData[TKey, TVal]) NewTransactionDerivedData ¶
func (block *BlockDerivedData[TKey, TVal]) NewTransactionDerivedData( snapshotTime LogicalTime, executionTime LogicalTime, ) ( *TransactionDerivedData[TKey, TVal], error, )
func (*BlockDerivedData[TKey, TVal]) NextTxIndexForTestingOnly ¶
func (block *BlockDerivedData[TKey, TVal]) NextTxIndexForTestingOnly() uint32
type BlockPrograms ¶ added in v0.28.0
type BlockPrograms struct {
// contains filtered or unexported fields
}
BlockPrograms is a simple fork-aware OCC database for "caching" programs for a particular block.
Since programs are derived from external source, the database need not be durable and can be recreated on the fly.
Furthermore, because programs are derived data, transaction validation looks a bit unusual when compared with a textbook OCC implementation. In particular, the transaction's invalidator represents "real" writes to the canonical source, whereas the transaction's readSet/writeSet entries represent "real" reads from the canonical source.
func NewEmptyBlockPrograms ¶ added in v0.28.0
func NewEmptyBlockPrograms() *BlockPrograms
func NewEmptyBlockProgramsWithTransactionOffset ¶ added in v0.28.0
func NewEmptyBlockProgramsWithTransactionOffset(offset uint32) *BlockPrograms
This variant is needed by the chunk verifier, which does not start at the beginning of the block.
func (*BlockPrograms) EntriesForTestingOnly ¶ added in v0.28.0
func (block *BlockPrograms) EntriesForTestingOnly() map[common.Location]*invalidatableProgramEntry
func (*BlockPrograms) GetForTestingOnly ¶ added in v0.28.0
func (block *BlockPrograms) GetForTestingOnly( location common.Location, ) ( *interpreter.Program, *state.State, bool, )
func (*BlockPrograms) InvalidatorsForTestingOnly ¶ added in v0.28.0
func (block *BlockPrograms) InvalidatorsForTestingOnly() chainedInvalidators
func (*BlockPrograms) LatestCommitExecutionTimeForTestingOnly ¶ added in v0.28.0
func (block *BlockPrograms) LatestCommitExecutionTimeForTestingOnly() LogicalTime
func (*BlockPrograms) NewChildBlockPrograms ¶ added in v0.28.0
func (block *BlockPrograms) NewChildBlockPrograms() *BlockPrograms
func (*BlockPrograms) NewSnapshotReadTransactionPrograms ¶ added in v0.28.0
func (block *BlockPrograms) NewSnapshotReadTransactionPrograms( snapshotTime LogicalTime, executionTime LogicalTime, ) ( *TransactionPrograms, error, )
func (*BlockPrograms) NewTransactionPrograms ¶ added in v0.28.0
func (block *BlockPrograms) NewTransactionPrograms( snapshotTime LogicalTime, executionTime LogicalTime, ) ( *TransactionPrograms, error, )
func (*BlockPrograms) NextTxIndexForTestingOnly ¶ added in v0.28.0
func (block *BlockPrograms) NextTxIndexForTestingOnly() uint32
type ChainPrograms ¶ added in v0.28.0
type ChainPrograms struct {
// contains filtered or unexported fields
}
ChainPrograms is a cache of BlockPrograms databases used for speeding up cadence execution.
Since programs are derived from external source, the BlockPrograms databases need not be durable and can be recreated on the fly.
func NewChainPrograms ¶ added in v0.28.0
func NewChainPrograms(chainCacheSize uint) (*ChainPrograms, error)
func (*ChainPrograms) Get ¶ added in v0.28.0
func (chain *ChainPrograms) Get( currentBlockId flow.Identifier, ) *BlockPrograms
func (*ChainPrograms) GetOrCreateBlockPrograms ¶ added in v0.28.0
func (chain *ChainPrograms) GetOrCreateBlockPrograms( currentBlockId flow.Identifier, parentBlockId flow.Identifier, ) *BlockPrograms
func (*ChainPrograms) NewBlockProgramsForScript ¶ added in v0.28.0
func (chain *ChainPrograms) NewBlockProgramsForScript( currentBlockId flow.Identifier, ) *BlockPrograms
type ContractUpdate ¶
type ContractUpdate struct { ContractUpdateKey Code []byte }
type ContractUpdateKey ¶
type DerivedDataInvalidator ¶
type Invalidator ¶ added in v0.28.0
type Invalidator interface { // This returns true if the this invalidates at least one program ShouldInvalidatePrograms() bool // This returns true if the program entry should be invalidated. ShouldInvalidateEntry(ProgramEntry) bool }
type LogicalTime ¶ added in v0.28.0
type LogicalTime int64
We will use txIndex as logical time for the purpose of "caching" programs.
Execution time refers to the transaction's start time. Snapshot time refers to the time when the snapshot first becomes readable (i.e., the "snapshot time - 1" transaction committed the snapshot view). The snapshot is where the program source code is read from if no cached program entry is available. Each transaction's snapshot time must be smaller than or equal to its execution time.
Normal transaction advances the time clock and must be committed to BlockPrograms in monotonically increasing execution time order.
Snapshot read transaction (aka script) does not advance the time clock. Its execution and snapshot time must be set to the latest snapshot time (or EndOfBlockExecutionTime in case the real logical time is unavailable).
Note that the "real" txIndex range is [0, math.MaxUint32], but we have expanded the range to support events that are not part of the block execution.
type ModifiedSetsInvalidator ¶ added in v0.28.0
type ModifiedSetsInvalidator struct { ContractUpdateKeys []ContractUpdateKey FrozenAccounts []common.Address }
func (ModifiedSetsInvalidator) ShouldInvalidateEntry ¶ added in v0.28.0
func (sets ModifiedSetsInvalidator) ShouldInvalidateEntry( entry ProgramEntry, ) bool
func (ModifiedSetsInvalidator) ShouldInvalidatePrograms ¶ added in v0.28.0
func (sets ModifiedSetsInvalidator) ShouldInvalidatePrograms() bool
type ProgramEntry ¶
type ProgramEntry struct { Location common.AddressLocation Program *interpreter.Program State *state.State }
type Programs ¶
type Programs struct {
// contains filtered or unexported fields
}
TODO(patrick): rm after https://github.com/onflow/flow-emulator/pull/229 is merged and integrated.
func NewEmptyPrograms ¶
func NewEmptyPrograms() *Programs
func (*Programs) ChildPrograms ¶
func (*Programs) Cleanup ¶
func (p *Programs) Cleanup(modifiedSets ModifiedSetsInvalidator)
func (*Programs) Get ¶
Get returns stored program, state which contains changes which correspond to loading this program, and boolean indicating if the value was found
func (*Programs) GetForTestingOnly ¶ added in v0.28.0
func (*Programs) NextTxIndexForTestingOnly ¶ added in v0.28.0
type RetryableError ¶ added in v0.28.0
type TransactionDerivedData ¶
type TransactionDerivedData[TKey comparable, TVal any] struct { // contains filtered or unexported fields }
func (*TransactionDerivedData[TKey, TVal]) AddInvalidator ¶
func (item *TransactionDerivedData[TKey, TVal]) AddInvalidator( invalidator DerivedDataInvalidator[TVal], )
func (*TransactionDerivedData[TKey, TVal]) Commit ¶
func (item *TransactionDerivedData[TKey, TVal]) Commit() RetryableError
func (*TransactionDerivedData[TKey, TVal]) Get ¶
func (item *TransactionDerivedData[TKey, TVal]) Get(key TKey) *TVal
func (*TransactionDerivedData[TKey, TVal]) Set ¶
func (item *TransactionDerivedData[TKey, TVal]) Set(key TKey, val TVal)
func (*TransactionDerivedData[TKey, TVal]) Validate ¶
func (item *TransactionDerivedData[TKey, TVal]) Validate() RetryableError
type TransactionPrograms ¶ added in v0.28.0
type TransactionPrograms struct {
// contains filtered or unexported fields
}
TransactionPrograms is the scratch space for a single transaction.
func (*TransactionPrograms) AddInvalidator ¶ added in v0.28.0
func (transaction *TransactionPrograms) AddInvalidator( invalidator Invalidator, )
func (*TransactionPrograms) Commit ¶ added in v0.28.0
func (transaction *TransactionPrograms) Commit() RetryableError
func (*TransactionPrograms) Get ¶ added in v0.28.0
func (transaction *TransactionPrograms) Get( location common.Location, ) ( *interpreter.Program, *state.State, bool, )
func (*TransactionPrograms) Set ¶ added in v0.28.0
func (transaction *TransactionPrograms) Set( location common.Location, program *interpreter.Program, state *state.State, )
func (*TransactionPrograms) Validate ¶ added in v0.28.0
func (transaction *TransactionPrograms) Validate() RetryableError