1. 程式人生 > >區塊鏈開發(十二)公有鏈、聯盟鏈、私有鏈及網路配置介紹

區塊鏈開發(十二)公有鏈、聯盟鏈、私有鏈及網路配置介紹

以太坊網路
去中心化共識的基礎是參與節點的點對點網路,節點維護並保證區塊鏈網路的安全。參見挖礦。
以太坊網路資料統計
EthStats.net是以太坊網路實時資料的儀表板,這個儀表板展示重要資訊,諸如現在的區塊,散表難度,gas價格和gas花費等。頁面上顯示的節點只是精選了網路上的實際節點。任何人都可以在EthStats儀表板上新增他們的節點。Github上的Eth-Netstats README描述瞭如何連線。
EtherNodes.com展示了節點數的當前和歷史資料以及以太坊主網路和Morden測試網路上的其他資訊。
當前實時網路上客戶端實現分配 – EtherChain上的實時資料。
公有鏈、私有鏈和聯盟鏈


當今大多數以太坊專案都依靠以太坊作為公有鏈,公有鏈可以訪問到更多使用者,網路節點,貨幣和市場。然而通常有理由更偏好私有鏈或聯盟鏈(在一群值得信任的參與者中)。例如,銀行領域的很多公司都希望以太坊作為他們私有鏈的平臺。
以下是部落格發文《關於公有鏈和私有鏈》的摘錄,它解釋了三種區塊鏈在許可方面的區別:

  • 公有鏈:世界上所有人都可以閱讀和傳送交易。如果他們合法都有希望看到自己被包括在內。世界上任何人都能參與到共識形成過程——決定在鏈條上新增什麼區塊以及現狀是怎樣的。作為中心化或準中心化信任的替代品,公有鏈受加密經濟的保護,加密經濟是經濟激勵和加密圖形驗證的結合,用類似工作量證明或權益證明的機制,遵循的總原則是人們影響共識形成的程度和他們能夠影響的經濟資源數量成正比。這類區塊鏈通常被認為是“完全去中心化“。
  • 聯盟鏈:共識形成過程由預先選擇的一系列的節點所掌控,例如,設想一個有15個金融機構的團體,每個機構都操作一個節點,為了使區塊生效,其中的10個必須簽署那個區塊。閱讀區塊鏈的權利可能是公開的,或僅限於參與者,也有混合的路徑,比如區塊的根散表和應用程式程式設計介面一起公開,使公共成員可以進行一定量的查詢,重獲一部分割槽塊鏈狀態的加密圖形證明。這類區塊鏈被認為是“部分去中心化”。
    私有鏈:書寫許可對一個組織保持中心化。閱讀許可可能是公開的或者限制在任意程度。應用很可能包含對單個公司內部的資料庫管理,審查等,因此公共的可讀性在很多情況下根本不必要,但在另一些情況下人們又想要公共可讀性。
  • 私有鏈/聯盟鏈可能和公有鏈毫無聯絡,他們仍然通過投資以太坊軟體開發,對以太坊整體生態系統有利。經過一段時間,這會轉變成軟體改善,知識共享和工作機會。
    如何連線

    Geth會持續嘗試在網路上連線到其他節點,直到有了端點為止。如果你在路由器上有可用的UPnP或者在面向因特網的伺服器上執行以太坊,它也會接受其他節點的連線。
    Geth通過發現協議找到對等端。在發現協議中,節點互相閒聊發現網路上的其他節點。最開始,geth會使用一系列輔助程式節點,這些輔助程式節點的端點記錄在原始碼中。
    檢查連線和ENODE身份
    要檢查客戶端在互動控制檯上連線了多少對等端點,net模組有兩個屬性可以提供資訊,告訴你對等端點的數量以及你是否在監聽的節點。
> net.listening
true
> net.peerCount
4

瞭解更多關於連線對等端點的資訊,比如IP地址、埠號和支援協議,用管理員物件的peers()功能。admin.peers()會返回到現在已連線的對等端點列表。

> admin.peers
[{
ID: 'a4de274d3a159e10c2c9a68c326511236381b84c9ec52e72ad732eb0b2b1a2277938f78593cdbe734e6002bf23114d434a085d260514ab336d4acdc312db671b',
Name: 'Geth/v0.9.14/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '5.9.150.40:30301',
LocalAddress: '192.168.0.28:39219'
}, {
ID: 'a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c',
Name: 'Geth/v0.9.15/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '52.16.188.185:30303',
LocalAddress: '192.168.0.28:50995'
}, {
ID: 'f6ba1f1d9241d48138136ccf5baa6c2c8b008435a1c2bd009ca52fb8edbbc991eba36376beaee9d45f16d5dcbf2ed0bc23006c505d57ffcf70921bd94aa7a172',
Name: 'pyethapp_dd52/v0.9.13/linux2/py2.7.9',
Caps: 'eth/60, p2p/3',
RemoteAddress: '144.76.62.101:30303',
LocalAddress: '192.168.0.28:40454'
}, {
ID: 'f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0',
Name: '++eth/Zeppelin/Rascal/v0.9.14/Release/Darwin/clang/int',
Caps: 'eth/60, shh/2',
RemoteAddress: '129.16.191.64:30303',
LocalAddress: '192.168.0.28:39705'
} ]

更快下載區塊鏈
啟動以太坊客戶端時,會自動下載以太坊區塊鏈。用於下載以太坊區塊鏈的時間會根據客戶端、客戶端設定、連線速度和可用的端點數量變化。下面是更快獲取以太坊區塊鏈的一些選項。
使用geth
如果你在用geth客戶端,你可以做些什麼來加速下載以太坊區塊的時間。如果你用—fast標誌來執行以太坊快速同步,不會保留過去的交易資料。
注意:你不能在執行所有或者部分正常的同步操作之後再使用這個標誌,也就是說在用這個指令之前,不能下載以太坊區塊鏈的任何部分。檢視這個Ethereum Stack.Exchange answer瞭解更多。
下面是想要更快同步客戶端時使用的一些標誌。
–fast
這個標誌使通過狀態下載而不是下載整個區塊資料來實現快速同步成為可能。這樣也能大幅減少區塊鏈尺寸。注意:–fast只在從頭開始同步區塊鏈,並且是出於安全原因第一次下載區塊鏈時,才會執行。檢視Reddit發文瞭解更多。
–cache=1024
分配到內部快取的千兆記憶體(最少 16MB / 資料庫)。預設是16MB,所以根據你電腦記憶體多少,增加到256, 512, 1024 (1GB)或者2048 (2GB)會帶來不同。
–jitvm
這個標誌可以啟用JIT VM。
完整的控制檯命令示例:

geth --fast --cache=1024 --jitvm console

瞭解更多關於快速同步和區塊鏈下載次數的討論,檢視這篇Reddit發文。

匯出/匯入區塊鏈
如果你已經同步了整個以太坊節點,可以從完全同步的節點中匯出區塊鏈資料並將其匯入新節點。你可以在geth中用geth export filename指令匯出所有節點,並用geth import filename將區塊鏈匯入節點,來實現這一目的。
靜態節點,信任節點和啟動節點
Geth支援一個叫靜態節點的特徵,如果你有特定的端點,你會一直想與靜態節點連線。如果斷開連線,靜態節點會再次連線。你可以配置永久性靜態節點,方法是將如下所說的放進/static-nodes.json(這應該是和chaindata以及keystone在同一個資料夾)

[
"enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de10[email protected]33.4.2.1:30303",
"enode://[email protected]:port"
]

你也可以在執行期間通過Javascript使用admin.addPeer()加入靜態節點。

> admin.addPeer("enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae

連線的常見問題
有時候可能無法連線,最常見的原因有:

  • 本地時間不正確。要參與到以太坊網路中,需要精確的時鐘。檢查OS如何同步時鐘(例如sudo ntpdate -s time.nist.gov),即便只快了12秒也有可能導致0端點。
  • 有的防火牆配置可能會阻止UDP流通。可以用靜態節點功能或者控制檯上的admin.addPeer() 來手動配置連線。

不使用發現協議來啟動geth,你可以用—nodiscover引數。你只會在執行測試節點或有固定節點的實驗測試網路時才想要這樣做。
我們總結一下,如何連線其他節點,下面給出簡單的方法:
可以通過admin.addPeer()方法連線到其他節點,兩個節點要想聯通,必須保證網路是相通的,並且要指定相同的networkid。
假設有兩個節點:節點一和節點二,networkid都是1108,通過下面的步驟就可以從節點一連線到節點二。
首先要知道節點二的enode資訊,在節點二的js console中執行下面的命令檢視enode資訊:

> admin.nodeInfo.enode  
"enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d[email protected][::]:30304"  

然後在節點一的js console中執行admin.addPeer(),就可以連線到節點二:

> admin.addPeer("enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d4019ac54063ed6a1d0e3c3eaedad0b73c40b99a16a176993f0373ffe92be672@127.0.0.1:30304")  

ddPeer()的引數就是節點二的enode資訊,注意要把enode中的[::]替換成節點二的IP地址。連線成功後,節點二就會開始同步節點一的區塊,同步完成後,任意一個節點開始挖礦,另一個節點會自動同步區塊,向任意一個節點發送交易,另一個節點也會收到該筆交易。
通過admin.peers可以檢視連線到的其他節點資訊,通過net.peerCount可以檢視已連線到的節點數量。
除了上面的方法,也可以在啟動節點的時候指定–bootnodes選項連線到其他節點。