tripod

概述

tripod是整个yu框架的核心所在,开发者通过实现它的interface来定义自己的业务逻辑。 它由三部分构成:

  1. 自定义区块验证规则和交易检查逻辑
  2. 控制区块的生命周期从而实现深度定制化开发。生命周期有四个阶段:initChain, startBlock, endBlock, finalizeBlock。 其中只有initChain 是只有在创世区块的时候才被调用的,后面三个是每次区块都会被调用。 (个性化共识算法便可以用区块生命周期来实现)
  3. 自定义 交易(Writing) 、 查询(Query) 和 P2P请求处理(p2pHandler)

接口

代码定义在这里

func Name() string
func SetChainEnv(env *ChainEnv)

Name()返回tripod的名称。
SetChainEnv(*ChainEnv)ChainEnv装填进tripod中,方便后续调用。(ChainEnv介绍在context与chainEnv)

func CheckTxn(*SignedTxn) error
func VerifyBlock(block *Block) bool

checkTxn()是开发者自定义的交易检查逻辑,前面的章节提到过当外部有交易进来插入txpool的时候,会执行BaseCheckTripodsCheck 这两步检查, 而TripodsCheck便是在这里定义,每个tripod都可以定义自己的交易检查逻辑。
VerifyBlock()是开发者自定义的区块校验逻辑,区块链每收到一个外部广播来的区块都需要校验过后才能进行后续处理,不同的链有对区块不同的校验方式,所以 开发者可以自己定制校验逻辑。 每个tripod都可以定义自己的交易检查逻辑。

func InitChain() 
func StartBlock(block *Block) 
func EndBlock(block *Block) 
func FinalizeBlock(block *Block) 

InitChain()只会在区块链启动的时候被调用一次,专门用来定义处理创世区块
StartBlock()定义区块生成时的阶段的逻辑。
EndBlock()定义区块结束时候的逻辑,一般会在这里执行交易并且将区块存入区块链中。
FinalizeBlock()定义区块的敲定阶段(即最终共识)的逻辑。如果区块链是finalize类型的链,则需要定制这部分逻辑,否则便不必要。

依赖注入

我们可能在yu中开发许多个Tripod,而不同的Tripod之间可能存在依赖关系。比如,当开发者开发一个名为质押的 Tripod 的时候,它可能需要依赖资产这个 Tripod。
为了方便开发者更方便的管理Tripod依赖。 yu 提供了依赖注入的功能。

type Staking struct {
	*tripod.Tripod
	asset *asset.Asset `tripod:"asset"`
}

如上所示,已知我们已经有一个Asset Tripod。 现在我们开发质押模块,需要依赖Asset中的 某些函数,那么我们只需要在Staking结构体中声明 asset 变量 并添加tag(tripod:"asset")。
这是个固定语法tripod:<TripodName>,添加完之后,我们只需要正常地启动yu就可以了:

    startup.SyncAndStartup(Staking.New(), asset.NewAsset())

如上简单。 SyncAndStartup()是启动yu的必要步骤,在你的代码里只需调用一次即可, Startup()会自动加载这些Tripod并在运行时完成依赖注入。

land

land用来装载所有的tripod 供框架调用。

land内部流程图

image