日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

拜占庭共识Tendermint介绍及简单入门

發(fā)布時(shí)間:2023/12/31 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拜占庭共识Tendermint介绍及简单入门 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.Tendermint是什么

  Tenermint 是一個(gè)軟件,用于在多臺(tái)機(jī)器安全一致地復(fù)制一個(gè)應(yīng)用。所謂安全,指的是即使有多達(dá) 1/3 的機(jī)器出現(xiàn)任意故障的情況下, Tendermint 仍然能夠正常工作。所謂一致,指的是每一個(gè)正常工作的機(jī)器都會(huì)有著同樣的交易日志,計(jì)算相同的狀態(tài)。安全一致的復(fù)制是分布式系統(tǒng)中一個(gè)至關(guān)重要的問(wèn)題:從貨幣到選舉,到基礎(chǔ)設(shè)施規(guī)劃,它在廣泛應(yīng)用的容錯(cuò)中承擔(dān)了一個(gè)極其重要的角色。

  能夠容忍機(jī)器以任何一種,甚至包括危害系統(tǒng)的方式發(fā)生故障,被稱(chēng)為拜占庭容錯(cuò)(BFT)。拜占庭理論已經(jīng)有幾十年的歷史,但是很大程度上,直到最近像比特幣,以太坊這樣區(qū)塊鏈技術(shù)的成功,它的軟件實(shí)現(xiàn)才得以進(jìn)一步發(fā)展。區(qū)塊鏈技術(shù)只是以一種現(xiàn)代化的方式對(duì) BFT 的再形式化,而且重點(diǎn)關(guān)注 p2p 網(wǎng)絡(luò)和密碼驗(yàn)證。區(qū)塊鏈這個(gè)名詞來(lái)源于交易的處理方式,通過(guò)區(qū)塊的批量方式處理交易,每個(gè)塊包含了前一個(gè)塊的加密哈希,以此來(lái)形成一個(gè)鏈。實(shí)際上,區(qū)塊鏈數(shù)據(jù)庫(kù)真正地優(yōu)化了 BFT 設(shè)計(jì)。

  Tendermint 包含了兩個(gè)主要的技術(shù)組件:一個(gè)區(qū)塊鏈共識(shí)引擎和一個(gè)通用的應(yīng)用程序接口。共識(shí)引擎,叫做 Tendermint Core,保證了每一臺(tái)機(jī)器以相同的順序記錄同一筆交易。應(yīng)用程序接口,叫做應(yīng)用程序區(qū)塊鏈接口(ABCI),保證了交易可以通過(guò)任何一種編程語(yǔ)言進(jìn)行處理。與其他預(yù)先打包內(nèi)置狀態(tài)機(jī)(比如鍵值存儲(chǔ)或者一個(gè)奇怪的腳本語(yǔ)言)的區(qū)塊鏈和共識(shí)方案不同,開(kāi)發(fā)者可以使用 Tendermint 實(shí)現(xiàn)應(yīng)用的 BFT 狀態(tài)機(jī)復(fù)制,而這些應(yīng)用可以用任何語(yǔ)言編寫(xiě),而且開(kāi)發(fā)環(huán)境對(duì)開(kāi)發(fā)者也十分友好。
  Tendermint 的設(shè)計(jì)原則是易使用,易理解,高性能,對(duì)于各種分布式應(yīng)用都十分有用。
  Tendermint 說(shuō)明文檔:https://tendermint.readthedocs.io/en/master/
  Tendermint 地址:https://github.com/tendermint/tendermint

Tendermint 與其他技術(shù)的比較

  大體上, Tendermint 與兩類(lèi)軟件很類(lèi)似。第一類(lèi)包含了分布式的鍵值存儲(chǔ),比如 Zookeeper,etcd 和 consul,它們都使用了非拜占庭容錯(cuò)共識(shí)。第二類(lèi)就是 “區(qū)塊鏈技術(shù)”,它既包括了像比特幣和以太坊這樣的加密貨幣,也包括了像 Hyperledger Burrow 這樣的分布式賬本設(shè)計(jì)。

Zookeeper, etcd, consul

  Zookeeper,etcd 和 consul 都是在一個(gè)經(jīng)典的非拜占庭容錯(cuò)共識(shí)算法上, 實(shí)現(xiàn)了一個(gè)鍵值存儲(chǔ)。Zookeeper 使用了 Paxos 一個(gè)叫做 Zookeeper Atomic Broadcast 的版本,而 etcd 和 consul 則使用了更年輕,也更簡(jiǎn)單的 Raft 共識(shí)算法。一個(gè)典型的集群由 3-5 臺(tái)機(jī)器構(gòu)成,雖然可以承受 1/2 的機(jī)器發(fā)生問(wèn)題,但是只要發(fā)生一次拜占庭故障,整個(gè)系統(tǒng)就可能被摧毀。它們每一個(gè)都提供了一個(gè)稍微有別于鍵值存儲(chǔ)的實(shí)現(xiàn),但是都將關(guān)注點(diǎn)放在提供分布式系統(tǒng)的基礎(chǔ)服務(wù)上,比如動(dòng)態(tài)配置,服務(wù)發(fā)現(xiàn),鎖定,領(lǐng)導(dǎo)人選取等等。
Tendermint 是一個(gè)本質(zhì)上類(lèi)似的軟件,不過(guò)有兩點(diǎn)關(guān)鍵不同:它是拜占庭容錯(cuò)的,這意味著它可以承受 1/3 機(jī)器發(fā)生任意形式的故障 – 包括黑客和惡意攻擊。
  它并不像鍵值存儲(chǔ),是針對(duì)某一指定類(lèi)型的應(yīng)用。相反,它關(guān)注于任意的狀態(tài)機(jī)復(fù)制,因此開(kāi)發(fā)者可以量身打造適合自己的應(yīng)用邏輯,從鍵值存儲(chǔ)到加密貨幣到電子投票平臺(tái),甚至更多的應(yīng)用都可適用。

Bitcoin, Ethereum, etc.

  在比特幣和以太坊這樣的傳統(tǒng)加密貨幣下出現(xiàn)了 Tendermint,它的目的在于提供一個(gè)比比特幣的工作量證明更加有效和安全的共識(shí)算法。在早期,Tendermint 內(nèi)置了一個(gè)簡(jiǎn)單的貨幣來(lái)參與共識(shí),用戶(hù)必須向一個(gè)保證金賬戶(hù)中“綁定”一定數(shù)量的貨幣,如果他們表現(xiàn)不端,這些錢(qián)就會(huì)被收回 – 這一點(diǎn)使得 Tendermint 成為一個(gè) POS 算法。
  自那時(shí)起,Tendermint 就進(jìn)化為一個(gè)能夠承載任意應(yīng)用狀態(tài)的通用區(qū)塊鏈共識(shí)引擎。這意味著它可以成為其他區(qū)塊鏈軟件共識(shí)引擎的一個(gè)即插即用的替代品。所以基于當(dāng)前的以太坊代碼庫(kù),無(wú)論是用何種語(yǔ)言, Rust,Go,Haskell,任何人都可以使用 Tendermint 共識(shí)運(yùn)行一個(gè) ABCI 應(yīng)用。實(shí)際上,我們已經(jīng)完成了這一點(diǎn)(ethermint)。此外,我們也計(jì)劃為 Bitcoin,ZCash,和其他確定性的應(yīng)用完成同樣的工作。另一個(gè)基于 Tendermint 構(gòu)建的加密貨幣應(yīng)用是 Cosmos。

Fabric, Burrow

  Fabric 0.6 采用了與 Tendermint 類(lèi)似的方法,但是它更關(guān)注對(duì)狀態(tài)的管理,并且要求所有的應(yīng)用行為能夠在多個(gè) docker 容器,叫做 “chaincode” 的模塊中運(yùn)行。它使用了來(lái)自 IBM (augmented to handle potentially non-deterministic chaincode) 的 PBFT 實(shí)現(xiàn)。通過(guò)擴(kuò)展 Tendermint 來(lái)處理未來(lái)工作中存在的不確定性,在 Tendermint 中通過(guò)一個(gè) ABCI 應(yīng)用實(shí)現(xiàn)這個(gè)基于 docker 的行為是完全有可能的。Burrow 是一個(gè)以太坊虛擬機(jī)和以太坊交易機(jī)制的實(shí)現(xiàn),同時(shí)附帶有名字注冊(cè),許可權(quán)和天然合約,可替代區(qū)塊鏈 API 等額外特性。它使用 Tendermint 作為它的共識(shí)引擎,提供一個(gè)特殊的應(yīng)用狀態(tài)。

2. 什么是 ABCI (應(yīng)用區(qū)塊鏈接口)

區(qū)塊鏈應(yīng)用接口(Application BlockChain Interface,ABCI)允許應(yīng)用的拜占庭容錯(cuò)復(fù)制可以由任意一種編程語(yǔ)言編寫(xiě)。
  Tendermint Core (“共識(shí)引擎”)通過(guò)一個(gè)滿(mǎn)足 ABCI 標(biāo)準(zhǔn)的 socket 協(xié)議與應(yīng)用進(jìn)行交流。
  舉個(gè)大家比較熟悉的例子,比特幣。比特幣是一個(gè)加密貨幣區(qū)塊鏈,其中的每個(gè)節(jié)點(diǎn)維護(hù)了一個(gè)完全經(jīng)過(guò)審計(jì)的 UTXO 數(shù)據(jù)庫(kù)。如果有人想要在 ABCI 之上創(chuàng)建一個(gè)類(lèi)似比特幣的系統(tǒng),Tendermint Core 將會(huì)負(fù)責(zé):

  • 在節(jié)點(diǎn)間共享區(qū)塊和交易
  • 建立交易(區(qū)塊鏈)的標(biāo)準(zhǔn)/不可變順序

而應(yīng)用將會(huì)負(fù)責(zé):

  • 維護(hù) UTXO 數(shù)據(jù)庫(kù)
  • 驗(yàn)證交易的加密簽名
  • 阻止花費(fèi)尚未存在的交易
  • 允許客戶(hù)端查詢(xún) UTXO 數(shù)據(jù)庫(kù)

ABCI 包含了 3 個(gè)主要的消息類(lèi)型,它們由 core 發(fā)送至應(yīng)用,應(yīng)用會(huì)對(duì)消息產(chǎn)生相應(yīng)的回復(fù):
  DeliverTx 消息是應(yīng)用的主要部分。鏈中的每筆交易都通過(guò)這個(gè)消息進(jìn)行傳送。應(yīng)用需要基于當(dāng)前狀態(tài),應(yīng)用協(xié)議,和交易的加密證書(shū)上,去驗(yàn)證接收到 DeliverTx 消息的每筆交易,。一個(gè)經(jīng)過(guò)驗(yàn)證的交易然后需要去更新應(yīng)用狀態(tài) – 比如通過(guò)將綁定一個(gè)值到鍵值存儲(chǔ),或者通過(guò)更新 UTXO 數(shù)據(jù)庫(kù)。
  CheckTx 消息類(lèi)似于 DeliverTx,但是它僅用于驗(yàn)證交易。Tendermint Core 的內(nèi)存池首先通過(guò) CheckTx 檢驗(yàn)一筆交易的有效性,并且只將有效交易中繼到其他節(jié)點(diǎn)。比如,一個(gè)應(yīng)用可能會(huì)檢查在交易中不斷增長(zhǎng)的序列號(hào),如果序列號(hào)過(guò)時(shí),CheckTx 就會(huì)返回一個(gè)錯(cuò)誤。又或者,他們可能使用一個(gè)基于容量的系統(tǒng),該系統(tǒng)需要對(duì)每筆交易重新更新容量。
  Commit 消息用于計(jì)算當(dāng)前應(yīng)用狀態(tài)的一個(gè)加密保證(cryptographic commitment),這個(gè)加密保證會(huì)被放到下一個(gè)區(qū)塊頭。這有一些比較方便的屬性。現(xiàn)在,更新?tīng)顟B(tài)時(shí)的不一致性會(huì)被認(rèn)為是區(qū)塊鏈的分支,分支會(huì)捕獲所有的編程錯(cuò)誤。這同樣也簡(jiǎn)化了保障輕節(jié)點(diǎn)客戶(hù)端安全的開(kāi)發(fā),因?yàn)?Merkel-hash 證明可以通過(guò)在區(qū)塊哈希上的檢查得到驗(yàn)證,區(qū)塊鏈哈希由一個(gè) quorum 簽署。
  一個(gè)應(yīng)用可能有多個(gè) ABCI socket 連接。Tendermint Core 給應(yīng)用創(chuàng)建了三個(gè) ABCI 連接:一個(gè)用于內(nèi)存池廣播時(shí)的交易驗(yàn)證,一個(gè)用于運(yùn)行提交區(qū)塊時(shí)的共識(shí)引擎,還有一個(gè)用于查詢(xún)應(yīng)用狀態(tài)。
  很顯然,在創(chuàng)建區(qū)塊鏈時(shí),應(yīng)用的設(shè)計(jì)者需要非常小心地設(shè)計(jì)他們的消息處理,這個(gè)架構(gòu)提供一個(gè)范例。下圖闡釋了通過(guò) ABCI 的消息流:
  

3. 共識(shí)概述

  Tendermint 是一個(gè)易于理解,大部分操作為異步的 BFT 共識(shí)協(xié)議。下圖是一個(gè)簡(jiǎn)單的狀態(tài)機(jī),它展示了協(xié)議遵循的規(guī)則:

  協(xié)議中的參與者叫著 “驗(yàn)證人”(validator)。他們輪流對(duì)交易區(qū)塊進(jìn)行提議,并對(duì)這些區(qū)塊進(jìn)行投票。區(qū)塊會(huì)被提交到鏈上,每一個(gè)塊占據(jù)一個(gè)“高度”(height)。提交塊可能會(huì)失敗,如果失敗,協(xié)議就會(huì)開(kāi)始下一輪的提交,并且一個(gè)新的驗(yàn)證人會(huì)繼續(xù)提交那個(gè)高度的區(qū)塊。要想成功提交一個(gè)塊,需要有兩個(gè)階段的投票:“預(yù)投票”(pre-vote)和“預(yù)提交”(pre-commit)。在同一輪提交中,只有超過(guò) 2/3 的驗(yàn)證人對(duì)同一個(gè)塊進(jìn)行了預(yù)提交,這個(gè)塊才能被提交到鏈上。
  上圖右下角有一對(duì)夫婦在跳波卡舞,因?yàn)轵?yàn)證人做的事情就像是在跳波卡舞。當(dāng)超過(guò) 2/3 的驗(yàn)證人對(duì)同一個(gè)塊進(jìn)行了預(yù)投票,我們就把它叫做一個(gè)“波卡”(polka)。每一個(gè)預(yù)提交都必須被同一輪中的一個(gè)波卡所證明。
  由于一些原因,驗(yàn)證人可能在提交一個(gè)塊時(shí)失敗:當(dāng)前提議者可能離線(xiàn)了,或者網(wǎng)絡(luò)非常慢。Tendermint 允許他們證實(shí)一個(gè)驗(yàn)證人應(yīng)該被跳過(guò)。在進(jìn)行下一輪的投票前,驗(yàn)證人會(huì)等待一小段時(shí)間從提議者那里接收一個(gè)完整的提議塊。這種對(duì)于超時(shí)的依賴(lài),使得 Tendermint 成為了一個(gè)弱同步協(xié)議,而非一個(gè)異步協(xié)議。但是,協(xié)議的剩余部分都是異步的,只有在接收到超過(guò) 2/3 的驗(yàn)證人集合時(shí),驗(yàn)證人才會(huì)采取下一步操作。Tendermint 能夠簡(jiǎn)化的一個(gè)原因就是它使用了同樣的機(jī)制來(lái)提交一個(gè)塊和跳過(guò)直接進(jìn)入下一輪。
  基于不到 1/3 的驗(yàn)證人是拜占庭節(jié)點(diǎn)的前提,Tendermint 保證了永遠(yuǎn)都不會(huì)違背其安全性 – 也就是說(shuō),驗(yàn)證人永遠(yuǎn)不會(huì)在同一高度提交沖突塊。為了達(dá)到這一點(diǎn),它引入了一些 “鎖定”(locking)的規(guī)則,這些規(guī)則對(duì)流程圖中的路徑進(jìn)行了模塊化。一旦一個(gè)驗(yàn)證人預(yù)提交了一個(gè)塊,它就被“鎖定”在了那個(gè)塊上。然后,
1. 它必須為被鎖定的那個(gè)塊進(jìn)行預(yù)投票
2. 只有在之后的輪中,有了那個(gè)塊的一個(gè)波卡,它才能夠解鎖,并為一個(gè)新塊進(jìn)行預(yù)提交。

4. 簡(jiǎn)單入門(mén)

下載編譯

mkdir -p $GOPATH/src/github.com/tendermint cd $GOPATH/src/github.com/tendermint git clone https://github.com/tendermint/tendermint.git cd tendermint

linux環(huán)境編譯:

make get_tools make get_vendor_deps make install

Windows環(huán)境編譯:

cd cmd\tendermint go build

編程完成得到tendermint.exe文件

下載編譯abci

go get -u github.com/tendermint/abci/cmd/abci-cli cd cmd/abci-cli go build

編程完成得到abci-cli.exe

啟動(dòng)KVStore 第一個(gè)例子

tendermint啟動(dòng):

tendermint.exe init --home d:\tendermint tendermint.exe node --home d:\tendermint

kvstore啟動(dòng):

.\abci-cli kvstore

測(cè)試
可以使用postman進(jìn)行測(cè)試

## 查看狀態(tài) curl -s localhost:46657/status ## 新建tx curl -s 'localhost:46657/broadcast_tx_commit?tx="abcd"' ## 查詢(xún)新建的tx curl -s 'localhost:46657/abci_query?data="abcd"'

啟動(dòng)Counter 第二個(gè)例子

tendermint啟動(dòng):

tendermint.exe unsafe_reset_all tendermint.exe node --home d:\tendermint

kvstore啟動(dòng):

.\abci-cli counter --serial

測(cè)試

## 創(chuàng)建成功 curl localhost:46657/broadcast_tx_commit?tx=0x00 ## 創(chuàng)建失敗 curl localhost:46657/broadcast_tx_commit?tx=0x05 ##查看 curl localhost:46657/abci_query?path="tx"

總結(jié)

  tendermint是一款非常強(qiáng)大的共識(shí)軟件,不過(guò)目前尚未到1.0版本。官方基于tendermint修改了Ethereum的共識(shí)協(xié)議完成了ethermint,同時(shí)官方基于tendermint 構(gòu)建了cosmos公有鏈。
  tendermint還可以用于在聯(lián)盟鏈中作為共識(shí)協(xié)議,比如秘猿cryptape聯(lián)盟鏈?zhǔn)褂胻endermint來(lái)做共識(shí)。
  總的來(lái)說(shuō),tendermint不管在共有鏈還是聯(lián)盟鏈中都是大有可為的,值得深入學(xué)習(xí)研究。筆者在后續(xù) 的文章將講講tendermint的深入使用和原理。

總結(jié)

以上是生活随笔為你收集整理的拜占庭共识Tendermint介绍及简单入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。