state

package
v0.0.0-...-a293c92 Latest Latest
Warning

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

Go to latest
Published: Jun 1, 2022 License: BSD-3-Clause Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// ContractDataPrefix 在StateDB中合约账户保存的键值有以下几种
	// 合约数据,前缀+合约地址,第一次生成合约时设置,后面不会发生变化
	ContractDataPrefix = "mavl-jvm-data: "

	// ContractStatePrefix 合约状态,前缀+合约地址,保存合约nonce以及其它数据,可变
	ContractStatePrefix = "mavl-jvm-state: "

	// ContractStateItemKey 合约中存储的具体状态数据,包含两个参数:合约地址、状态KEY
	ContractStateItemKey = "mavl-jvm-state:%v:%v"
)
View Source
var (
	IsPara bool
	Title  string
)

Functions

func GetAllLocalKeyValues

func GetAllLocalKeyValues(txhashNew string) []*types.KeyValue

注意该接口只能在执行本地交易查询时使用,否则会破坏数据

func SetCurrentTx4UT

func SetCurrentTx4UT(txhashNew string)

该函数只是方便用来帮助进行单元测试,不可以在正常业务逻辑中使用

Types

type ContractAccount

type ContractAccount struct {

	// 合约代码地址
	Addr string

	// 合约固定数据
	Data types.JVMContractData
	// contains filtered or unexported fields
}

ContractAccount 合约账户对象

func NewContractAccount

func NewContractAccount(addr string, db *MemoryStateDB) *ContractAccount

NewContractAccount 创建一个新的合约对象 注意,此时合约对象有可能已经存在也有可能不存在 需要通过LoadContract进行判断

func (*ContractAccount) BuildDataLog

func (c *ContractAccount) BuildDataLog() (log *chain33Types.ReceiptLog)

BuildDataLog 构建变更日志

func (*ContractAccount) Empty

func (c *ContractAccount) Empty() bool

Empty judge empty or not

func (*ContractAccount) GetCreator

func (c *ContractAccount) GetCreator() string

GetCreator get creator

func (*ContractAccount) GetDataKV

func (c *ContractAccount) GetDataKV() (kvSet []*chain33Types.KeyValue)

GetDataKV 合约固定数据,包含合约代码,以及代码哈希

func (*ContractAccount) GetDataKey

func (c *ContractAccount) GetDataKey() []byte

GetDataKey get data for key

func (*ContractAccount) GetExecName

func (c *ContractAccount) GetExecName() string

GetExecName get exec name

func (*ContractAccount) GetLocalDataKey

func (c *ContractAccount) GetLocalDataKey(addr, key string) string

GetLocalDataKey get local data for key

func (*ContractAccount) GetState

func (c *ContractAccount) GetState(key string) []byte

GetState 获取状态数据; 获取数据分为两层,一层是从当前的缓存中获取,如果获取不到,再从localdb中获取

func (*ContractAccount) GetStateItemKey

func (c *ContractAccount) GetStateItemKey(addr, key string) string

GetStateItemKey get state item for key

func (*ContractAccount) GetStateKey

func (c *ContractAccount) GetStateKey() []byte

GetStateKey get state for key

func (*ContractAccount) LoadContract

func (c *ContractAccount) LoadContract(db db.KV)

LoadContract 从数据库中加载合约信息(在只有合约地址的情况下)

func (*ContractAccount) SetCodeAndAbi

func (c *ContractAccount) SetCodeAndAbi(code []byte, abi []byte)

SetCodeAndAbi 设置合约二进制代码 会同步生成代码哈希

func (*ContractAccount) SetCreator

func (c *ContractAccount) SetCreator(creator string)

SetCreator 设置创建者

func (*ContractAccount) SetExecName

func (c *ContractAccount) SetExecName(execName string)

SetExecName 设置执行名称

func (*ContractAccount) SetState

func (c *ContractAccount) SetState(key string, value []byte) error

SetState 设置状态数据

func (*ContractAccount) SetValue2Local

func (c *ContractAccount) SetValue2Local(key string, value []byte, txHash string) error

SetValue2Local 设置本地数据,用于帮助辅助查找

type DataChange

type DataChange interface {
	// contains filtered or unexported methods
}

DataChange 数据状态变更接口 所有的数据状态变更事件实现此接口,并且封装各自的变更数据以及回滚动作 在调用合约时(具体的Tx执行时),会根据操作生成对应的变更对象并缓存下来 如果合约执行出错,会按生成顺序的倒序,依次调用变更对象的回滚接口进行数据回滚,并同步删除变更对象缓存 如果合约执行成功,会按生成顺序的郑旭,依次调用变更对象的数据和日志变更记录,回传给区块链

type JvmStateDB

type JvmStateDB interface {
	// 创建新的合约对象
	CreateAccount(string, string, string, string)

	// 从从指定地址扣除金额
	SubBalance(string, string, uint64)
	// 向指定地址增加金额
	AddBalance(string, string, uint64)
	// 获取指定地址的余额
	GetBalance(string) uint64

	// 获取指定地址合约的代码哈希
	GetCodeHash(string) common.Hash
	// 获取指定地址合约代码
	GetCode(string) []byte
	// 获取指定地址合约ABI
	GetAbi(string) []byte
	// 设置指定地址合约代码
	SetCodeAndAbi(string, []byte, []byte)
	// 获取指定地址合约代码大小
	GetCodeSize(string) int

	// 获取合约状态数据
	GetState(string, common.Hash) common.Hash
	// 设置合约状态数据
	SetState(string, common.Hash, common.Hash)

	// 判断一个合约地址是否存在(已经销毁的合约地址对象依然存在)
	Exist(string) bool
	// 判断一个合约地址是否为空(不包含任何代码、也没有余额的合约为空)
	Empty(string) bool

	// 生成一个新版本号(递增操作)
	Snapshot() int
}

jvmStateDB 状态数据库封装,面向EVM业务执行逻辑; 生命周期为一个区块,在同一个区块内多个交易执行时使用的是同一个StateDB实例; StateDB包含区块的状态和交易的状态(当前上下文),所以不支持并发操作,区块内的多个交易只能按顺序单线程执行; StateDB除了查询状态数据,还会保留在交易执行时对数据的变更信息,每个交易完成之后会返回变更影响的数据给执行器;

type MemoryStateDB

type MemoryStateDB struct {
	//current executor's name, could be Jvm, user.p.xxx.user.Jvm.xxx or usr.Jvm.xxx
	ExecutorName string
	// 状态DB,从执行器框架传入
	StateDB db.KV

	// 本地DB,从执行器框架传入
	LocalDB db.KVDB

	// Coins账户操作对象,从执行器框架传入
	CoinsAccount *account.DB
	// contains filtered or unexported fields
}

MemoryStateDB 内存状态数据库,保存在区块操作时内部的数据变更操作 本数据库不会直接写文件,只会暂存变更记录 在区块打包完成后,这里的缓存变更数据会被清空(通过区块打包分别写入blockchain和statedb数据库) 在交易执行过程中,本数据库会暂存并变更,在交易执行结束后,会返回变更的数据集,返回给blockchain 执行器的Exec阶段会返回:交易收据、合约账户(包含合约地址、合约代码、合约存储信息) 执行器的ExecLocal阶段会返回:合约创建人和合约的关联信息

func NewMemoryStateDB

func NewMemoryStateDB(executorName string, StateDB db.KV, LocalDB db.KVDB, CoinsAccount *account.DB, blockHeight int64) *MemoryStateDB

NewMemoryStateDB 基于执行器框架的三个DB构建内存状态机对象 此对象的生命周期对应一个区块,在同一个区块内的多个交易执行时共享同一个DB对象 开始执行下一个区块时(执行器框架调用setEnv设置的区块高度发生变更时),会重新创建此DB对象

func (*MemoryStateDB) CreateAccount

func (m *MemoryStateDB) CreateAccount(addr, creator string, name string)

CreateAccount 创建一个新的合约账户对象

func (*MemoryStateDB) Empty

func (m *MemoryStateDB) Empty(addr string) bool

Empty 判断合约对象是否为空

func (*MemoryStateDB) ExecActive

func (m *MemoryStateDB) ExecActive(tx *types.Transaction, addr string, amount int64) bool

ExecActive active exec

func (*MemoryStateDB) ExecFrozen

func (m *MemoryStateDB) ExecFrozen(tx *types.Transaction, addr string, amount int64) bool

ExecFrozen exec frozen information

func (*MemoryStateDB) ExecTransfer

func (m *MemoryStateDB) ExecTransfer(tx *types.Transaction, from, to string, amount int64) bool

ExecTransfer transfer exec

func (*MemoryStateDB) ExecTransferFrozen

func (m *MemoryStateDB) ExecTransferFrozen(tx *types.Transaction, from, to string, amount int64) bool

ExecTransferFrozen transfer frozen exec

func (*MemoryStateDB) Exist

func (m *MemoryStateDB) Exist(addr string) bool

Exist 判断合约对象是否存在

func (*MemoryStateDB) GetAccount

func (m *MemoryStateDB) GetAccount(addr string) *ContractAccount

GetAccount 从缓存中获取或加载合约账户

func (*MemoryStateDB) GetBalance

func (m *MemoryStateDB) GetBalance(addr string) uint64

GetBalance 这里需要区分对待,如果是合约账户,则查看合约账户所有者地址在此合约下的余额; 如果是外部账户,则直接返回外部账户的余额

func (*MemoryStateDB) GetChangedData

func (m *MemoryStateDB) GetChangedData(version int) (kvSet []*types.KeyValue, logs []*types.ReceiptLog)

GetChangedData 获取本次操作所引起的状态数据变更 因为目前执行器每次执行都是一个新的MemoryStateDB,所以,所有的快照都是从0开始的, 这里获取的应该是从0到目前快照的所有变更; 另外,因为合约内部会调用其它合约,也会产生数据变更,所以这里返回的数据,不止是一个合约的数据。

func (*MemoryStateDB) GetCode

func (m *MemoryStateDB) GetCode(addr string) []byte

GetCode 获取合约的code

func (*MemoryStateDB) GetLastSnapshot

func (m *MemoryStateDB) GetLastSnapshot() *Snapshot

GetLastSnapshot 获取最后一次成功的快照版本号

func (*MemoryStateDB) GetName

func (m *MemoryStateDB) GetName(addr string) string

GetName 获取设备的名称

func (*MemoryStateDB) GetReceiptLogs

func (m *MemoryStateDB) GetReceiptLogs(addr string) (logs []*types.ReceiptLog)

GetReceiptLogs 获取合约对象的变更日志

func (*MemoryStateDB) GetState

func (m *MemoryStateDB) GetState(addr string, key string) []byte

GetState SLOAD 指令加载合约状态数据

func (*MemoryStateDB) GetValueFromLocal

func (m *MemoryStateDB) GetValueFromLocal(addr, key, txhash string) []byte

GetValueFromLocal 从本地数据库获取值

func (*MemoryStateDB) List

func (m *MemoryStateDB) List(prefix []byte, maxCountOnce int32) [][]byte

List 根据前缀查询本地数据库

func (*MemoryStateDB) SetCodeAndAbi

func (m *MemoryStateDB) SetCodeAndAbi(addr string, code []byte, abi []byte)

SetCodeAndAbi 设置code和abi 数据

func (*MemoryStateDB) SetCurrentExecutorName

func (m *MemoryStateDB) SetCurrentExecutorName(executorName string)

SetCurrentExecutorName 设置当前执行器的名称

func (*MemoryStateDB) SetState

func (m *MemoryStateDB) SetState(addr, key string, value []byte) bool

SetState SSTORE 指令修改合约状态数据

func (*MemoryStateDB) SetValue2Local

func (m *MemoryStateDB) SetValue2Local(addr, key string, value []byte, txHash string) bool

SetValue2Local 设置数据存储到本地

func (*MemoryStateDB) Snapshot

func (m *MemoryStateDB) Snapshot() int

Snapshot 对当前的数据状态打快照,并生成快照版本号,方便后面回滚数据

type Snapshot

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

Snapshot 版本结构,包含版本号以及当前版本包含的变更对象在变更序列中的开始序号

func (*Snapshot) GetID

func (ver *Snapshot) GetID() int

GetID get id for snapshot

Jump to

Keyboard shortcuts

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