? ? 關(guān)鍵字:nodejs,區(qū)塊鏈,比特幣,udp
????本文主要記錄一個最近#在跳坑的邊緣試探#的區(qū)塊鏈系統(tǒng)開發(fā)過程,架構(gòu)上并不復(fù)雜,參考了現(xiàn)存區(qū)塊鏈系統(tǒng)的原理與算法,歡迎到github上提問:https://github.com/SteveWooo/swc
目錄
1、網(wǎng)絡(luò)層
? ? 網(wǎng)絡(luò)層的目的是讓所有節(jié)點結(jié)成一個非全連接的網(wǎng)絡(luò),讓節(jié)點能主動把數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò),然后網(wǎng)絡(luò)把數(shù)據(jù)包傳播給所有節(jié)點,實現(xiàn)節(jié)點之間能相互通信。

? ? 實現(xiàn)這個網(wǎng)絡(luò)層主要使用了無狀態(tài)的udp協(xié)議,要求網(wǎng)絡(luò)中至少有一個部署在公網(wǎng)的節(jié)點。先定義幾個概念
? ??節(jié)點:普通入網(wǎng)設(shè)備(手機、計算機、嵌入式硬件)配置啟動該軟件,即為節(jié)點。
? ? 節(jié)點桶:指能和本地節(jié)點維持交換包狀態(tài)的健康的其他節(jié)點棧。例如A節(jié)點剛登陸,節(jié)點桶為空,這時候如果收到B節(jié)點的包,就代表B節(jié)點為健康的節(jié)點,把B的IP端口壓入節(jié)點桶。
? ? 心跳包:定期把節(jié)點桶中的內(nèi)容,打包發(fā)送給桶中的所有節(jié)點。
? ? 數(shù)據(jù)協(xié)議:節(jié)點之間通信的協(xié)議(心跳包是其中一種
? ? 維持網(wǎng)絡(luò)的主要流程如下:
? ? 1:啟動公網(wǎng)節(jié)點,開放端口
? ? 2:普通節(jié)點發(fā)心跳包給公網(wǎng)節(jié)點
? ? 3:公網(wǎng)節(jié)點把普通節(jié)點壓入節(jié)點桶
? ? 4:公網(wǎng)節(jié)點發(fā)送心跳包
? ? 5:普通節(jié)點收到心跳包中的新節(jié)點,壓入節(jié)點桶
? ? 6:loop
? ? 消息傳播方式:
? ? 1:普通節(jié)點創(chuàng)建消息,按照數(shù)據(jù)協(xié)議打包好
? ? 2:普通節(jié)點把數(shù)據(jù)發(fā)送給節(jié)點桶中所有節(jié)點,并寫入緩存
? ? 3:節(jié)點收到數(shù)據(jù)包,根據(jù)數(shù)據(jù)協(xié)議校驗正確后,轉(zhuǎn)發(fā)給數(shù)據(jù)桶中所有節(jié)點(如果和緩存沖突,則不轉(zhuǎn)發(fā)
2、數(shù)據(jù)協(xié)議層
? ? 數(shù)據(jù)層目的是規(guī)范節(jié)點之間通信的協(xié)議,在不安全的網(wǎng)絡(luò)環(huán)境中簽名與校驗通信包的內(nèi)容。這里涉及的概念主要有:
? ? 橢圓曲線驗證算法:一種非對稱校驗的算法,用于簽名校驗。
????目前設(shè)計的協(xié)議比較少,具體協(xié)議內(nèi)容都在代碼中可看到(block/create.js,trade/create.js)。主要有以下幾個
? ? 心跳協(xié)議:
????????包含節(jié)點唯一id和節(jié)點桶,嚴(yán)格按照一定的時間間隔發(fā)出。
? ? 交易協(xié)議:
? ? ? ? 區(qū)塊鏈數(shù)據(jù)的直接承載體。交易必須由交易創(chuàng)造者簽名,每筆交易都需要被網(wǎng)絡(luò)驗證。
? ? 塊協(xié)議:
? ? ? ? 交易的直接承載體。網(wǎng)絡(luò)規(guī)定在一定的時間范圍內(nèi)產(chǎn)生區(qū)塊(參考pow共識算法)。塊需要生成者簽名,每個塊都需要被網(wǎng)絡(luò)驗證
3、持久層
? ? 持久層目的是存放,查詢區(qū)塊、交易的內(nèi)容。
????目前使用了簡單的文件操作實現(xiàn)。