项目简介
sawtooth是Hyperledger下的一个开源项目,虽然不像fabric那么广为人知,却有它独到的设计和应用场景可供借鉴。
项目代码
主要开发语言采用Python,github上收获465 stars。
代码统计
--------------------------------------------------------------------------------
Language files blank comment code
--------------------------------------------------------------------------------
Python 366 14493 19483 49055
C/C++ Header 38 2718 5697 8843
Go 78 1553 2036 8419
YAML 75 462 1067 6404
C++ 29 815 934 4383
Rust 31 804 560 4371
JSON 6 0 0 2893
Bourne Again Shell 39 341 395 1701
C 2 161 227 1483
JavaScript 22 360 628 1397
Java 19 316 457 1334
Protocol Buffers 32 372 1000 1110
项目文档地址
与fabric相同,它的文档应该也是采用sphinx制作的。文档组织形式相当简洁,而且支持全文检索。
这篇文章可以作为使用sphinx的教程。
与fabric相似之处
除了文档采用相同的制作工具,sawtooth还有以下技术特征与fabric颇为相似:
- 目标场景定位为企业应用(联盟链)
- 提供REST api和cli两种集成方式
- 采用Protobuf定义协议消息体
- 支持可插拔的共识算法
- 提供docker部署镜像
- 提供Event机制用于事件传播和处理
- 采用Merkle树作为全局状态(Global State)改变的输出共识
接下来聊聊sawtooth的特点:
默认采用的PoET共识
比特币的POW共识的确是公开链的简单有效的共识策略,但是一旦切换到联盟链场景,它通常是最先被换掉的。——它的算力浪费遭人诟病。
每次出块直接乐透抽奖选出一个出块人,显然可以极大地提升交易的实时性和交易通量,PoET(Proof-of-Elapsed-Time)共识就是这么干的。
sawtooth使用一个可信任环境(TEE)如 Intel® Software Guard Extensions (SGX) 来随机选出一个出块人(无法作弊)。
RepChain的无协商随机抽签算法,在每个节点都能获得在网节点的基础上,通过上一区块hash随机抽签选出出块人,达到的效果是等效的,而且并不需要依赖特定的硬件支持。
Transactions and Batches
Transaction Families
sawtooth提出了Transaction Families的概念,认为在特定的场景下会使用到特定的交易集合。
在最底层sawtooth提供了几个内置的核心Transaction Families,包括:
- 验证节点的注册
- 部署测试
- 配置管理
- 身份及信任证书管理
核心层之上,sawtooth针对特定场景提供针对通用目标的Transaction Families:
- 用于性能测试和分析的Smallbank基准
- 集成Hyperledger Burrow提供的EVM,支持对EVM合约的创建和执行
- 用于块链信息存储
在最上层,sawtooth给出了三个针对应用场景的实例Transaction Families:
- XO: “井”字格游戏,执行交易时需要验证交易冲突
- Supply Chain:sawtooth用于供应链的基础设施
- Track and Trade:为用户跟踪货物在供应链中的移动提供了一种方法。 包括:所有权和保管的历史,以及各种物业的历史,如温度和位置。
Transaction Batches
多个Transaction可以打包为Transaction Batch,Transaction Batch整体作为原子操作,要么Batch内的所有交易都执行,要么都不执行。Transaction Batch简化了客户端所需要的事务操作。
sawtooth允许将来自不同Transaction Families的交易打包到一个Batch中,这个特性简化了了功能复用。
Transaction Batch中必须包含负责打包者的公钥,只有打包者有权将Batch内的交易拆散重新使用。
交易调度
Executor负责交易的执行,在Executor之上,Serial Scheduler负责串行交易的调度执行,Parallel Scheduler负责并行地调度执行交易。
共识机制
sawtooth通过抽象接口,实现了可插拔的共识算法。包括以下三类接口:
- Consensus.BlockPublisher:负责创建候选块
Consensus.BlockVerifier:负责对候选块进行验证
Consensus.ForkResolver:对链分叉进行决策,确定其中一只作为有效链
sawtooth的共识机制可以作为共识模块化设计的参考学习范例。
开发篇
sawtooth的文档介绍了三个方面的开发
应用开发
应用的开发基于sawtooth提供的SDK或者REST api,应用的功能通常体现在构造和提交交易,以及查看状态。
sawtooth提供了三种语言版本的SDK:java、javascript和Python。
Solidity合约的开发
seth-rpc服务负责以 JSON-RPC接口的方式,将以太坊支持的JavaScript API 连接到sawtooth的validator节点以及其支持的Seth Transaction Family(用于部署和调用合约)
核心开发
介绍开发环境的搭建和部署
总结
sawtooth是一个以Python实现的开源区块链平台,它提供可插拔的共识机制,并内置了依赖硬件的高效的PoET共识。可应用于供应链追踪场景(高频交易)。
sawtooth的合约执行采用与EVM兼容的开源实现,并直接使用以太坊的javascript API作为自己的合约API。
与fabric只关注与平台不同,sawtooth在项目内进一步给出了应用场景,以及实现细节,对于自行设计实现区块链平台,以及探讨区块链的应用场景(尤其是应用于供应链追踪)具有重要的学习参考价值。