Writing 和 Reading
正常情况下,开发者们对 Writing
和 Reading
会用到的更多一些, 因为这基本是完全业务层面的对外读写接口。所以本节我们看一下在yu
当中,如何
使用它们。代码在这里
定义如下:
type (
Writing func(ctx *WriteContext) error
Reading func(ctx *ReadContext) error
P2pHandler func([]byte) ([]byte, error)
)
-
Writing
在以太坊等其他区块链当中被称作交易
, 说到底其实就是一次对于链上状态的写操作
, 所以这样的操作会同步到全网。
当需要修改链上状态的时候, 需要调用chainEnv.KVDB
来进行状态修改。注意,chainEnv.kvdb
内的set
、get
、delete
函数的第一个参数必须为当前tripod
指针, 比如 快速开始里的e.State.Set(e, ..., ...)
currentBlock
为当前交易所在的区块。
当需要发送event
到链外的时候,调用ctx.EmitEvent()
。 -
Reading
就是链上查询,它不对链上状态有任何修改,所以该操作并不会被同步到全网。
状态查询调用env.KVDB.Get()
或者env.KVDB.GetByBlockHash()
。前者是查询现在主链上已经达成最终共识的状态;后者是查询具体的某个区块上的 历史状态的。
respObj
用来把查询到的状态值返回到链外。 -
P2pHandler
是定义处理处理来自P2P网络中的请求,比如节点需要广播或者对特定节点发送处理请求的时候,可定制此函数来完成自定义功能。 -
注入Tripod中
:当构建好自己所有的Writing
和Reading
的时候, 需要我们调用tripod.SetWritings()
把所有Writing
注入到tripod
中, 并且调用tripod.SetReadings()
把所有Reading
注入到tripod
中。 -
装填到land里
:框架提供了一个 启动入口 只要在启动的时候 把自己构建的所有tripod
通过调用SyncAndStartup(...Tripod)
来完成装填,由此告知框架我们定制了哪些tripod
。
关于 defaultTripod
当你不需要自定义控制 区块周期
而只想开发 Writing
和 Reading
的时候, defaultTripod
便可以帮你少写很多代码, 你需要将它放在你自定义实现的 tripod
结构体的第一个成员变量即可(必须要省略变量名来达到继承 defaultTripod
的效果)。如下:
type Example struct {
*tripod.Tripod
}