state

package
v1.66.3 Latest Latest
Warning

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

Go to latest
Published: Feb 18, 2022 License: BSD-3-Clause Imports: 13 Imported by: 12

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func InitForkData

func InitForkData()

InitForkData 初始化硬分叉数据

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) Empty

func (ca *ContractAccount) Empty() bool

Empty 是否为空对象

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) GetNonce

func (ca *ContractAccount) GetNonce() uint64

GetNonce 获取nonce值

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) SetAbi

func (ca *ContractAccount) SetAbi(abi string)

SetAbi 设置合约绑定的ABI数据

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) Suicide

func (ca *ContractAccount) Suicide() bool

Suicide 自杀

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 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 string, amount uint64) bool

CanTransfer 借助coins执行器进行转账相关操作

func (*MemoryStateDB) CreateAccount

func (mdb *MemoryStateDB) CreateAccount(addr, creator string, execName, alias string)

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

func (*MemoryStateDB) Empty

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

Empty 判断合约对象是否为空

func (*MemoryStateDB) Exist

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

Exist 判断合约对象是否存在

func (*MemoryStateDB) GetAbi

func (mdb *MemoryStateDB) GetAbi(addr string) string

GetAbi 获取ABI

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) GetRefund

func (mdb *MemoryStateDB) GetRefund() uint64

GetRefund 获取奖励

func (*MemoryStateDB) GetState

func (mdb *MemoryStateDB) GetState(addr string, key common.Hash) common.Hash

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

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) ResetDatas

func (mdb *MemoryStateDB) ResetDatas()

ResetDatas 测试用,清空版本数据

func (*MemoryStateDB) RevertToSnapshot

func (mdb *MemoryStateDB) RevertToSnapshot(version int)

RevertToSnapshot 将数据状态回滚到指定快照版本(中间的版本数据将会被删除)

func (*MemoryStateDB) SetAbi

func (mdb *MemoryStateDB) SetAbi(addr, abi string)

SetAbi 设置ABI内容

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) SetState

func (mdb *MemoryStateDB) SetState(addr string, key common.Hash, value common.Hash)

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

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 版本结构,包含版本号以及当前版本包含的变更对象在变更序列中的开始序号

func (*Snapshot) GetID

func (ver *Snapshot) GetID() int

GetID 获取ID

type TransferType

type TransferType int

TransferType 定义转账类型

const (

	// NoNeed 无需转账
	NoNeed TransferType
	// ToExec 向合约转账
	ToExec
	// FromExec 从合约转入
	FromExec
	// Error 处理出错
	Error
)

type TxData

type TxData struct {
	// KV 交易生成的KV数据
	KV map[string][]byte
	// Logs Key 为logType_logIndex
	Logs map[string][]byte
}

TxData 交易数据

Jump to

Keyboard shortcuts

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