Documentation ¶
Index ¶
- Variables
- func GetAllLocalKeyValues(txhashNew string) []*types.KeyValue
- func SetCurrentTx4UT(txhashNew string)
- type ContractAccount
- func (c *ContractAccount) BuildDataLog() (log *chain33Types.ReceiptLog)
- func (c *ContractAccount) Empty() bool
- func (c *ContractAccount) GetCreator() string
- func (c *ContractAccount) GetDataKV() (kvSet []*chain33Types.KeyValue)
- func (c *ContractAccount) GetDataKey() []byte
- func (c *ContractAccount) GetExecName() string
- func (c *ContractAccount) GetLocalDataKey(addr, key string) string
- func (c *ContractAccount) GetState(key string) []byte
- func (c *ContractAccount) GetStateItemKey(addr, key string) string
- func (c *ContractAccount) GetStateKey() []byte
- func (c *ContractAccount) LoadContract(db db.KV)
- func (c *ContractAccount) SetCodeAndAbi(code []byte, abi []byte)
- func (c *ContractAccount) SetCreator(creator string)
- func (c *ContractAccount) SetExecName(execName string)
- func (c *ContractAccount) SetState(key string, value []byte) error
- func (c *ContractAccount) SetValue2Local(key string, value []byte, txHash string) error
- type DataChange
- type JvmStateDB
- type MemoryStateDB
- func (m *MemoryStateDB) CreateAccount(addr, creator string, name string)
- func (m *MemoryStateDB) Empty(addr string) bool
- func (m *MemoryStateDB) ExecActive(tx *types.Transaction, addr string, amount int64) bool
- func (m *MemoryStateDB) ExecFrozen(tx *types.Transaction, addr string, amount int64) bool
- func (m *MemoryStateDB) ExecTransfer(tx *types.Transaction, from, to string, amount int64) bool
- func (m *MemoryStateDB) ExecTransferFrozen(tx *types.Transaction, from, to string, amount int64) bool
- func (m *MemoryStateDB) Exist(addr string) bool
- func (m *MemoryStateDB) GetAccount(addr string) *ContractAccount
- func (m *MemoryStateDB) GetBalance(addr string) uint64
- func (m *MemoryStateDB) GetChangedData(version int) (kvSet []*types.KeyValue, logs []*types.ReceiptLog)
- func (m *MemoryStateDB) GetCode(addr string) []byte
- func (m *MemoryStateDB) GetLastSnapshot() *Snapshot
- func (m *MemoryStateDB) GetName(addr string) string
- func (m *MemoryStateDB) GetReceiptLogs(addr string) (logs []*types.ReceiptLog)
- func (m *MemoryStateDB) GetState(addr string, key string) []byte
- func (m *MemoryStateDB) GetValueFromLocal(addr, key, txhash string) []byte
- func (m *MemoryStateDB) List(prefix []byte, maxCountOnce int32) [][]byte
- func (m *MemoryStateDB) SetCodeAndAbi(addr string, code []byte, abi []byte)
- func (m *MemoryStateDB) SetCurrentExecutorName(executorName string)
- func (m *MemoryStateDB) SetState(addr, key string, value []byte) bool
- func (m *MemoryStateDB) SetValue2Local(addr, key string, value []byte, txHash string) bool
- func (m *MemoryStateDB) Snapshot() int
- type Snapshot
Constants ¶
This section is empty.
Variables ¶
var ( // ContractDataPrefix 在StateDB中合约账户保存的键值有以下几种 // 合约数据,前缀+合约地址,第一次生成合约时设置,后面不会发生变化 ContractDataPrefix = "mavl-jvm-data: " // ContractStatePrefix 合约状态,前缀+合约地址,保存合约nonce以及其它数据,可变 ContractStatePrefix = "mavl-jvm-state: " // ContractStateItemKey 合约中存储的具体状态数据,包含两个参数:合约地址、状态KEY ContractStateItemKey = "mavl-jvm-state:%v:%v" )
var ( IsPara bool Title string )
Functions ¶
func GetAllLocalKeyValues ¶
注意该接口只能在执行本地交易查询时使用,否则会破坏数据
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) 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) 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) 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) 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 对当前的数据状态打快照,并生成快照版本号,方便后面回滚数据