banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.

實現一個簡單的去中心化網絡

區塊鏈網絡是去中心化的,這意味著區塊鏈不是基於一個中心節點產生的,而是有很多去中心化的節點一起參與維護。

在這一節中將會基於 Python 模擬實現一個簡單的去中心化網絡。這個模擬的去中心化網絡中多個節點可以運行在同一台電腦上,只是每個節點使用了不同的本地端口號,每個節點都是用一個獨立的線程運行,相當於一個獨立的節點。從功能上說,這些獨立的節點會各自運行,互不影響。但從區塊鏈上講,這些節點相互配合共同維護這個區塊鏈的正確性,並驗證區塊和生成新的區塊來延伸整個鏈的長度。

(1)定義節點

為實現這個去中心化網絡,先要定義一個全局變量來保存區塊鏈上的所有節點,再定義一個節點的結構,每個節點都包含了唯一的端口、節點名稱、一個唯一的錢包和一個區塊鏈的副本,代碼如圖

image

(2)啟動節點

每個節點啟動時會先初始化區塊鏈信息並一直監聽指定端口,處理其他節點請求,代碼如圖

image

(3)初始化區塊鏈

初始化區塊鏈的過程是先判斷區塊鏈網絡中是否有其他節點,若有則發送初始化請求,請求該節點的區塊鏈信息並同步到本節點,如果是網絡中的第 1 個節點,則需要初始化一個創世區塊,具體代碼如圖

image

(4)處理請求

初始化區塊鏈後,各個節點會一直運行並處理其他節點發送過來的請求。節點收到的請求分為 3 種情況。第 1 種是初始化請求,收到該請求後節點將返回本地的區塊鏈信息;第 2 種是新交易的廣播,收到這類請求後節點驗證該交易是否有效,若有效則進行挖礦生成一個新的區塊添加到本地區塊鏈並廣播到整個網絡中;第 3 種情況是新區塊的廣播,節點收到這類請求後先驗證區塊是否有效,如果有效則添加到本地區塊鏈後面(在實際的網絡中可能還需要檢查這個新區塊是否已存在於當前區塊鏈中,如已存在則不重複添加),具體代碼如圖

image

處理其他節點請求

(5)廣播數據

下面代碼中定義的 broadcast_new_block 函數作用是將新的區塊廣播到去中心化網絡中,通過循環遍歷整個節點列表,對除自身節點外的其他節點都進行發送,如圖

image

除了上面的功能外,節點還應該可以提交一個交易並廣播到去中心化網絡其他節點,代碼如圖

交易提交函數

以上工作完成之後就可以測試這個區塊鏈網絡的功能了。先初始化一個節點 1 並運行這個節點在 8000 端口,打印這個節點上的區塊鏈信息,可以看到該區塊鏈包含一個創世區塊,如圖

image

初始化節點 1

再創建一個節點 2 並運行在 8001 端口,再打印一下這個節點的區塊鏈信息,應該可以看到這個區塊鏈也包含一個創世區塊,這個創世區塊鏈是從節點 1 同步過來的,如圖 4-66 所示。

此時輸出兩個節點的加密數字貨幣情況,可以看到節點 1 生成創世區塊鏈後獲得了 1 個加密數字貨幣,而節點 2 沒有加密數字貨幣,如圖

image

再測試一下交易功能,從節點 1 賬戶轉賬 0.3 個加密數字貨幣到節點 2 賬戶並提交到去中心化網絡中,如圖

image

測試交易功能

這是再次輸出兩個節點的區塊鏈情況,可以看到兩個節點中都有兩個區塊,如圖

image

此時節點的加密數字貨幣情況,應該是節點 1 賬戶轉賬 0.3 個加密數字貨幣後變成了 0.7 個加密數字貨幣,而節點 2 賬戶經轉賬得到 0.3 個加密數字貨幣,並經挖礦獲得 1 個加密數字貨幣共計 1.3 個加密數字貨幣,如圖

image

打印輸出交易後加密數字貨幣情況

至此,一個簡單的但功能較為完整的區塊鏈網絡算是完成了。希望各位讀者從這個區塊鏈的 Python 實現中掌握區塊鏈基本功能的實現方法。有興趣的讀者可以基於這個原型進行完善和優化,也可以基於自身熟悉的編程語言實現一個其他版本的區塊鏈原型。這個由 Python 實現的區塊鏈相關代碼已放在 GitHub 上。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。