http://www.7klian.com

一文读懂插件化共鸣机制

└── storage

一、整体设计

    }
GO  = GO111MODULE=on go
//动静布局体
    repeated bytes txHashes = 1; //生意业务哈希列表
包括共鸣区块部门,Step接口吸收四种范例的动静布局:
SHELL := /bin/bash
主节点将Ready提交到Raft共鸣引擎中,在集群的共鸣完成后的出块阶段,按照Ready布局体的生意业务哈希列表和区块高度重组区块,当区块结构完成后则通过Commit接口返回,打包好的区块随后转入执行引擎执行区块内部的生意业务,执行完成后交与存储层举办耐久化。
  plugin = “plugins/raft.so”

共鸣插件模块:主要是共鸣插件接口的实现逻辑,包括吸收生意业务,节点共鸣,打包出块,区块确认等成果的封装。
    bytes data = 3; //动静数据
接入共鸣算法插件应修改节点的bitxhub.toml,该文件在中继链的设置目次中。
CURRENT_PATH = $(shell pwd)
对付跨链场景来说,一个较量棘手的问题是差异种类共鸣算法接入的适配差异。为了简化差异共鸣算法的适配问题,我们在中继链中回收了插件机制,个中共鸣算法主要认真生意业务的打包和区块简直认,而所有详细在共鸣算法长举办操纵的部门全部封装到共鸣算法插件中,并凭据中继链与共鸣算法交互的需求确定了一套适合的插件接口。
│   ├── agency.cert

需要提供的接口主要分为以下四个部门:
>ReportState接口

在BitXHub跨链体系中,中继链的共鸣算法是不行或缺的一个重要构成部门。共鸣算法是用于担保中继链系统的一致性,这里的一致性包罗生意业务顺序的一致性、账本一致性、节点状态的一致性等。由于跨链场景的差异,中继链提供一种可插拔的共鸣算法插件机制,利便接入差异种类的共鸣算法。本文主要对共鸣算法的整体设计,接口设计和插件化编译与接入举办先容。
我们回收Go语言提供的插件模式,实现中继链对付插件的动态加载。首先,编写Makefile编译文件:
>插件接入
├── plugins
· 共鸣动静(CONSENSUS)范例:由Raft发送的共鸣动静,个中动静的内容主要有共鸣的日志信息、日志索引以及当前的任期信息等。
· 响应生意业务(GET_TX_ACK)范例:和获取生意业务范例相对应,丢失生意业务的节点获取到其它节点发送的生意业务后,将生意业务存入生意业务池中举办出块。
./
· 吸收生意业务:吸收来自API层传入的生意业务,将生意业务注入生意业务池模块中,随后通过节点的网络模块广播生意业务;
│   └── node.priv
>Prepare接口
        GET_TX = 2; //获取生意业务范例
包括按时出块和区块打包阶段,Commit接口返回的是一个通道,该通道包括共鸣完成后的区块布局信息。生意业务在进入生意业务池后,集群中的主节点会按时从生意业务池中收集生意业务,将收集好的生意业务构成生意业务哈希列表,团结当前的块高构建成共鸣动静的布局体Ready。
   $(GO) build –buildmode=plugin -o build/raft.so etcdraft/*.go
│   ├── raft.so //共鸣算法插件
包括区块确认阶段,ReportState接口吸收的是执行引擎刚执行完区块的高度和哈希,中继链挪用该接口通知插件共鸣的区块生意业务已经执行完成而且耐久化了。通过该接口,共鸣算法插件可以完成一些区块的收尾事情,好比记录当前共鸣日志的索引、耐久化布隆过滤器的filter,删除冗余的区块生意业务等等。
├── bitxhub.toml

>插件编译
· 节点共鸣:包括当前漫衍式节点共鸣状态简直认以及网络的共鸣通信,,共鸣状态可以判定当前漫衍式网络是否已经筹备停当,筹备停当的尺度之一是已经选举出主节点。网络的共鸣通信是节点的共鸣动静通信,好比节点选举通信、节点共鸣动静通信、节点设置变换通信等等;
├── start.sh
│   ├── ca.cert
三、插件编译与接入
        BROADCAST_TX = 1; //广播生意业务范例
$ make plugin
message RaftMessage {
├── logs
· 打包出块:节点收到共鸣动静后,按照出块时间按时收集生意业务出块。
plugin:
├── order.toml //共鸣算法设置文件
├── network.toml
团结我们提供的中继链,就能接入到跨链平台来。

这样对付中继链来说,对接任何新范例共鸣算法的时候,都不需要修改自身,而是按照确定的接口开拓一个新的共鸣算法插件即可。
        CONSENSUS = 0; //共鸣动静范例
├── key.json
├── api
    enum Type {

生意业务池模块:主要有生意业务过滤和生意业务排序的成果,为了防备生意业务的重放,每一笔新吸收的生意业务都需要通过布隆过滤器举办过滤。过滤乐成后的生意业务,会注入到生意业务行列中按生意业务时间举办排序,担保生意业务的先来后到和即时确认。

[order]
包括查抄共鸣、查抄生意业务和广播生意业务部门,Prepare接口吸收到gRPC可能Restful处事传入的生意业务后,把吸收的生意业务注入生意业务池中排序,然后将该生意业务广播给集群内的其它节点。假如生意业务在进入生意业务池之前就已经存在,那么Prepare阶段会丢弃该生意业务不举办广播。
· 区块确认:区块的生意业务执行完成并耐久化之后,执行引擎通知共鸣插件模块区块已经确认。

共鸣插件模块的整体设计如图: 

· 广播生意业务(BROADCAST_TX)范例:由其它节点广播的生意业务动静,该节点接管到会将生意业务存在生意业务池中。
message Ready {
   @mkdir -p build
}
│   ├── node.cert
将你编写的动态链接文件和order.toml文件,别离放到节点的plugins文件夹和设置目次下。
>Commit接口
二、接口设计
下面以接入Raft共鸣算法为例,生意业务颠末共鸣模块的流程如图所示:

├── certs
}
    Type type = 1; // 动静范例
运行下面的呼吁,可以或许获得raft.so文件。
        GET_TX_ACK = 3; // 响应生意业务范例
· 获取生意业务(GET_TX)范例:由其它节点发出获取生意业务的请求动静,假如某节点在出块阶段发明部门生意业务不存在生意业务池中,则会向全网异步发送获取丢失生意业务的请求动静。该节点吸收到动静后发明生意业务确实存在生意业务池可能区块的汗青数据中,则将该生意业务发送给丢失生意业务的节点。
>Step接口
//共鸣动静布局体
    uint64 height = 2; //区块高度
    uint64 fromId = 2; //动静来历方

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。