本節開始,我們將開始學習ink合約開發。
- 環境依賴
需要安裝nightly工具鏈:
rustup component add rust-src --toolchain nightly
rustup target add wasm32-unknown-unknown --toolchain nightly
- 安裝substrate contract node
因為部署合約需要使用到pallet-contracts pallet,我們這裡使用已經配置好該pallet的模板。安裝命令如下:
cargo install contracts-node --git https://github.com/paritytech/substrate-contracts-node.git --tag v0.3.0 --force --locked
- 安裝ink!CLI
為了方便的設定substrate智慧合約,我們需要安裝ink!CLI。
(1)安裝ink!CLI需要先安裝依賴binaryen包,命令如下:
# For Ubuntu or Debian users
sudo apt install binaryen
# For MacOS users
brew install binaryen
(2)安裝ink!CLI,命令如下:
cargo install cargo-contract --vers ^0.16 --force --locked
(3)安裝後,可以用如下命令檢視:
cargo contract --help
建立合約工程,命令如下:
cargo contract new flipper
3.1 合約原始碼
透過前面的命令,ink!CLI給我們生成了一個最簡單的智慧合約程式碼。程式碼非常簡單,有興趣的小夥伴可以看一下生成的程式碼,在flipper/lib.rs中。
3.2 測試合約程式碼
在生成的程式碼中,我們可以看到有測試程式碼,我們可以對其用鏈下測試環境進行測試,在flipper目錄下執行如下命令:
cargo +nightly test
3.3 編譯合約程式碼
編譯合約的命令如下:
cargo +nightly contract build
注意:
如果編譯時出現錯誤
call to unsafe function
,可以透過執行cargo install --force cargo-contract && rustup update
解決。如果出現錯誤
Your wasm-opt version is 91, but we require a version >= 99
,可以參照https://docs.porta.network/developer-guide/smart-contracts/install-wasm-opt-version-101解決。
編譯好後的合約在target目錄中,其中包含一個metadata檔案和.contract檔案。.contract檔案就是用來部署到鏈上的合約檔案,而metadata檔案則包含合約的ABI。
執行命令如下:
substrate-contracts-node --dev --tmp
部署合約需要我們在瀏覽器開啟工具Canvas UI,然後選擇點選左下角的Local Node
,這樣就連線到了我們本地的節點。
substrate中部署合約主要有以下兩步:
- 把合約程式碼放在鏈上;
- 建立合約的例項。
5.1 上傳合約程式碼
連線上Canvas UI後,我們可以上傳我們的合約程式碼,主要步驟如下:
- 點選Upload & Instantiate Contract;
- 在 Instantiation account選擇一個賬戶(如alice);
- 在descriptive Name輸入一個名字;
- 將我們前面編譯的flipper.contract檔案拖到drag & drop 區域;
- 最後點選Constructor Details。
5.2 在鏈上例項化合約
智慧合約作為區塊鏈上賬戶系統的擴充套件而存在。因此,建立此合約的例項將建立一個新的AccountId,它將儲存智慧合約管理的任何餘額,並允許我們與合約互動。
在上面一步我們點選後,進入的例項化介面,我們需要填上合約例項化的名字,還有初始化的相關的值,然後點選instantiate
,再點選Sign & Submit
。
至此,我們就把合約部署完成了。
我們現在可以執行合約了,點選ABI
,可以看到有get
和flip
兩個函式,選擇後,點選execute
按鈕,可以執行。
至此,我們就使用官方的例子體驗了一下ink!合約。
docs.substrate.io/tutorials/v3/ink...
github.com/anonymousGiga/substrate...
本作品採用《CC 協議》,轉載必須註明作者和本文連結