Closed9

ink! を学習する

kotakota

cargo contracts インストール

  • rustupインストール済みでcargo使える状態とする

公式のgithubに従うと、
Step 2: cargo install --force --locked cargo-contractで以下のようにビルドエラーになる。

error: failed to run custom build command for `cargo-contract v1.5.0`

対処法

Step 3: (Optional) Install dylint for linting.を先に実行すると上手くインストール出来る。

$ rustup component add rust-src
$ cargo install cargo-dylint dylint-link
$ cargo install --force --locked cargo-contract
kotakota

cargo contract でビルド

cargo +nightly contract build"Cargo.lock" does not exist, unable to build with the standard library, と怒られる。

対処法

提案のように以下をインストールする。

$ rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu

ERROR: Your wasm-opt version is 91, but we require a version >= 99.

wasm-optのバージョンが低いと怒られる。
このスレッドでも上がっていた。

対処法

wasm-optのversionを上げる方法に従う。
bainaryファイルを落としてきた。今回はversion101にした。tarファイルなので展開する。
コピーしてバージョン上げると、cargo +nightly contract buildが成功する。

$ cd /
$ sudo cp -r {your folder}/binaryen-version_101-x86_64-linux/binaryen-version_101/bin/* /bin
$ sudo cp -r {yours}/binaryen-version_101-x86_64-linux/binaryen-version_101/include/* /usr/include
$ sudo cp -r {yours}/binaryen-version_101-x86_64-linux/binaryen-version_101/lib64/* /lib64
$ wasm-opt --version
wasm-opt version 101 (version_101)
kotakota

astar collator でcontractにデプロイ出来ない

$ cargo +nightly-2022-12-03 contract build
$ ./astar-collator --dev

で立ち上げたノードにpolkadot.jsでcontractデプロイすると、runtime errorになる。
以下はnodeのログである。

Thread 'tokio-runtime-worker' panicked at 'Bad input data provided to validate_transaction: Could not decode `UncheckedExtrinsic.0`:
Could not decode `MultiAddress`, variant doesn't exist
', runtime/local/src/lib.rs:1033

原因

nodeに問題があるのではなく、ブラウザの方でブロックされていた結果エラーが出ていた。
vivaldi, edge, では動かない。firefox, chromeでは動いた。

リンク

kotakota

ink! アトリビュートについて

ink!アトリビュートの構成

use ink_lang as ink;

#[ink::contract]
mod hoge_contract {
   
   #[ink(storage)]
   pub struct HogeContract {
       value: bool,
   }

   impl HogeContract {
       
       #[ink(constructor)]
       pub fn new(init_value: bool) -> Self {
           Self { value: init_value }
       }

       #[ink(constructor)]
       pub fn default() -> Self {
           Self::new(Default::default())
       }

       #[ink(message)]
       pub fn flip(&mut self) {
           self.value = !self.value;
       }

       #[ink(message)]
       pub fn get(&self) -> bool {
           self.value
       }
   }

   mod tests {
       
       use super::*;

       use ink_lang as ink;

       #[ink::test]
       fn default_works() {
           let hoge_contract = HogeContract::default();
           assert_eq!(hoge_contract.get(), false);
       }

       #[ink::test]
       fn it_works() {
           let mut hoge_contract = HogeContract::new(false);
           assert_eq!(hoge_contract.get(), false);
           hoge_contract.flip();
           assert_eq!(hoge_contract.get(), true);
       }
   }
}

#[ink::contract]

コントラクトを定義

#[ink::contract]
mod hoge_contract {
}

#[ink(storage)]

コントラクトの状態変数を定義

   #[ink(storage)]
   pub struct HogeContract {
       value: bool,
   }

#[ink(constructor)]

コンストラクタ、コントラクトがデプロイされた時に一度だけ起動される関数を定義

       #[ink(constructor)]
       pub fn new(init_value: bool) -> Self {
           Self { value: init_value }
       }

#[ink(message)]

コントラクトから外部より呼び出すことが出来る関数を定義

       #[ink(message)]
       pub fn get(&self) -> bool {
           self.value
       }

#[ink::test]

テスト関数を定義

       #[ink::test]
       fn default_works() {
           let hoge_contract = HogeContract::default();
           assert_eq!(hoge_contract.get(), false);
       }
kotakota

swanky-nodeでビルドエラー

$ cargo build --release
error: failed to open: ~/swanky-node/target/release/.cargo-lock
Caused by:
  Permission denied (os error 13)

対処法

実行権限を与えると上手くいった。

$ sudo chown -R $(whoami) /~/swanky-node/

ただ、少し怪しいので、他の対処法もメモしておく。

エラーのスレッド

対処法1

  1. vscode閉じる
  2. cargo clean
  3. cargo build

対処法2

tmpfsというメモリ上に出来るファイルシステムをマウント。

$ sudo mount -t tmpfs none ./target
kotakota

swanky-cli

swankyはWASMを使用してastar上で動くdappsを作るためのフレームワークである。
Ethereumのhardhatみたいな感じ。nodeもコンパイルも全部入っているので便利。

https://github.com/AstarNetwork/swanky-cli

今回は以下のサイトを勉強と参考にしつつ、swanky-cliを用いてコントラクトデプロイする方法まで学習した。コマンドが古くなっていたので、githubを参考にした。
https://realtakahashi-work.medium.com/astar-network-introduce-of-swanky-cli-1d33f4377704

npmインストール

$ npm i -g @astar-network/swanky-cli@latest

project作成

swanky nodeはローカルで落としてきているのなら、noでもいい。ただ、swanky node startで動かせるから楽。

$ swanky init yourProject
? Which contract language should we use? ink
? Which contract template should we use initially? flipper
? What should we name your initial contract? flipper
? What is your name? yourname
? What is your email? yourname@mail.com
? Do you want to download Swanky node? Yes

contractをコンパイルする

./contract/配下にcontractが作成される。

$ swanky contract compile CONTRACTNAME

swanky nodeを実行

$ swanky node start

コントラクトをデプロイする

swanky-cliの公式を見ると以下のように書かれている。
githubの説明
./contract/配下にあるデプロイしたいコントラクトを指定し、gas代とデプロイアカウントを指定している。

デプロイ後はコントラクトアドレスが表示される。

$ swanky contract deploy flipper --account alice --gas 1000000000 --args true
~~~~~~~~~~~~~~~~~snip
Contract deployed!
Contract address: AAAyourContractAddressZZZ

polkadot.js/appで動作確認

polkadot.js/appのdevelopmentに移動して、既存のコントラクトを追加するより、コントラクトを追加する。
先ほど得たコントラクトアドレスを入力して、./contract/yourContract/target/ink/metadata.jsonをアップロードすれば、コントラクトがデプロイされていることを確認できる。

このスクラップは2023/01/15にクローズされました