節點間的同步與廣播
我們現在已經能夠讓使用者端與節點端彼此溝通,而且能夠讓使用者在不需要儲存所有交易明細的狀況下向節點查詢餘額或是發起交易,但我們的節點也只有一個,在這個狀況下其實運作方式跟傳統中心化的方式並無差異。
因此現在的目的是要讓外界的人可以自由加入節點的運作與挖掘新區塊,在這過程中也牽涉到區塊或交易的廣播(必須把收到的新資訊廣播給彼此,區塊鏈裡的資料才會一致),這一步完成後我們的簡易區塊鏈也就大功告成了!
同步區塊
為了與已經上線運作的區塊鏈同步,需要向已知的節點發起請求,要求節點將目前所有的資料都傳遞過來。因為我們選用的是Stream Socket,接收到的資料是連續的,為了避免資料流斷開因此直到讀到len(response) % 4096
不為零才停止。(但其實會有Bug,但因為機率很小只有1/4096這裡先忽略)。接收到資料後就把目前鏈上的資料同步。
接受並判別訊息
接收資訊的部分需要對其餘節點傳來的資訊做對應的處置,有下面四種:
- 接收到同步區塊的請求:把目前的區塊鏈上的資料都dump一份給對方
- 接收到挖掘出的新區塊:確認是否有符合Hash的規則,有的話就把它加入鏈上,改挖掘下一區塊
- 接收到廣播的交易:把交易置入等待中的交易
pending_transactions
- 接收到新增節點的請求:把位置加到之後要廣播的清單中
接收並驗證廣播的區塊
一旦接收到新區塊,必須對區塊的內容與哈希加以驗證,確認資料格式是正確的同時也要把裏頭被打包好的交易從等待中的交易pending_transactions
移除,否則該筆交易就會被執行兩次!
如果廣播的區塊驗證通過,改挖掘下一塊
如果通過上一步的驗證,則本地端的挖掘工作必須暫停,直接挖掘下一個新區塊。在這裡我們也修改nonce的產生方式,不再是統一由1開始逐漸+1,否則永遠都會是算力最高的節點會挖到。
挖掘到新區塊,廣播給其他節點
如果是自身挖到新區塊的話,就要把這個新區塊廣播給其他節點囉!
執行我們的區塊鏈與雙節點
首先我們運行第一個節點,並指明它的port為1111
python .\Blockchain.py 1111
接著可以運行第二個節點,並指明它的port為1112、請它去連接與同步127.0.0.1:1111。
python .\Blockchain.py 1112 127.0.0.1:1111
接著就可以看到兩邊不停地交換挖掘到的新區塊了!
文章列表:
- 定義基本架構、功能與格式
http://bit.ly/3rPRrtE - 利用非對稱加密簽署並發送交易
http://bit.ly/3og5jLF - 製作節點與用戶端程式
http://bit.ly/2KVXBb2 - 節點間的廣播與同步
http://bit.ly/394aurx
工商服務
我在台大資工訓練班有開設相關區塊鏈課程,有興趣的可以參考。
https://train.csie.ntu.edu.tw/train/course.php?id=3174