04-XuperChain核心流程
0 XuperChain架构图
核心框架
Xuper Chain主要由 Xuper Core 这个核心引擎来构建。Xuper Core 分为三个部分:
- 基础组件:日志、存储、监控等关键组件,以及密码学库等基本组件。
- 核心组件:包括共识、合约、账本、网络安全模块,这些都是必备的。
- 协议层:各个模块对应的底层网络协议的实现。
Xuper Chain 的整体架构是一个多引擎架构,例如合约模块支持多类智能合约引擎。各模块都是标准化的,并且广域适用,类似于公有链的内容,很多节点都能访问,通过区块链浏览器或其他方式访问到网络。
Xuper Chain 构建了一个开放的网络,我们可以通过 Xuper Chain 的门户查看区块高度、交易总数、合约数等公开数据,也可以通过开放网络进行管理和操作。
1 二阶段交易提交流程
1.1 提交预执行
用户通过客户端或SDK提交合约执行的请求,网络中的任意一个全卡点接受请求
1.2 全节点预执行
全节点收到请求之后进行合约预执行,全节点需要在它本地构建一个沙盒环境去执行这个交易。若执行成功,则返回执行后的读写集给客户端
1.3 提交交易
客户端获取到读写集之后,在本地组装交易,同时用本地私钥进行交易签名,完成之后把完整的交易发送到区块链网络中
1.4 p2p交易广播
任意节点收到来自客户端的提交交易请求后通过p2p网络把交易广播给警个网络,从而让矿工能发现新的交易
1.5 矿工节点区块打包
矿工在收到来自p2p的交易后,通过打包区块把交易组装到一个新的区里面,同时加上自己的签名
1.6 p2p区块广播
矿工打包区块完毕之后,把新的区块通过p2p网络广播给其他节点
1.7 全节点交易验证
其他节点接受到区块后,进行区块的合法性校验,比如签名、共识、交易验证等,验证后就计入本地账本
1.8 交易订阅
客户端通过订阅,了解到自己的交易已经被打包到新的区块,则交易已上链
通过共识算法选出记账节点,然后把交易组装到一个新的区块里,进行签名,然后把区块广播到其他的全节点里,其他的全节点进行交易的验证。若验证通过,就落块,寄到全节点的本地账本里。客户端可通过订阅的方式了解到自己的交易已被打包到新的区块,即交易已上链。
预执行的流程其实就是客户端需要通过 RPC 模块,把预执行请求发送到全节点,然后全节点根据预执行请求构建沙盒环境,在沙盒环境里面查询合约代码,执行智能合约,然后返回读写集给客户端。沙盒环境的作用是做数据隔离,不会对真实的已经在全节点上存储的数据产生影响,因为可能发送来的交易无法通过验证,可能是失败的,也可能是产生冲突的。如果每个交易都执行,那其实是得不偿失的。
合约执行完毕之后会把读写集返回给客户端。区块的打包流程是交易通过 P2P 网络进行合法性的验证,如果验证通过,就会被添加到矿工的交易池里。通过共识算法选出记账节点,这一轮的记账节点从交易池里选出一批交易打包成区块,然后进行签名,把新的区块先写入到自己本地的账本里,然后通过 P2P 网络广播给其他的全节点。其他全节点收到新的区块之后验证签名、交易和状态。如果验证通过,就把区块写入到自己的本地账本里,完成落块,实现区块打包到广播到其他网络节点的全过程。
2 交易预执行流程
2.1 预执行请求提交
- 依据请求参数选择合适的合约虚拟机
- 构造好执行合约所需的沙盒环境:
2.2 执行合约代码
- 依据请求参数链上查询合约代码
- 执行智能合约,合约在沙盒环境中执行,进行资源的读取和写入
- 如果合约执行过程中超资源,合约执行过程直接终止
- 执行期间产生的数据作用于沙盒,不会对真实存储产生影响,保证合约执行的原子性和隔离性
2.3 读写集返回
合约执行完毕,读写集数据返回给客户端。
3 区块打包流程
交易通过p2p网络进行交易合法性验证,包括签名,双花读写集等验证,如果都通过之后就进入到交易池里面。
在共识模块的协调下,选出这一轮的矿工。
矿工从交易池里面选取一批交易进行打包,打包完毕之后进行签名。
矿工在生成新区块之后首先会写入到自己的账本,同时更新状态机以反映最新的状态变化
矿工更新完本地账本之后,通过p2p网络进行新区块的广播其他节点通过p2p网络接收到来自矿工的新区块
从节点在收到一个新的区块之后,对区块链中交易进行验证包括共识、交易、状态,以保证数据的安全性。
一切验证通过之后就把新区块持久化到本地账本,至此完成了区块的打包到广播到其他网络节点的全过程。
获取更多干货内容,记得关注我哦。