9.3 parity概述

xiaohuanglv發表於2018-09-15

parity是一個徹頭徹尾的以太坊節點,其特點包括正確性/可驗證性、模組化、低記憶體佔用和高效能。它是用Rust 程式語言編寫的,Rust是一種混合式的、物件導向的函式式語言的語言,注重效率,由Parity Technologies公司開發。在寫本書時,parity的最新版本是1.7.0,我們將使用這個版本學習建立聯盟區塊鏈需要的內容。如要深入學習 parity,請參考官方文件。

parity的功能比go-ethereum多,例如有web3 DApp瀏覽器和更先進的賬戶管理功能等。不過parity的特別之處在於它既支援PoA,也支援PoW。parity目前支援Aura和 Tendermint PoA協議,未來還可能支援更多的PoA協議。目前,parity推薦使用Aura,而不推薦Tendermint,因為Tendermint仍處於開發 階段。

對於獲得許可許可權的區塊鏈來說,Aura是一個比PoW好得多的選擇,因為它的區塊時間更好,且在私有網路中提供了更好的安全性。

9.3.1 Aura的工作原理

讓我們從一定高度看看Aura是如何工作的。Aura要求每個節點中都指明同樣的驗證器列表,這是參與共識的賬戶地址的列表。一個節點可能是驗證節點,也可能不是驗證節點,即使是驗證節點,也需要有這個列表,這樣它自己才能達成共識。

這個列表可以在創世檔案中作為靜態列表提供(如果驗證器的列表永遠保持不變),或者在智慧合約中提供(這樣它可以被動態更新且讓每一個節點都知道它)。在智慧合約中,對於誰可以新增新的驗證器,可以設定不同的策略。

區塊時間可以在創世檔案中配置。使用者可以自己決定區塊時間。在私有網路中,低至3s的區塊時間執行良好。在Aura 中,每過3s就選擇驗證器中的一個,該驗證器負責建立、驗證、簽署和廣播區塊。使用者不需要深入理解實際的選擇演算法,因為這不會影響DApp開發。這是計算 下一個驗證器的公式:(UNIX_TIMESTAMP/BLOCK_TIME%NUMBER_OF_TOTAL_VALIDATORS)。選擇演算法很智 能,它給所有人同等的機會。當其他節點接收一個區塊時,它們要檢查區塊是否來自下一個合法的驗證器;如果不是,就拒絕它。與PoW不同,驗證器建立區塊的 時候,不能得到以太幣回報。在Aura中,由使用者決定在沒有交易時是否生成空區塊。

如果由於一些原因,下一個驗證器節點建立和廣播下一個區塊失敗了,情況會如何?讓我們看一個例子:假設A是下一個區塊 (即第5個區塊)的驗證器,B是第6個區塊的驗證器。假設區塊時間是5s。如果A廣播區塊失敗,則5s之後輪到B廣播區塊。所以事實上不會發生什麼要緊 事,區塊時間戳將揭示這些細節。

在PoW中兩個礦工同時挖礦,最後網路是否有可能產生多個不同的區塊鏈?是的,很多情況下都可能導致這樣的結果。讓我 們看個例子來理解一種可能發生的情況以及網路自動解決衝突的方法。假設共有5個驗證器:A、B、C、D和E。區塊時間是5s。假設A首先被選中並廣播一個 區塊,但是由於一些原因區塊沒有到達D和E,所以它們會認為A沒有廣播區塊。現在假設選擇演算法選擇B來生成下一個區塊,則B將在A區塊之上生成下一個區塊 並廣播給所有的節點。D和E將拒絕它,因為前一個區塊雜湊不匹配。由此,D和E將形成一個不同的鏈,而A、B和C將形成一個不同的鏈。A、B和C將拒絕來 自D和E的區塊,而D和E將拒絕來自A、B和C的區塊。這個問題可以這樣解決,假設定義來自A、B和C的區塊比來自D和E的區塊更準確,因此D和E將用 A、B和C版本的區塊鏈替換自己的區塊鏈。兩個版本的區塊鏈有不同的準確分,第一個區塊鏈的分數高於第二個。當B廣播它的區塊時,它還將提供其區塊鏈評 分,因為其分數高,D和E就用B的區塊鏈替換自己的區塊鏈。這就是衝突的解決方法。區塊鏈的分數使用 (U128_max*BLOCK_NUMBER_OF_LATEST_BLOCK- (UNIX_TIMESTAMP_OF_LATEST_BLOCK/BLOCK_TIME))計算。首先用長度評分(區塊越多越好),對於有同樣長度的 鏈,選擇最後一個區塊比較舊的鏈。

如果更深入地學習Aura,參見https://github.com/paritytech/parity/wiki/Aura

9.3.2 執行parity

parity需要安裝Rust版本1.16.0才能建立。推薦通過rustup安裝Rust。

1.安裝rust

如果還沒有rustup,可以按照如下方式進行安裝。

(1)Linux

在以Linux為基礎的作業系統上,執行如下命令:

image.png

parity還要求安裝gcc、g++、libssl-dev/openssl、libudev-dev和pkg-config包。

(2)OS X

在OS X上,執行如下命令:

image.png

parity還要求安裝clang。clang來自Xcode命令列工具,或者可以用Homebrew安裝。

(3)Windows

確保安裝可使用C++的Visual Studio 2015。下一步,從https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustupinit.exe 下載並執行rustup安裝程式,啟動VS2015 x64 Native Tools Command Prompt,並使用下面的命令安裝和建立msvc工具鏈:

image.png

2.下載、安裝和執行parity

在作業系統上安裝好rust之後,可以執行如下簡單的線上命令安裝parity:

image.png

檢測是否已經安裝了parity,執行如下命令:

image.png

如果parity安裝成功,就會看到一個子命令和選項列表。

9.3.3 建立私有網路

現在是時候建立聯盟區塊鏈了。使用Aura作為共識機制,建立兩個彼此連線的驗證節點。我們將在同一臺計算機上建立這兩個節點。

1.建立賬戶

首先,開啟兩個shell視窗。第一個針對第一個驗證器,第二個針對第二個驗證器。第一個節點包含兩個賬戶,第二個節點包含一個賬戶。第一個節點的第二個賬戶將被賦予一些初始以太幣,這樣網路將擁有一些以太幣。

在第一個shell視窗中,執行如下命令兩次:

image.png

兩次都會要求輸入密碼。現階段,在兩個賬戶中輸入相同的密碼。

在第二個shell中視窗,執行如下命令一次:

image.png

和剛才一樣,輸入密碼。

2.建立規範檔案

每個網路的節點都分享一個通用規範檔案(specification file)。該檔案告訴節點關於創世區塊、誰是驗證器等資訊。我們將建立一個智慧合約,其中包含驗證器列表。有兩種型別的驗證器合約:non- reporting合約和reporting合約。我們只需要提供一個。

這兩種驗證器合約的區別是:non-reporting合約只返回一個驗證器列表;而reporting合約可以對善意(善意行為可能僅僅是不從一個給定的驗證器接收區塊)和惡意行為(惡意行為可能是在同一步驟釋放兩個不同的區塊)採取行動。

non-reporting合約至少應該有如下介面:

image.png

在每一個區塊上呼叫getValidators函式,以決定當前列表。轉換規則是由實現該方法的合約決定的。

reporting合約至少應該有如下介面:

image.png

當有善意或者惡意行為時,共識機器分別呼叫reportBenign和reportMalicious函式。

建立一個reporting合約的基本示例如下:

image.png

image.png

該程式碼無須解釋說明。確保在驗證器中,陣列用驗證器1的第一個地址和驗證器2的第一個地址代替這些地址,因為我們將使用那些地址進行驗證。現在編譯上述合約。

現在建立規範檔案。建立一個叫作spec.json的檔案,放入下面的程式碼:

image.png

image.png

上述程式程式碼的工作原理如下:

·engine屬性用於設定共識協議和協議具體引數。這裡的engine是authority-Round,也就是 aura。gasLimitBoundDivisor決定gas上限調整,並有通常的以太坊值。在驗證器屬性中,有一個contract屬性,即 reporting合約的地址。stepDuration是以秒為單位的區塊時間。

·在params屬性中,只有網路ID才是關鍵;在所有的鏈中,其他屬性都是標準的。

·genesis屬性對於authorityRound共識有一些標準數值。

·accounts屬性用於列出網路中存在的最初賬戶和合約。前四個是標準以太坊內建合約,使用Solidity合約 編寫語言應當包括這些。第五個是reporting合約。確保把位元組碼替換成constructor引數中的位元組碼。最後一個賬戶是在驗證器1 shell生成的第二個賬戶。它的用途是向網路提供以太幣。使用者可以用自己的地址替換它。

在繼續下一步操作之前,建立另一個檔案node.pwds,在其中放入所建立的賬戶的密碼。該檔案將被驗證器用來解鎖賬戶,簽署區塊。

3.啟動節點

現在已經具備各種條件啟動驗證節點了。在第一個shell視窗中,執行如下命令以啟動第一個驗證節點:

image.png

上述命令的工作原理如下:

·--chain用於指定規範檔案的路徑。

·-d用於指定資料目錄。

·--force-sealing用於確保即使沒有交易也產生區塊。

·--engine-signer用於指定節點簽署區塊時使用的地址,即驗證器的地址。如果可能有惡意機構,則推薦用--force-sealing,這將保證正確的鏈是最長的。確保把地址改為生成的那個地址,即在這個shell視窗生成的地址。

·--password用於指定密碼檔案。

在第二個shell視窗中,執行如下命令以啟動第二個驗證節點:

image.png

確保把地址修改為生成的那個地址,即在這個shell視窗生成的地址。

4.連線節點

最後需要連線兩個節點。開啟一個新的shell視窗,執行如下命令,URL會連線到第二個節點:

image.png

將得到類似這樣的輸出:

image.png

執行如下命令,把URL中的編碼URL和IP地址修改為127.0.0.1:

image.png

得到如下輸出:

image.png

該節點應當表示操作檯中的0/1/25 peers,這意味著它們彼此沒有連線。示意圖如下:

image.png

9.3.4 許可和隱私

我們已經看到了parity是如何解決速度和安全問題的。parity目前並不提供專門的許可和隱私功能。讓我們看看如何在parity中實現許可和隱私:

1)許可 。parity網路可以配置每個節點的服務端,只允許特定的IP地址建立連線,由此實現許可,即決定誰能加入、誰不能加入。即使IP地址沒有被攔截,為了 連線到網路中的節點,新的節點也將需要一個enode地址,且這個地址是猜不到的。所以預設parity有基本保護。但是沒有強制實施保護。網路中的每一 個節點需要在其終端關注此事。可以通過智慧合約進行類似許可,即決定誰能建立區塊以及誰不能建立區塊。目前還不能設定哪種交易節點可以傳送。

2)身 份隱私 。通過允許所有權查詢,有辦法實現身份隱私。在設定所有權時,所有者需要指定一個非確定性的、不對稱的加密公鑰。當它想通過所有權查詢時,將提供一個加密的普通文字,合約對其解碼,並檢視賬戶是否是所有者。合約應當確保不會檢查同樣的加密資料兩次。

3)資料隱私 。如果只是使用區塊鏈儲存資料,則可以使用對稱的加密方式加密資料並儲存,還可以與和人共享金鑰。但是不能在加密資料上進行操作,如果需要在輸入資料上進行操作,同時還想要保密,則各方需要建立一個完全不同的區塊鏈網路。


來源:我是碼農,轉載請保留出處和連結!

本文連結:http://www.54manong.com/?id=524

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

相關文章