Documentation ¶
Index ¶
- func InitForkData()
- func ProcessFork(cfg *types.Chain33Config, blockHeight int64, txHash []byte, ...)
- type BlockData
- type ContractAccount
- func (ca *ContractAccount) BuildDataLog() (log *types.ReceiptLog)
- func (ca *ContractAccount) BuildStateLog() (log *types.ReceiptLog)
- func (ca *ContractAccount) Empty() bool
- func (ca *ContractAccount) GetAliasName() string
- func (ca *ContractAccount) GetCreator() string
- func (ca *ContractAccount) GetDataKV() (kvSet []*types.KeyValue)
- func (ca *ContractAccount) GetDataKey() []byte
- func (ca *ContractAccount) GetExecName() string
- func (ca *ContractAccount) GetNonce() uint64
- func (ca *ContractAccount) GetState(key common.Hash) common.Hash
- func (ca *ContractAccount) GetStateKV() (kvSet []*types.KeyValue)
- func (ca *ContractAccount) GetStateKey() []byte
- func (ca *ContractAccount) HasSuicided() bool
- func (ca *ContractAccount) LoadContract(db db.KV)
- func (ca *ContractAccount) SetAbi(abi string)
- func (ca *ContractAccount) SetAliasName(alias string)
- func (ca *ContractAccount) SetCode(code []byte)
- func (ca *ContractAccount) SetCreator(creator string)
- func (ca *ContractAccount) SetExecName(execName string)
- func (ca *ContractAccount) SetNonce(nonce uint64)
- func (ca *ContractAccount) SetState(key, value common.Hash)
- func (ca *ContractAccount) Suicide() bool
- func (ca *ContractAccount) TransferState()
- type DataChange
- type EVMStateDB
- type MemoryStateDB
- func (mdb *MemoryStateDB) AddBalance(addr, caddr string, value uint64)
- func (mdb *MemoryStateDB) AddLog(log *model.ContractLog)
- func (mdb *MemoryStateDB) AddPreimage(hash common.Hash, data []byte)
- func (mdb *MemoryStateDB) AddRefund(gas uint64)
- func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) bool
- func (mdb *MemoryStateDB) CreateAccount(addr, creator string, execName, alias string)
- func (mdb *MemoryStateDB) Empty(addr string) bool
- func (mdb *MemoryStateDB) Exist(addr string) bool
- func (mdb *MemoryStateDB) GetAbi(addr string) string
- func (mdb *MemoryStateDB) GetAccount(addr string) *ContractAccount
- func (mdb *MemoryStateDB) GetBalance(addr string) uint64
- func (mdb *MemoryStateDB) GetBlockHeight() int64
- func (mdb *MemoryStateDB) GetChangedData(version int) (kvSet []*types.KeyValue, logs []*types.ReceiptLog)
- func (mdb *MemoryStateDB) GetCode(addr string) []byte
- func (mdb *MemoryStateDB) GetCodeHash(addr string) common.Hash
- func (mdb *MemoryStateDB) GetCodeSize(addr string) int
- func (mdb *MemoryStateDB) GetConfig() *types.Chain33Config
- func (mdb *MemoryStateDB) GetLastSnapshot() *Snapshot
- func (mdb *MemoryStateDB) GetNonce(addr string) uint64
- func (mdb *MemoryStateDB) GetReceiptLogs(addr string) (logs []*types.ReceiptLog)
- func (mdb *MemoryStateDB) GetRefund() uint64
- func (mdb *MemoryStateDB) GetState(addr string, key common.Hash) common.Hash
- func (mdb *MemoryStateDB) HasSuicided(addr string) bool
- func (mdb *MemoryStateDB) Prepare(txHash common.Hash, txIndex int)
- func (mdb *MemoryStateDB) PrintLogs()
- func (mdb *MemoryStateDB) ResetDatas()
- func (mdb *MemoryStateDB) RevertToSnapshot(version int)
- func (mdb *MemoryStateDB) SetAbi(addr, abi string)
- func (mdb *MemoryStateDB) SetCode(addr string, code []byte)
- func (mdb *MemoryStateDB) SetNonce(addr string, nonce uint64)
- func (mdb *MemoryStateDB) SetState(addr string, key common.Hash, value common.Hash)
- func (mdb *MemoryStateDB) Snapshot() int
- func (mdb *MemoryStateDB) SubBalance(addr, caddr string, value uint64)
- func (mdb *MemoryStateDB) Suicide(addr string) bool
- func (mdb *MemoryStateDB) Transfer(sender, recipient string, amount uint64) bool
- func (mdb *MemoryStateDB) TransferStateData(addr string)
- func (mdb *MemoryStateDB) UpdateState(addr string)
- func (mdb *MemoryStateDB) WritePreimages(number int64)
- type Snapshot
- type TransferType
- type TxData
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ProcessFork ¶
func ProcessFork(cfg *types.Chain33Config, blockHeight int64, txHash []byte, receipt *types.Receipt)
ProcessFork 处理硬分叉逻辑
Types ¶
type BlockData ¶
type BlockData struct {
// contains filtered or unexported fields
}
BlockData 本文件用来存储硬分叉中需要用到的数据
type ContractAccount ¶
type ContractAccount struct { // Addr 合约代码地址 Addr string // Data 合约固定数据 Data evmtypes.EVMContractData // State 合约状态数据 State evmtypes.EVMContractState // contains filtered or unexported fields }
ContractAccount 合约账户对象
func NewContractAccount ¶
func NewContractAccount(addr string, db *MemoryStateDB) *ContractAccount
NewContractAccount 创建一个新的合约对象 注意,此时合约对象有可能已经存在也有可能不存在 需要通过LoadContract进行判断
func (*ContractAccount) BuildDataLog ¶
func (ca *ContractAccount) BuildDataLog() (log *types.ReceiptLog)
BuildDataLog 构建变更日志
func (*ContractAccount) BuildStateLog ¶
func (ca *ContractAccount) BuildStateLog() (log *types.ReceiptLog)
BuildStateLog 构建变更日志
func (*ContractAccount) GetAliasName ¶
func (ca *ContractAccount) GetAliasName() string
GetAliasName 获取合约别名
func (*ContractAccount) GetCreator ¶
func (ca *ContractAccount) GetCreator() string
GetCreator 获取创建者
func (*ContractAccount) GetDataKV ¶
func (ca *ContractAccount) GetDataKV() (kvSet []*types.KeyValue)
GetDataKV 合约固定数据,包含合约代码,以及代码哈希
func (*ContractAccount) GetDataKey ¶
func (ca *ContractAccount) GetDataKey() []byte
GetDataKey 获取数据KEY
func (*ContractAccount) GetExecName ¶
func (ca *ContractAccount) GetExecName() string
GetExecName 获取合约明名称
func (*ContractAccount) GetState ¶
func (ca *ContractAccount) GetState(key common.Hash) common.Hash
GetState 获取状态数据; 获取数据分为两层,一层是从当前的缓存中获取,如果获取不到,再从localdb中获取
func (*ContractAccount) GetStateKV ¶
func (ca *ContractAccount) GetStateKV() (kvSet []*types.KeyValue)
GetStateKV 获取合约状态数据,包含nonce、是否自杀、存储哈希、存储数据
func (*ContractAccount) GetStateKey ¶
func (ca *ContractAccount) GetStateKey() []byte
GetStateKey 获取状态key
func (*ContractAccount) HasSuicided ¶
func (ca *ContractAccount) HasSuicided() bool
HasSuicided 是否已经自杀
func (*ContractAccount) LoadContract ¶
func (ca *ContractAccount) LoadContract(db db.KV)
LoadContract 从数据库中加载合约信息(在只有合约地址的情况下)
func (*ContractAccount) SetAliasName ¶
func (ca *ContractAccount) SetAliasName(alias string)
SetAliasName 设置合约别名
func (*ContractAccount) SetCode ¶
func (ca *ContractAccount) SetCode(code []byte)
SetCode 设置合约二进制代码 会同步生成代码哈希
func (*ContractAccount) SetCreator ¶
func (ca *ContractAccount) SetCreator(creator string)
SetCreator 设置创建者
func (*ContractAccount) SetExecName ¶
func (ca *ContractAccount) SetExecName(execName string)
SetExecName 设置合约名称
func (*ContractAccount) SetNonce ¶
func (ca *ContractAccount) SetNonce(nonce uint64)
SetNonce 设置nonce值
func (*ContractAccount) SetState ¶
func (ca *ContractAccount) SetState(key, value common.Hash)
SetState 设置状态数据
func (*ContractAccount) TransferState ¶
func (ca *ContractAccount) TransferState()
TransferState 从原有的存储在一个对象,将状态数据分散存储到多个KEY,保证合约可以支撑大量状态数据
type DataChange ¶
type DataChange interface {
// contains filtered or unexported methods
}
DataChange 数据状态变更接口 所有的数据状态变更事件实现此接口,并且封装各自的变更数据以及回滚动作 在调用合约时(具体的Tx执行时),会根据操作生成对应的变更对象并缓存下来 如果合约执行出错,会按生成顺序的倒序,依次调用变更对象的回滚接口进行数据回滚,并同步删除变更对象缓存 如果合约执行成功,会按生成顺序的郑旭,依次调用变更对象的数据和日志变更记录,回传给区块链
type EVMStateDB ¶
type EVMStateDB interface { // CreateAccount 创建新的合约对象 CreateAccount(string, string, string, string) // SubBalance 从指定地址扣除金额 SubBalance(string, string, uint64) // AddBalance 向指定地址增加金额 AddBalance(string, string, uint64) // GetBalance 获取指定地址的余额 GetBalance(string) uint64 // GetNonce 获取nonce值(只有合约对象有,外部对象为0) GetNonce(string) uint64 // SetNonce 设置nonce值(只有合约对象有,外部对象为0) SetNonce(string, uint64) // GetCodeHash 获取指定地址合约的代码哈希 GetCodeHash(string) common.Hash // GetCode 获取指定地址合约代码 GetCode(string) []byte // SetCode 设置指定地址合约代码 SetCode(string, []byte) // GetCodeSize 获取指定地址合约代码大小 GetCodeSize(string) int // SetAbi 设置ABI内容 SetAbi(addr, abi string) // GetAbi 获取ABI GetAbi(addr string) string // AddRefund 合约Gas奖励回馈 AddRefund(uint64) // GetRefund 获取合约Gas奖励 GetRefund() uint64 // GetState 获取合约状态数据 GetState(string, common.Hash) common.Hash // SetState 设置合约状态数据 SetState(string, common.Hash, common.Hash) // Suicide 合约自销毁 Suicide(string) bool // HasSuicided 合约是否已经销毁 HasSuicided(string) bool // Exist 判断一个合约地址是否存在(已经销毁的合约地址对象依然存在) Exist(string) bool // Empty 判断一个合约地址是否为空(不包含任何代码、也没有余额的合约为空) Empty(string) bool // RevertToSnapshot 回滚到制定版本(从当前版本到回滚版本之间的数据变更全部撤销) RevertToSnapshot(int) // Snapshot 生成一个新版本号(递增操作) Snapshot() int // TransferStateData 转换合约状态数据存储 TransferStateData(addr string) // AddLog 添加新的日志信息 AddLog(*model.ContractLog) // AddPreimage 添加sha3记录 AddPreimage(common.Hash, []byte) // CanTransfer 当前账户余额是否足够转账 CanTransfer(sender, recipient string, amount uint64) bool // Transfer 转账交易 Transfer(sender, recipient string, amount uint64) bool // GetBlockHeight 返回当前区块高度 GetBlockHeight() int64 // GetConfig 获取系统配置 GetConfig() *types.Chain33Config }
EVMStateDB 状态数据库封装,面向EVM业务执行逻辑; 生命周期为一个区块,在同一个区块内多个交易执行时使用的是同一个StateDB实例; StateDB包含区块的状态和交易的状态(当前上下文),所以不支持并发操作,区块内的多个交易只能按顺序单线程执行; StateDB除了查询状态数据,还会保留在交易执行时对数据的变更信息,每个交易完成之后会返回变更影响的数据给执行器;
type MemoryStateDB ¶
type MemoryStateDB struct { // StateDB 状态DB,从执行器框架传入 StateDB db.KV // LocalDB 本地DB,从执行器框架传入 LocalDB db.KVDB // CoinsAccount Coins账户操作对象,从执行器框架传入 CoinsAccount *account.DB // contains filtered or unexported fields }
MemoryStateDB 内存状态数据库,保存在区块操作时内部的数据变更操作 本数据库不会直接写文件,只会暂存变更记录 在区块打包完成后,这里的缓存变更数据会被清空(通过区块打包分别写入blockchain和statedb数据库) 在交易执行过程中,本数据库会暂存并变更,在交易执行结束后,会返回变更的数据集,返回给blockchain 执行器的Exec阶段会返回:交易收据、合约账户(包含合约地址、合约代码、合约存储信息) 执行器的ExecLocal阶段会返回:合约创建人和合约的关联信息
func NewMemoryStateDB ¶
func NewMemoryStateDB(StateDB db.KV, LocalDB db.KVDB, CoinsAccount *account.DB, blockHeight int64, api client.QueueProtocolAPI) *MemoryStateDB
NewMemoryStateDB 基于执行器框架的三个DB构建内存状态机对象 此对象的生命周期对应一个区块,在同一个区块内的多个交易执行时共享同一个DB对象 开始执行下一个区块时(执行器框架调用setEnv设置的区块高度发生变更时),会重新创建此DB对象
func (*MemoryStateDB) AddBalance ¶
func (mdb *MemoryStateDB) AddBalance(addr, caddr string, value uint64)
AddBalance 向外部账户地址打钱(钱其实是外部账户之前打到合约账户中的)
func (*MemoryStateDB) AddLog ¶
func (mdb *MemoryStateDB) AddLog(log *model.ContractLog)
AddLog LOG0-4 指令对应的具体操作 生成对应的日志信息,目前这些生成的日志信息会在合约执行后打印到日志文件中
func (*MemoryStateDB) AddPreimage ¶
func (mdb *MemoryStateDB) AddPreimage(hash common.Hash, data []byte)
AddPreimage 存储sha3指令对应的数据
func (*MemoryStateDB) AddRefund ¶
func (mdb *MemoryStateDB) AddRefund(gas uint64)
AddRefund 合约自杀或SSTORE指令时,返还Gas
func (*MemoryStateDB) CanTransfer ¶
func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) bool
CanTransfer 借助coins执行器进行转账相关操作
func (*MemoryStateDB) CreateAccount ¶
func (mdb *MemoryStateDB) CreateAccount(addr, creator string, execName, alias string)
CreateAccount 创建一个新的合约账户对象
func (*MemoryStateDB) GetAccount ¶
func (mdb *MemoryStateDB) GetAccount(addr string) *ContractAccount
GetAccount 从缓存中获取或加载合约账户
func (*MemoryStateDB) GetBalance ¶
func (mdb *MemoryStateDB) GetBalance(addr string) uint64
GetBalance 这里需要区分对待,如果是合约账户,则查看合约账户所有者地址在此合约下的余额; 如果是外部账户,则直接返回外部账户的余额
func (*MemoryStateDB) GetBlockHeight ¶
func (mdb *MemoryStateDB) GetBlockHeight() int64
GetBlockHeight 返回当前区块高度
func (*MemoryStateDB) GetChangedData ¶
func (mdb *MemoryStateDB) GetChangedData(version int) (kvSet []*types.KeyValue, logs []*types.ReceiptLog)
GetChangedData 获取本次操作所引起的状态数据变更 因为目前执行器每次执行都是一个新的MemoryStateDB,所以,所有的快照都是从0开始的, 这里获取的应该是从0到目前快照的所有变更; 另外,因为合约内部会调用其它合约,也会产生数据变更,所以这里返回的数据,不止是一个合约的数据。
func (*MemoryStateDB) GetCode ¶
func (mdb *MemoryStateDB) GetCode(addr string) []byte
GetCode 获取代码内容
func (*MemoryStateDB) GetCodeHash ¶
func (mdb *MemoryStateDB) GetCodeHash(addr string) common.Hash
GetCodeHash 获取代码哈希
func (*MemoryStateDB) GetCodeSize ¶
func (mdb *MemoryStateDB) GetCodeSize(addr string) int
GetCodeSize 获取合约代码自身的大小 对应 EXTCODESIZE 操作码
func (*MemoryStateDB) GetConfig ¶
func (mdb *MemoryStateDB) GetConfig() *types.Chain33Config
GetConfig 获取系统配置
func (*MemoryStateDB) GetLastSnapshot ¶
func (mdb *MemoryStateDB) GetLastSnapshot() *Snapshot
GetLastSnapshot 获取最后一次成功的快照版本号
func (*MemoryStateDB) GetNonce ¶
func (mdb *MemoryStateDB) GetNonce(addr string) uint64
GetNonce 目前chain33中没有保留账户的nonce信息,这里临时添加到合约账户中; 所以,目前只有合约对象有nonce值
func (*MemoryStateDB) GetReceiptLogs ¶
func (mdb *MemoryStateDB) GetReceiptLogs(addr string) (logs []*types.ReceiptLog)
GetReceiptLogs 获取合约对象的变更日志
func (*MemoryStateDB) HasSuicided ¶
func (mdb *MemoryStateDB) HasSuicided(addr string) bool
HasSuicided 判断此合约对象是否已经自杀 自杀的合约对象是不允许调用的
func (*MemoryStateDB) Prepare ¶
func (mdb *MemoryStateDB) Prepare(txHash common.Hash, txIndex int)
Prepare 每一个交易执行之前调用此方法,设置此交易的上下文信息 目前的上下文中包含交易哈希以及交易在区块中的序号
func (*MemoryStateDB) PrintLogs ¶
func (mdb *MemoryStateDB) PrintLogs()
PrintLogs 本合约执行完毕之后打印合约生成的日志(如果有) 这里不保证当前区块可以打包成功,只是在执行区块中的交易时,如果交易执行成功,就会打印合约日志
func (*MemoryStateDB) RevertToSnapshot ¶
func (mdb *MemoryStateDB) RevertToSnapshot(version int)
RevertToSnapshot 将数据状态回滚到指定快照版本(中间的版本数据将会被删除)
func (*MemoryStateDB) SetCode ¶
func (mdb *MemoryStateDB) SetCode(addr string, code []byte)
SetCode 设置代码内容
func (*MemoryStateDB) SetNonce ¶
func (mdb *MemoryStateDB) SetNonce(addr string, nonce uint64)
SetNonce 设置nonce值
func (*MemoryStateDB) Snapshot ¶
func (mdb *MemoryStateDB) Snapshot() int
Snapshot 对当前的数据状态打快照,并生成快照版本号,方便后面回滚数据
func (*MemoryStateDB) SubBalance ¶
func (mdb *MemoryStateDB) SubBalance(addr, caddr string, value uint64)
SubBalance 从外部账户地址扣钱(钱其实是打到合约账户中的)
func (*MemoryStateDB) Suicide ¶
func (mdb *MemoryStateDB) Suicide(addr string) bool
Suicide SELFDESTRUCT 合约对象自杀 合约自杀后,合约对象依然存在,只是无法被调用,也无法恢复
func (*MemoryStateDB) Transfer ¶
func (mdb *MemoryStateDB) Transfer(sender, recipient string, amount uint64) bool
Transfer 借助coins执行器进行转账相关操作 只支持 合约账户到合约账户,其它情况不支持
func (*MemoryStateDB) TransferStateData ¶
func (mdb *MemoryStateDB) TransferStateData(addr string)
TransferStateData 转换合约状态数据存储
func (*MemoryStateDB) UpdateState ¶
func (mdb *MemoryStateDB) UpdateState(addr string)
UpdateState 表示合约地址的状态数据发生了变更,需要进行更新
func (*MemoryStateDB) WritePreimages ¶
func (mdb *MemoryStateDB) WritePreimages(number int64)
WritePreimages 打印本区块内生成的preimages日志
type Snapshot ¶
type Snapshot struct {
// contains filtered or unexported fields
}
Snapshot 版本结构,包含版本号以及当前版本包含的变更对象在变更序列中的开始序号
type TransferType ¶
type TransferType int
TransferType 定义转账类型
const ( // NoNeed 无需转账 NoNeed TransferType // ToExec 向合约转账 ToExec // FromExec 从合约转入 FromExec // Error 处理出错 Error )