溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Gitee區(qū)塊鏈開源項目示例分析

發(fā)布時間:2022-01-05 18:10:18 來源:億速云 閱讀:143 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“Gitee區(qū)塊鏈開源項目示例分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

md_blockchain

Java區(qū)塊鏈平臺,基于Springboot開發(fā)的區(qū)塊鏈平臺。區(qū)塊鏈qq交流群737858576,一起學習區(qū)塊鏈平臺開發(fā),當然也交流Springboot、springcloud、機器學習等知識。

起因

公司要開發(fā)區(qū)塊鏈,原本是想著使用以太坊開發(fā)個合約或者是使用個第三方平臺來做,后來發(fā)現(xiàn)都不符合業(yè)務(wù)需求。原因很簡單,以太坊、超級賬本等平臺都是做共享賬本的,有代幣和挖礦等模塊。而我們需要的就是數(shù)家公司組個聯(lián)盟,來共同見證、記錄一些不可篡改的交互信息,如A公司給B公司發(fā)了一個xxx請求,B公司響應(yīng)了什么什么。其實要的就是一個分布式數(shù)據(jù)庫,而且性能要好,不能像比特幣那種10分鐘才生成一個區(qū)塊。我們要的更多的是數(shù)據(jù)庫的性能,和區(qū)塊鏈的一些特性。

經(jīng)過

項目于18年3月初開始研發(fā),歷時一月發(fā)布了第一版。主要做了存儲模塊、加密模塊、網(wǎng)絡(luò)通信、PBFT共識算法、公鑰私鑰、區(qū)塊內(nèi)容解析落地入庫等。已經(jīng)初步具備了區(qū)塊鏈的基本特征,但在merkle tree、智能合約以及其他的一些細節(jié)上,尚不到位。

希望高手不吝賜教,集思廣益,提出見解或方案,來做一個區(qū)塊鏈平臺項目,適合更多的區(qū)塊鏈場景,而不僅僅是賬本和各種忽悠人的代幣。

項目說明

主要有存儲模塊、網(wǎng)絡(luò)模塊、PBFT共識算法、加密模塊、區(qū)塊解析入庫等。

該項目屬于"鏈",非"幣"。不涉及虛擬幣和挖礦。

存儲模塊

Block內(nèi)存儲的是類Sql語句。聯(lián)盟間預(yù)先設(shè)定好符合業(yè)務(wù)場景需要的數(shù)據(jù)庫表結(jié)構(gòu),然后設(shè)定好各個節(jié)點對表的操作權(quán)限(ADD,UPDATE,DELETE),將來各個節(jié)點就可以按照自己被允許的權(quán)限,進行Sql語句的編寫,并打包至Block中,再全網(wǎng)廣播,等待全網(wǎng)校驗簽名、權(quán)限等信息的合法性。如果Block合法,則進入PBFT共識算法機制,各節(jié)點開始按照PrePrepare、Prepare、Commit等狀態(tài)依次執(zhí)行,直到2f+1個commit后,開始進行本地生成新區(qū)塊。新區(qū)塊生成后,各節(jié)點進行區(qū)塊內(nèi)容解析,并落地入庫的操作。

場景就比較廣泛了,可以設(shè)定不同的表結(jié)構(gòu),或者多個表,進而能完成各自類型信息的存儲。譬如商品溯源,從生產(chǎn)商、運輸、經(jīng)銷商、消費者等,每個環(huán)節(jié)都可以對某個商品進行ADD信息的操作。

存儲采用的是key-value數(shù)據(jù)庫rocksDB,了解比特幣的知道,比特幣用的是levelDB,都是類似的東西??梢酝ㄟ^修改yml中db.levelDB為true,db.RocksDB為false來動態(tài)切換使用哪個數(shù)據(jù)庫。

結(jié)構(gòu)類似于sql的語句,如ADD(增刪改) tableName(表名)ID(主鍵) JSON(該記錄的json)。這里設(shè)置了回滾的邏輯,也就是當你做了一個ADD操作時,會同時存儲一條Delete語句,以用于將來可能的回滾操作。

網(wǎng)絡(luò)模塊

網(wǎng)絡(luò)層,采用的是各節(jié)點互相長連接、斷線重連,然后維持心跳包。網(wǎng)絡(luò)框架使用的是t-io,也是oschina的知名開源項目。t-io采用了AIO的方式,在大量長連接情況下性能優(yōu)異,資源占用也很少,并且具備group功能,特別適合于做多個聯(lián)盟鏈的SaaS平臺。并且包含了心跳包、斷線重連、retry等優(yōu)秀功能。

在項目中,每個節(jié)點即是server,又是client,作為server則被其他的N-1個節(jié)點連接,作為client則去連接其他N-1個節(jié)點的server。同一個聯(lián)盟,設(shè)定一個Group,每次發(fā)消息,直接調(diào)用sendGroup方法即可。

但仍需要注意的是,由于項目采用了pbft共識算法,在達到共識的過程中,會產(chǎn)生N的3次方數(shù)量的網(wǎng)絡(luò)通信,當節(jié)點數(shù)量較多,如已達到100時,每次共識將會給網(wǎng)絡(luò)帶來沉重的負擔。這是算法本身的限制。

共識模塊PBFT

分布式共識算法是分布式系統(tǒng)的核心,常見的有Paxos、pbft、bft、raft、pow等。區(qū)塊鏈中常見的是POW、POS、DPOS、pbft等。

比特幣采用了POW工作量證明,需要耗費大量的資源進行hash運算(挖礦),由礦工來完成生成Block的權(quán)利。其他多是采用選舉投票的方式來決定誰來生成Block。共同的特點就是只能特定的節(jié)點來生成區(qū)塊,然后廣播給其他人。

區(qū)塊鏈分如下三類:

私有鏈:這是指在企業(yè)內(nèi)部部署的區(qū)塊鏈應(yīng)用,所有節(jié)點都是可以信任的,不存在惡意節(jié)點;

聯(lián)盟鏈:半封閉生態(tài)的交易網(wǎng)絡(luò),存在不對等信任的節(jié)點,可能存在惡意節(jié)點;

公有鏈:開放生態(tài)的交易網(wǎng)絡(luò),為聯(lián)盟鏈和私有鏈等提供全球交易網(wǎng)絡(luò)。

由于私有鏈是封閉生態(tài)的存儲系統(tǒng),因此采用Paxos類共識算法(過半同意)可以達到最優(yōu)的性能;聯(lián)盟鏈有半公開半開放特性,因此拜占庭容錯是適合選擇之一,例如IBM超級賬本項目;對于公有鏈來說,這種共識算法的要求已經(jīng)超出了普通分布式系統(tǒng)構(gòu)建的范疇,再加上交易的特性,因此需要引入更多的安全考慮。所以比特幣的POW是個非常好的選擇。

我們這里可選的是raft和pbft,分別做私鏈和聯(lián)盟鏈,項目中我使用了修改過的pbft共識算法。

先來簡單了解pbft:

(1)從全網(wǎng)節(jié)點選舉出一個主節(jié)點(Leader),新區(qū)塊由主節(jié)點負責生成。

(2)每個節(jié)點把客戶端發(fā)來的交易向全網(wǎng)廣播,主節(jié)點將從網(wǎng)絡(luò)收集到需放在新區(qū)塊內(nèi)的多個交易排序后存入列表,并將該列表向全網(wǎng)廣播。

(3)每個節(jié)點接收到交易列表后,根據(jù)排序模擬執(zhí)行這些交易。所有交易執(zhí)行完后,基于交易結(jié)果計算新區(qū)塊的哈希摘要,并向全網(wǎng)廣播。

(4)如果一個節(jié)點收到的2f(f為可容忍的拜占庭節(jié)點數(shù))個其它節(jié)點發(fā)來的摘要都和自己相等,就向全網(wǎng)廣播一條commit消息。

(5)如果一個節(jié)點收到2f+1條(包括自己)commit消息,即可提交新區(qū)塊到本地的區(qū)塊鏈和狀態(tài)數(shù)據(jù)庫。

(6)客戶端收到f + 1個成功(即便有f個失敗、再f個惡意返回的錯誤信息,f + 1個正確的也是多數(shù)派)的返回,即可認為該次寫入請求是成功的。

可以看到,傳統(tǒng)的pbft是需要先選舉出leader的,然后由leader來搜集交易,并打包,然后廣播出去。然后各個節(jié)點開始對新Block進行校驗、投票、累積commit數(shù)量,最后落地。

而我這里對pbft做了修改,這是一個聯(lián)盟,各個節(jié)點是平等的,而且性能要高。所以我不想讓每個節(jié)點都生成一個指令后,發(fā)給其他節(jié)點,再大家選舉出一個節(jié)點來搜集網(wǎng)絡(luò)上的指令組合再生成Block,太復(fù)雜了,而且又存在了leader節(jié)點的故障隱患。

我對pbft的修改是,不需要選擇leader,任何節(jié)點都可以構(gòu)建Block,然后全網(wǎng)廣播。其他節(jié)點收到該Block請求時即進入Pre-Prepare狀態(tài),校驗格式、hash、簽名、和table的權(quán)限,校驗通過后,進入Prepare狀態(tài),并全網(wǎng)廣播狀態(tài)。待自己累積的各節(jié)點Prepare的數(shù)量大于2f+1時,進入commit狀態(tài),并全網(wǎng)廣播該狀態(tài)。待自己累積的各節(jié)點Commit的數(shù)量大于2f+1時,認為已達成共識,將Block加入?yún)^(qū)塊鏈中,然后執(zhí)行Block中sql語句。

很明顯,和有l(wèi)eader時相比,缺少了順序的概念。有l(wèi)eader時能保證Block的順序,當有并發(fā)生成Block的需求時,leader能按照順序進行廣播。譬如大家都已經(jīng)到number=5的區(qū)塊了,然后需要再生成2個,有l(wèi)eader時,則會按照6、7的順序來生成。而沒有l(wèi)eader時,則可能發(fā)生多節(jié)點同時生成6的情況。為了避免分叉,我做了一些處理,具體的可以在代碼里看實現(xiàn)邏輯。

區(qū)塊信息查詢

各節(jié)點通過執(zhí)行相同的sql來實現(xiàn)一個同步的sqlite數(shù)據(jù)庫(或mysql等其他關(guān)系型數(shù)據(jù)庫),將來對數(shù)據(jù)的查詢都是直接查詢sqlite,性能高于傳統(tǒng)的區(qū)塊鏈項目。

由于各個節(jié)點都能生成Block,在高并發(fā)下會出現(xiàn)區(qū)塊不一致的情況。如果因為某些原因?qū)е骆湻植媪耍蔡峁┝嘶貪L機制,sql可以回滾。原理也很簡單,你ADD一個數(shù)據(jù)時,我會在區(qū)塊里同時記錄兩個指令,一個是ADD,一個是回滾用的DELETE。同理,UPDATE時也會保存原來的舊數(shù)據(jù)。區(qū)塊里的sql落地,譬如順序執(zhí)行1-10個指令,回滾時就是從10-1執(zhí)行回滾指令。

每個節(jié)點都會記錄自己已經(jīng)同步了的區(qū)塊的值,以便隨時進行sql落地入庫。

對區(qū)塊鏈信息的查詢,那就簡單了,直接做數(shù)據(jù)庫查詢即可。相比于比特幣需要檢索整個區(qū)塊鏈的索引樹,速度和方便性就大不同了。

簡單使用說明

使用方法:先下載md_blockchain_manager項目,然后導(dǎo)入工程里的sql數(shù)據(jù)庫文件,修改application.yml數(shù)據(jù)庫配置,最后啟動manager項目。

然后修改md_blockchain中application.yml里的name、appid和manager項目數(shù)據(jù)庫里的某個值對應(yīng),作為一個節(jié)點。如果有多個節(jié)點,則某個節(jié)點都和數(shù)據(jù)庫里對應(yīng),填寫各節(jié)點的ip。managerUrl就是manager項目的url,讓該項目能訪問到manager項目。

在md_blockchian項目啟動時,在ClientStarter類中可見,啟動時會從manager項目拉取所有節(jié)點的數(shù)據(jù),并進行連接。如果自己的ip和appId等不在manager數(shù)據(jù)庫中,則無法啟動。

可以通過訪問localhost:8080/block?content=1來生成一個區(qū)塊。正常使用時至少要啟動4個節(jié)點才行,否則無法達成共識,PBFT要求2f+1個節(jié)點同意才能生成Block。為了方便測試,可以直接修改pbftSize的返回值為0,這樣就能自己一個節(jié)點玩起來了。如果有多個節(jié)點,在生成Block后就會發(fā)現(xiàn)別的節(jié)點也會自動同步自己新生成的Block。目前代碼里默認設(shè)置了一張表message,里面也只有一個字段content,相當于一個簡單的區(qū)塊鏈記事本。當有4個節(jié)點時,可以通過并發(fā)訪問其中的幾個來同時生成Block進行測試,看是否會分叉。還可以關(guān)停其中的一個,看其他的三個是否能達成共識(拜占庭最多容許f個節(jié)點故障,4個節(jié)點允許1個故障),恢復(fù)故障的那個,看是否能夠同步其他正常節(jié)點的Block??梢赃M行各種測試,歡迎提bug。

可以通過localhost:8080/block/sqlite來查看sqlite里存的數(shù)據(jù),就是根據(jù)Block里的sql語句執(zhí)行后的結(jié)果。

我把項目部署到docker里了,共啟動4個節(jié)點,如圖: Gitee區(qū)塊鏈開源項目示例分析

四個節(jié)點ip都寫死了,都啟動后,它們會相互全部連接起來,并維持住長連接和心跳包,相互交換最新的Block信息。 Gitee區(qū)塊鏈開源項目示例分析

別的節(jié)點會是這樣,收到block項目請求生成區(qū)塊的請求、并開始校驗,然后進入pbft的投票狀態(tài) Gitee區(qū)塊鏈開源項目示例分析

此外還有高并發(fā)情況下,各節(jié)點同時生成Block,系統(tǒng)處理共識、保證區(qū)塊鏈不分叉的一些測試。

這個生成區(qū)塊的接口是寫好用來測試的,正常走的流程是調(diào)用instuction接口,先生產(chǎn)符合自己需求的指令,然后組合多個指令,調(diào)用BlockController里的生成區(qū)塊接口。

“Gitee區(qū)塊鏈開源項目示例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI