区块链

blockchain组件就是区块链结构的持久化存储,全网统一维护的链结构。 注意:该结构中并不存储具体的交易数据和交易执行的结果,这部分数据存储在yudb中。

接口

具体实现的代码在这里
blockchain实现了基本的链结构的存储和处理逻辑。以下为核心功能的接口,开发者如有需求,可自行定制属于自己的链存储方式和处理逻辑:

func ConvergeType() ConvergeType

ConvergeType()返回链的收敛类型(即区块以何种形式被最终确定下来) 众所周知,在区块链中,同一个时刻是可能有多个节点出块的,因此形成分叉。 如果不收敛,系统会不知道哪条链为主链的。所以需要收敛,而收敛方式目前最常见的有几种:
最长子链(Longest): 最长的那条分支会被认为是主链,该方式会被回滚。
最重子链(Heaviest): 子链数量最多的分叉会被认为是主链, 该方式会被回滚。
敲定(Finalize): 通过投票等方式对区块或者链进行投票 来最终敲定某个分叉成为主链,正常情况下被敲定的区块无法被回滚。

func GetGenesis() (*CompactBlock, error)
func SetGenesis(b *CompactBlock) error

从链内获取创世区块,把创世区块存入链。

func AppendBlock(b *CompactBlock) error
func GetBlock(blockHash Hash) (*CompactBlock, error)
func UpdateBlock(b *CompactBlock) error

AppendBlock(block)将区块加入到链的末尾
GetBlock(blockHash)根据区块哈希获取具体的区块
UpdateBlock(block)以区块哈希为索引更新区块数据

func Children(prevBlockHash Hash) ([]*CompactBlock, error)  
func Finalize(blockHash Hash) error  
func GetEndBlock() (*CompactBlock, error)
func LastFinalized() (*CompactBlock, error)

Children(blockHash) 根据一个区块哈希获取它的所有子区块
Finalize(blockHash) 最终共识敲定一个区块
GetEndBlock() 获取最后一个未敲定区块
LastFinalized() 获取最后一个敲定的区块