state

package
v0.0.0-...-b770cea Latest Latest
Warning

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

Go to latest
Published: Feb 29, 2024 License: BSD-3-Clause Imports: 17 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func InitEvmCheckData

func InitEvmCheckData()

InitEvmCheckData 初始化check数据

func InitForkData

func InitForkData()

InitForkData 初始化硬分叉数据

func ProcessCheck

func ProcessCheck(blockHeight int64, txHash []byte) error

ProcessCheck 处理EVM对交易的检查更正处理

func ProcessFork

func ProcessFork(cfg *types.ChainConfig, 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 转账交易 coins 交易
	Transfer(sender, recipient string, amount uint64) bool

	// GetBlockHeight 返回当前区块高度
	GetBlockHeight() int64
	//GetAccount return contract address info
	GetAccount(addr string) *ContractAccount
	// GetConfig 获取系统配置
	GetConfig() *types.ChainConfig

	// EVM 转移Token
	TransferToToken(from, recipient, symbol string, amount int64) (bool, error)
	//返回Token 合约下symbol 的余额
	TokenBalance(from common.Address, execer string, symbol string) (int64, error)
	//查询代币总量
	TokenSupply(tokensymbol string) (int64, error)
}

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

type EvmTxData

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

TxData 本文件用来存储硬分叉中需要用到的数据

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

func (mdb *MemoryStateDB) GetAccountNonce(addr string) uint64

GetAccountNonce 获取普通地址下的nonce,用于兼容eth签名交易

func (*MemoryStateDB) GetApi

func (mdb *MemoryStateDB) GetApi() client.QueueProtocolAPI

GetApi return QueueProtocolAPI

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.ChainConfig

GetConfig 获取系统配置

func (*MemoryStateDB) GetLastSnapshot

func (mdb *MemoryStateDB) GetLastSnapshot() *Snapshot

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

func (*MemoryStateDB) GetNonce

func (mdb *MemoryStateDB) GetNonce(addr string) uint64

GetNonce 目前chain中没有保留账户的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) TokenBalance

func (mdb *MemoryStateDB) TokenBalance(caller common.Address, execer, tokensymbol string) (int64, error)

TokenBalance 查询token 账户下的余额

func (*MemoryStateDB) TokenSupply

func (mdb *MemoryStateDB) TokenSupply(tokensymbol string) (int64, error)

TokenSupply 获取token 总量

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

func (mdb *MemoryStateDB) TransferToToken(from, recipient, symbol string, amount int64) (bool, error)

TransferToToken evm call token

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