如何使用Parity Substrate構建自己的區塊鏈

買賣虛擬貨幣
arity Substrate是一個區塊鏈開發框架,具有許多很酷的功能,如可升級的區塊鏈,模組化架構,可定製的塊執行邏輯和熱插拔共識。本文是關於如何開始使用Substrate框架來構建自己的區塊鏈。Substrate安裝開始使用Substrate的第一步是設定開發環境。Substrate團隊建立了一個bash指令碼,它安裝所有依賴項並編譯相關的包作為安裝Substrate框架的一部分。在終端中執行以下命令,將配置Substrate。curl https://getsubstrate.io -sSf | bash
該命令需要幾分鐘才能完成(取決於您的硬體),因為它還編譯了Substrate框架所需的所有Rust包。還有一個更快的選項,只安裝依賴項,不編譯Substrate包。要使用此選項,請執行以下命令。curl https://getsubstrate.io -sSf | bash -s -- --fast注意:在該的選項中,不會在全域性系統中安裝Substrate CLI。

Substrate節點模板


一旦安裝指令碼完成執行,以及依賴項,您還將在計算機上執行以下幾個命令。其中一個命令是substrate -bode-new命令可幫助您設定模板節點。 將此視為專案框架模板。該命令下載Rust程式碼庫並進行編譯。此程式碼庫將設定Substrate執行時所需的所有引導程式碼打包在一起。建立節點模板的例項,請在終端中執行以下命令。substrate-node-new <project name> <author name>第一個引數是區塊鏈專案的名稱,第二個(可選)引數是該鏈作者的名稱。例如:
substrate-node-new substrate-demo demoauthor一旦該命令完成,它將在substrate demo(或您使用的專案名稱)目錄中建立以下目錄結構。它還將初始化此目錄中的Git儲存庫。

Runtime子目錄包含區塊鏈執行時相關邏輯。執行時可以稱為區塊鏈的業務邏輯。它進一步分為執行時模組和每個模組包,它們各自的狀態(儲存)和行為(邏輯)。執行時目錄包含執行時模組的檔案。

src目錄包含低階程式碼,它將Substrate框架的所有元件集合在一起以執行執行時。

scripts目錄包含一個build.sh指令碼,該指令碼允許我們為Wasm(Web Assembly)環境構建Substrate執行時。

執行Substrate節點

baseline-node-new命令完成執行,它還將編譯節點模板的原始碼(花費幾分鐘)。此時,您已經可以啟動節點,它將開始生成區塊。

要啟動Substrate節點,請在node-template目錄的上下文中執行以下命令。以下命令將使用dev配置基於node-template啟動Substrate節點。實質上,它執行由節點模板程式碼庫編譯生成的可執行檔案。

cd substrate-demo // in case you haven't done this already
./target/release/substrate-demo --dev

該命令將生成類似於以下內容的輸出。

2019-07-25 17:28:31 Substrate Node
2019-07-25 17:28:31   version 1.0.0-x86_64-linux-gnu
2019-07-25 17:28:31   by demoauthor, 2017, 2018
2019-07-25 17:28:31 Chain specification: Development
2019-07-25 17:28:31 Node name: adorable-wind-3578
2019-07-25 17:28:31 Roles: AUTHORITY
2019-07-25 17:28:31 Initializing Genesis block/state (state: 0x4397…ab51, header-hash: 0x0353…30ef)
2019-07-25 17:28:31 Loaded block-time = 10 seconds from genesis on first-launch
2019-07-25 17:28:31 Best block: #0
2019-07-25 17:28:31 Local node address is: /ip4/0.0.0.0/tcp/30333/p2p/QmYsPTbsxQiKV8Dk3rWL19xFXxfpt2NrzFRd2P63AjRM3o
2019-07-25 17:28:31 Listening for new connections on 127.0.0.1:9944.
2019-07-25 17:28:31 Using authority key 5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TmTd
2019-07-25 17:28:40 Starting consensus session on top of parent 0x03534673f220e0514d5324acd179438094e05f4c2419f33226c42e33f5cf30ef
2019-07-25 17:28:40 Prepared block for proposing at 1 [hash: 0xdc6de1c9b04607fe51bf4abed8cfdbd6313a74e9eeda78e3db4f6d2b60e69903; parent_hash: 0x0353…30ef; extrinsics: [0x0421…0149]]
2019-07-25 17:28:40 Pre-sealed block for proposal at 1. Hash now 0x1e5375649660d9e8b8e41fde74c861185a1e55153285e4332111dd0aa240684a, previously 0xdc6de1c9b04607fe51bf4abed8cfdbd6313a74e9eeda78e3db4f6d2b60e69903.
2019-07-25 17:28:40 Imported #1 (0x1e53…684a)

如您所見,節點已經開始生成區塊。

構建Substrate runtime模組

既然我們都已經使用Substrate設定並且我們的模板節點正在按預期工作,那麼讓我們為區塊鏈構建一些自定義邏輯。

區塊鏈的業務邏輯駐留在runtime模組中。

假設我們想為令牌傳輸功能構建一個簡單的區塊鏈執行。為實現這一點,我們需要以下內容:

狀態:

· 令牌的總供應量
· 帳戶和餘額對映

行為:

· 令牌初始化(分配給所有者帳戶的總供應量)
· 在帳戶之間轉移令牌

如前所述,Substrate執行時模組將自己的狀態和行為打包在一起。我們將使用儲存項和函式建立自定義執行時模組。

在node-template目錄中,在runtime / src目錄中,您將找到兩個檔案- lib.rs和temaplate.rs。

lib.rs是Runtime的Rust crate root。它匯入所有必需的依賴項和型別。它還使用Substrate框架的一些Rust巨集部分初始化runtime模組。

template.rs是Substrate runtiem的模板,它包含在節點模板中。它包含一些虛擬狀態和行為(在程式碼註釋中有描述),並且本身就是rumtiem模組的功能。

要實現上述令牌功能,我們對template.rs檔案進行一些更改。

儲存宣告

首先,讓我們宣告令牌功能所需的儲存項。在decl_storage! 巨集呼叫,讓我們為令牌的總供應和餘額對映新增以下兩項。

TotalSupply get(total_supply): u64 = 21000000;
BalanceOf get(balance_of): map T::AccountId => u64;

在第一行中,我們新增了一個儲存項TotalSupply來儲存令牌的總數。我們還為此儲存專案(21000000)設定了一個值。

在第二行中,我們將另一個儲存項建立為StorageMap,並在AccountId和與之關聯的令牌餘額之間建立對映。我們稱這個儲存專案為BalanceOf。

此模組的完整儲存宣告程式碼如下所示。(注意:我們刪除了模板模組附帶的虛擬儲存項。)

// storage for this runtime module
decl_storage! {
  trait Store for Module<T: Trait> as Template {

    TotalSupply get(total_supply): u64 = 21000000;
    BalanceOf get(balance_of): map T::AccountId => u64;
  }
}

實現runtime邏輯

現在我們已經為Substrate模組定義了儲存,讓我們編寫一些程式碼來操作這些儲存項。

在Substrate模組中,使用decl_module!巨集 ,定義公共可排程函式 我們有兩個函式可以在我們的模組中實現簡單的令牌傳輸功能。這些是令牌和傳遞函式的初始化。

在下面的程式碼片段中,這兩個可排程函式 -  init和transfer在decl_module! 巨集中定義。

decl_module! {
  pub struct Module<T: Trait> for enum Call where origin: T::Origin {
      // initialize the token
      // transfers the total_supply amout to the caller
      fn init(origin) -> Result {
        let sender = ensure_signed(origin)?;
        <BalanceOf<T>>::insert(sender, Self::total_supply());
        Ok(())
      }
      // transfer tokens from one account to another
      fn transfer(_origin, to: T::AccountId, value: u64) -> Result {
        let sender = ensure_signed(_origin)?;
        let sender_balance = Self::balance_of(sender.clone());
        ensure!(sender_balance >= value, "Not enough balance.");
        let updated_from_balance =         
        sender_balance.checked_sub(value)
        .ok_or("overflow in calculating balance")?;

        let receiver_balance = Self::balance_of(to.clone());
        let updated_to_balance = receiver_balance.checked_add(value)
        .ok_or("overflow in calculating balance")?;

        // reduce sender's balance
        <BalanceOf<T>>::insert(sender, updated_from_balance);
        // increase receiver's balance
        <BalanceOf<T>>::insert(to.clone(), updated_to_balance);

        Ok(())
      }
  }
}

請注意,我們如何使用self::total_supply()和<balanceof<t>>訪問模組的儲存,以獲取和設定這些儲存項的值。

注意:從安全性的角度來看,這些函式在檢查和驗證方面需要更多。但為了簡單起見,我們暫時跳過它們。

就是這樣;我們現在已經定義了我們的小型區塊鏈執行時的狀態和行為。

構建和執行substrate節點

現在讓我們透過template.rs檔案中的令牌傳遞函式執行我們剛建立的Substrate執行時。

編譯

首先,要編譯Wasm環境的執行時,請在repository目錄的華寧中執行以下命令。

./scripts/build.sh

完成上述命令後,執行以下命令為本機環境構建Substrate節點。

cargo build --release

執行節點

在建立節點模板之後,執行該節點與我們之前所做的相同。

./target/release/substrate-demo --dev

此命令應該再次具有類似的輸出,並且該節點應該啟動並執行和生成區塊。

Substrate節點與使用者介面連線

現在我們已經使用令牌傳輸執行了Substrate節點,讓我們將它與UI連線以檢視它是否正常工作。

最簡單的方法是使用Polkadot Apps Portal。它是一個託管的Web應用程式,主要用於連線到Polkadot網路節點,但它也可以連線到本地Substrate節點。

要使用Polkadot Apps UI進行嘗試,請按照以下步驟操作:

· 本地節點執行後,在瀏覽器中開啟以下內容,https://polkadot.js.org/apps/

轉到設定頁面,然後選擇遠端節點/端點中的本地節點以連線到輸入。單擊“儲存並重新載入”。

應用程式門戶將連線到您的本地Substrate節點,如果您轉到Explorer頁面,它應該顯示生成的塊。以下螢幕截圖顯示了連線了本地節點的Polkadot Apps門戶的資源管理器檢視。

從UI呼叫Dispatchable函式

要初始化令牌,請呼叫Apps門戶的Extrinsics頁面中模板部分下的init()函式。 請參閱以下螢幕截圖以供參考。

如您所見,有一個預先選擇的帳戶Alice,當單擊Submit Transaction按鈕時,它將用於簽署函式呼叫。

當此事務在區塊中完成時,帳戶Alice將根據模組中init()函式中的邏輯具有所有21000000個令牌。

從UI查詢儲存值

從UI呼叫init()函式後,帳戶Alice應該具有更新的令牌餘額21000000.讓我們透過檢查UI中的儲存值來驗證。

回想一下上一節,我們使用名為BalanceOf的儲存項來儲存針對AccountIds的令牌餘額。我們來看看Alice的AccountId儲存的餘額是多少。

您可以使用門戶的Chainstate頁面來查詢儲存專案。導航到此頁面,從第一個下拉選單(模組列表)中選擇模板,然後從下一個選單中選擇balanceOf(AccountId):u64。從AccountId選單中,選擇Alice。現在點選+按鈕。它將顯示Alice的令牌餘額的更新值(如以下螢幕截圖所示)。

就這樣。我們構建了一個簡單的區塊鏈執行時,並在不到20分鐘內將其連線到一個UI。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;