ink! を学習する
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
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)
cargo 出てきたコマンド
$ cargo +nightly contract new flipper
$ cargo +nightly contract build
$ cargo +nightly test
リンク
2.の動画まで見た。ワークショップのやつ
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では動いた。
リンク
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);
}
OpenBrush
ethreumのopenzipppelinの、ink!版である。
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
- vscode閉じる
- cargo clean
- cargo build
対処法2
tmpfsというメモリ上に出来るファイルシステムをマウント。
$ sudo mount -t tmpfs none ./target
swanky-cli
swankyはWASMを使用してastar上で動くdappsを作るためのフレームワークである。
Ethereumのhardhatみたいな感じ。nodeもコンパイルも全部入っているので便利。
今回は以下のサイトを勉強と参考にしつつ、swanky-cliを用いてコントラクトデプロイする方法まで学習した。コマンドが古くなっていたので、githubを参考にした。
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の公式を見ると以下のように書かれている。
./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をアップロードすれば、コントラクトがデプロイされていることを確認できる。
swanky init yourproject でerror
上記のスレッドで議論されている。
package.jsonで"@polkadot/util-crypto": "10.1.13"
に更新すればいいようだ。