項(xiàng)目簡(jiǎn)介
sawtooth是Hyperledger下的一個(gè)開(kāi)源項(xiàng)目,雖然不像fabric那么廣為人知,卻有它獨(dú)到的設(shè)計(jì)和應(yīng)用場(chǎng)景可供借鑒。
項(xiàng)目代碼
主要開(kāi)發(fā)語(yǔ)言采用Python,github上收獲465 stars。
代碼統(tǒng)計(jì)
--------------------------------------------------------------------------------
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
項(xiàng)目文檔地址
與fabric相同,它的文檔應(yīng)該也是采用sphinx制作的。文檔組織形式相當(dāng)簡(jiǎn)潔,而且支持全文檢索。
這篇文章可以作為使用sphinx的教程。
與fabric相似之處
除了文檔采用相同的制作工具,sawtooth還有以下技術(shù)特征與fabric頗為相似:
- 目標(biāo)場(chǎng)景定位為企業(yè)應(yīng)用(聯(lián)盟鏈)
- 提供REST api和cli兩種集成方式
- 采用Protobuf定義協(xié)議消息體
- 支持可插拔的共識(shí)算法
- 提供docker部署鏡像
- 提供Event機(jī)制用于事件傳播和處理
- 采用Merkle樹(shù)作為全局狀態(tài)(Global State)改變的輸出共識(shí)
接下來(lái)聊聊sawtooth的特點(diǎn):
默認(rèn)采用的PoET共識(shí)
比特幣的POW共識(shí)的確是公開(kāi)鏈的簡(jiǎn)單有效的共識(shí)策略,但是一旦切換到聯(lián)盟鏈場(chǎng)景,它通常是最先被換掉的。——它的算力浪費(fèi)遭人詬病。
每次出塊直接樂(lè)透抽獎(jiǎng)選出一個(gè)出塊人,顯然可以極大地提升交易的實(shí)時(shí)性和交易通量,PoET(Proof-of-Elapsed-Time)共識(shí)就是這么干的。
sawtooth使用一個(gè)可信任環(huán)境(TEE)如 Intel? Software Guard Extensions (SGX) 來(lái)隨機(jī)選出一個(gè)出塊人(無(wú)法作弊)。
RepChain的無(wú)協(xié)商隨機(jī)抽簽算法,在每個(gè)節(jié)點(diǎn)都能獲得在網(wǎng)節(jié)點(diǎn)的基礎(chǔ)上,通過(guò)上一區(qū)塊hash隨機(jī)抽簽選出出塊人,達(dá)到的效果是等效的,而且并不需要依賴(lài)特定的硬件支持。
Transactions and Batches
Transaction Families
sawtooth提出了Transaction Families的概念,認(rèn)為在特定的場(chǎng)景下會(huì)使用到特定的交易集合。
在最底層sawtooth提供了幾個(gè)內(nèi)置的核心Transaction Families,包括:
- 驗(yàn)證節(jié)點(diǎn)的注冊(cè)
- 部署測(cè)試
- 配置管理
- 身份及信任證書(shū)管理
核心層之上,sawtooth針對(duì)特定場(chǎng)景提供針對(duì)通用目標(biāo)的Transaction Families:
- 用于性能測(cè)試和分析的Smallbank基準(zhǔn)
- 集成Hyperledger Burrow提供的EVM,支持對(duì)EVM合約的創(chuàng)建和執(zhí)行
- 用于塊鏈信息存儲(chǔ)
在最上層,sawtooth給出了三個(gè)針對(duì)應(yīng)用場(chǎng)景的實(shí)例Transaction Families:
- XO: “井”字格游戲,執(zhí)行交易時(shí)需要驗(yàn)證交易沖突
- Supply Chain:sawtooth用于供應(yīng)鏈的基礎(chǔ)設(shè)施
- Track and Trade:為用戶(hù)跟蹤貨物在供應(yīng)鏈中的移動(dòng)提供了一種方法。 包括:所有權(quán)和保管的歷史,以及各種物業(yè)的歷史,如溫度和位置。
Transaction Batches
多個(gè)Transaction可以打包為T(mén)ransaction Batch,Transaction Batch整體作為原子操作,要么Batch內(nèi)的所有交易都執(zhí)行,要么都不執(zhí)行。Transaction Batch簡(jiǎn)化了客戶(hù)端所需要的事務(wù)操作。
sawtooth允許將來(lái)自不同Transaction Families的交易打包到一個(gè)Batch中,這個(gè)特性簡(jiǎn)化了了功能復(fù)用。
Transaction Batch中必須包含負(fù)責(zé)打包者的公鑰,只有打包者有權(quán)將Batch內(nèi)的交易拆散重新使用。
交易調(diào)度
Executor負(fù)責(zé)交易的執(zhí)行,在Executor之上,Serial Scheduler負(fù)責(zé)串行交易的調(diào)度執(zhí)行,Parallel Scheduler負(fù)責(zé)并行地調(diào)度執(zhí)行交易。
共識(shí)機(jī)制
sawtooth通過(guò)抽象接口,實(shí)現(xiàn)了可插拔的共識(shí)算法。包括以下三類(lèi)接口:
- Consensus.BlockPublisher:負(fù)責(zé)創(chuàng)建候選塊
Consensus.BlockVerifier:負(fù)責(zé)對(duì)候選塊進(jìn)行驗(yàn)證
Consensus.ForkResolver:對(duì)鏈分叉進(jìn)行決策,確定其中一只作為有效鏈
sawtooth的共識(shí)機(jī)制可以作為共識(shí)模塊化設(shè)計(jì)的參考學(xué)習(xí)范例。
開(kāi)發(fā)篇
sawtooth的文檔介紹了三個(gè)方面的開(kāi)發(fā)
應(yīng)用開(kāi)發(fā)
應(yīng)用的開(kāi)發(fā)基于sawtooth提供的SDK或者REST api,應(yīng)用的功能通常體現(xiàn)在構(gòu)造和提交交易,以及查看狀態(tài)。
sawtooth提供了三種語(yǔ)言版本的SDK:java、javascript和Python。
Solidity合約的開(kāi)發(fā)
seth-rpc服務(wù)負(fù)責(zé)以 JSON-RPC接口的方式,將以太坊支持的JavaScript API 連接到sawtooth的validator節(jié)點(diǎn)以及其支持的Seth Transaction Family(用于部署和調(diào)用合約)
核心開(kāi)發(fā)
介紹開(kāi)發(fā)環(huán)境的搭建和部署
總結(jié)
sawtooth是一個(gè)以Python實(shí)現(xiàn)的開(kāi)源區(qū)塊鏈平臺(tái),它提供可插拔的共識(shí)機(jī)制,并內(nèi)置了依賴(lài)硬件的高效的PoET共識(shí)。可應(yīng)用于供應(yīng)鏈追蹤場(chǎng)景(高頻交易)。
sawtooth的合約執(zhí)行采用與EVM兼容的開(kāi)源實(shí)現(xiàn),并直接使用以太坊的javascript API作為自己的合約API。
與fabric只關(guān)注與平臺(tái)不同,sawtooth在項(xiàng)目?jī)?nèi)進(jìn)一步給出了應(yīng)用場(chǎng)景,以及實(shí)現(xiàn)細(xì)節(jié),對(duì)于自行設(shè)計(jì)實(shí)現(xiàn)區(qū)塊鏈平臺(tái),以及探討區(qū)塊鏈的應(yīng)用場(chǎng)景(尤其是應(yīng)用于供應(yīng)鏈追蹤)具有重要的學(xué)習(xí)參考價(jià)值。