Execution 和 Query

正常情况下,开发者们对 ExecutionQuery 会用到的更多一些, 因为这基本是完全业务层面的对外读写接口。所以本节我们看一下在yu当中,如何 使用它们。代码在这里

定义如下:

type (
	Execution func(ctx *Context, currentBlock *CompactBlock) error
	
	Query func(ctx *Context, blockHash Hash) (respObj interface{}, err error)
	
	P2pHandler func([]byte) ([]byte, error)
)
  • Execution在以太坊等其他区块链当中被称作交易, 说到底其实就是一次对于链上状态的写操作, 所以这样的操作会同步到全网。
    当需要修改链上状态的时候, 需要调用 chainEnv.KVDB来进行状态修改。注意, chainEnv.kvdb内的setgetdelete函数的第一个参数必须为当前 tripod 指针, 比如 快速开始里的 e.State.Set(e, ..., ...)
    currentBlock为当前交易所在的区块。
    当需要发送 event到链外的时候,调用 ctx.EmitEvent()

  • Query就是链上查询,它不对链上状态有任何修改,所以该操作并不会被同步到全网。 Query的参数比 Execution多一个 common.Hash, 这个参数是个 区块哈希值, 是用来指定查询某个区块时刻上的历史状态的,如果不是查询历史状态,我们可以忽略这个参数。
    状态查询调用 env.KVDB.Get() 或者 env.KVDB.GetByBlockHash()。前者是查询现在主链上已经达成最终共识的状态;后者是查询具体的某个区块上的 历史状态的。
    respObj用来把查询到的状态值返回到链外。

  • P2pHandler 是定义处理处理来自P2P网络中的请求,比如节点需要广播或者对特定节点发送处理请求的时候,可定制此函数来完成自定义功能。

  • 注入Tripod中:当构建好自己所有的ExecutionQuery的时候, 需要我们调用 tripod.SetExecs()把所有Execution注入到tripod中, 并且调用tripod.SetQueries()把所有Query注入到tripod中。

  • 装填到land里:框架提供了一个 启动入口 只要在启动的时候 把自己构建的所有 tripod 通过调用 StartUp(...Tripod)来完成装填,由此告知框架我们定制了哪些tripod

关于 defaultTripod

当你不需要自定义控制 区块周期 而只想开发 ExecutionQuery 的时候, defaultTripod 便可以帮你少写很多代码, 你需要将它放在你自定义实现的 tripod 结构体的第一个成员变量即可(必须要省略变量名来达到继承 defaultTripod的效果)。如下:

type Example struct {
	*tripod.DefaultTripod
}