Web3徒然ブログ

Web3という大きな波に会社員エンジニアはどう対峙すべきか。クリプト、NFT、DeFi、メタバース…多様な情報に触れ思考したことを発信します。どこにでもいる会社員だからこその、日々の気づき、ビジネスTipsも発信します。

Astarの開発環境構築でハマったことをメモしていく


WASMのスマートコントラクト開発を
勉強していきます!
web3エンジニアといっても領域広すぎ。
Astarに張るのは、悪くない判断でしょうという私見。

 

Astar Docに則る。

Environment Setup | Astar Docs

 

#Ink!

#Swanky

2022/11/17追記

以下つらつらとハマり点を書いたものの、
Windows環境でAstar Networkのスマコン開発環境構築したい場合は、
Ubuntu(WSL)を使った方が良いです!(暫定結論)

WSLは、WindowsOS上で、Linuxの仮想マシンを動かせる
機能です。

WSLでWindows 10にLinux仮想環境を構築 | パソコン工房 NEXMAG

 

理由)swanky initにて、windowsの場合ファイルパスの処理が
こけている。

globby(projectPath, {
    expandDirectories: { extensions: ["hbs"] },
  });

 

この処理でファイルを上手く取得できてないのです。
ファイルパスの区切り文字/ \がwin/Linuxで違うことに
globbyが対応できていない模様。

 

ごにょごにょとswankyのソースを触ると突破できそうでは
あるけど、同様の処理が他にもないとも限らない。

 

ファイルの区切り文字の問題だったら、Linux系マシンで
最初から構築した方がベータという判断です。

 

 

ハマり1:Rustのインストールにて、windowsはインストーラーから

Windowsの場合、Rustのインストールは
curlコマンドからではなく、インストーラーから

Install Rust - Rust Programming Language

 

ハマり2:Swanky init でError Checking dependencies

checkCliDependencies でエラーとなっている。

cargo contract のコマンドのinstallがどうやらおかしい。

 

解決の第一段階)

cargo-contractのインストールにて

インストールの順を3⇒2と行います。

3. cargo install cargo-dylint dylint-link

↓ その後に

2. cargo install --force --locked cargo-contract

※2. からだと、このエラーになるっす。

 --- stderr
  Encountered error: dylint-link was not found!
  Make sure it is installed and the binary is in your PATH environment.

再度swanky initを実行すると、
Error Checking dependenciesはこれで回避。
しかし、

ハマり3:Error Installing dependencies

npm install -g yarn でyarnをインストールすると、
一応正常終了。

しかし、.hbsという拡張子のファイルが残っており、
怪しい。
Windows環境が原因かもしれない。要調査。

 

 

deployで発生するエラー

swanky node start した後に、

swanky contract deploy flipper --account alice -g 1000000 

(結果)

DeployingTypeError: args is not iterable (cannot read property undefined)
    at DeployApi.deploy (/usr/local/lib/node_modules/@astar-network/swanky-cli/dist/commands/contract/deploy.js:127:31)
    at /usr/local/lib/node_modules/@astar-network/swanky-cli/dist/commands/contract/deploy.js:60:51
    at Spinner.runCommand (/usr/local/lib/node_modules/@astar-network/swanky-cli/dist/lib/spinner.js:32:31)
    at DeployContract.run (/usr/local/lib/node_modules/@astar-network/swanky-cli/dist/commands/contract/deploy.js:58:48)      
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async DeployContract._run (/usr/local/lib/node_modules/@astar-network/swanky-cli/node_modules/@oclif/core/lib/command.js:80:22)
    at async Config.runCommand (/usr/local/lib/node_modules/@astar-network/swanky-cli/node_modules/@oclif/core/lib/config/config.js:272:25)
    at async Object.run (/usr/local/lib/node_modules/@astar-network/swanky-cli/node_modules/@oclif/core/lib/main.js:74:5)     
✖ Error Deploying

-argsというパラメタに何か値を与えていないため、
エラーになっているよう。

公式Doc Swanky Suite | Astar Docsの凡例(gif動画?)でも、

-args true とよく見ると指定されている。

 

気を取り直し、

swanky contract deploy flipper --account alice -g 1000000 -args=True

しかし、ガス代不足と思わしきエラー。

Error: contracts.OutOfGas

ガス代を増やす

swanky contract deploy flipper --account alice -g 1000000000 -args=True

deploy成功したっす

UNCHAINのコンテンツに挑戦~ハマりポイント~

UNCHAINで、Astarの学習コンテンツがリリースされましたね。
早速やってみています。

 

LESSON0-2 環境構築にて、

polkadot.jsからローカルノードに接続するところで、以下エラー。

Waiting to make a connection to the remote endpoint and finishing API initialization

 

察するに、こういう現象

・ノードはWSLのUbuntuで動いている。プロセスはホストのWindowsからは見えない

・ホストのWindowsのブラウザからは、ホストの127.0.0.1:9944を見に行っている

結果、ホストのブラウザからは、WSLのプロセスは見えてない故に起こっていそう。

 

ならば、UbuntuからChromeを起動できれば、ローカルノードが見えるはず!

以下記事を参考にインストール。

WSL2+Ubuntu 20.04にChromeをインストール | AsTechLog

 

ubuntuから$google-chrome の実行だけだと、以下エラー

[13492:13492:1123/163831.368810:ERROR:zygote_host_impl_linux.cc(90)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

 

$google-chrome -no-sandbox と実行することで正常起動できました。

polkadot.jsからローカルノードに接続OK

 

MacBook Air (M2)で新たにswankyインストールでハマった件追記(2023/1/12)

M2チップのMacBookを購入しまして、Astar/slashのハッカソンに
出ようと息巻いています。

 

で、事前の環境構築が必要なためswanky-CLIのインストールを
行っていたんですが、一箇所ハマりました。

 

公式doc

こちらのインストール方法に則りましたが以下エラー。

usr/local/bin/swanky: line 44: /Users/xxxx/hack/astar/swanky/bin/node: Bad CPU type in executable

swanky/bin/swankyのコマンドを読み解くと、どうやら
swanky/bin/node を実行する箇所で前述のエラーが吐かれているよう。

 

これ、node.js のnodeのバイナリのようです。
おそらくば、M2チップに非対応のバージョンでは?と当たりをつける。

 

まず、ピカピカのmacだったというのもあり、
homebrewを使ってnode.jsをインストール。

code-graffiti.com
インストールしたnode.jsの方が使われるように、
愚直ですがswanky/bin/nodeをリネームして呼ばれないようにしました。

(node_など、なんでもOK)

 

結果、swankyのコマンドは通るように。

node.js起因で今後何か不具合出るかもしれないけど、
使いながら様子見作戦です。

 

※後日追記

結局、後からnpm を使った方法でインストールし直しました。
Astarの開発環境ハンズオンに向けての事前案内で、この方法が
記載されていたので。

npm install -g @astar-network/swanky-cli@1.0.7

 

警告が残っているけど当面無視にする!

実のところ、コマンドを実行するたび、「内部で持っているモジュールの
バージョンが2種類あるよ」と警告されるのですが、
動作には今のところ問題なさそうなのでスルーする。

@polkadot/util has multiple versions, ensure that there is only one installed.
Either remove and explicitly install matching versions or dedupe using your package manager.
The following conflicting packages were found:
        cjs 10.2.6      node_modules/@astar-network/swanky-cli/node_modules/@polkadot/util-crypto/node_modules/@polkadot/util/cjs
        cjs 10.2.1      node_modules/@astar-network/swanky-cli/node_modules/@polkadot/util/cjs
@polkadot/util-crypto has multiple versions, ensure that there is only one installed.
Either remove and explicitly install matching versions or dedupe using your package manager.
The following conflicting packages were found:
        cjs 10.2.6      node_modules/@astar-network/swanky-cli/node_modules/@polkadot/util-crypto/cjs
        cjs 10.2.1      node_modules/@astar-network/swanky-cli/node_modules/@astar-network/swanky-core/node_modules/@polkadot/util-crypto/cjs
@polkadot/util-crypto has multiple versions, ensure that there is only one installed.
Either remove and explicitly install matching versions or dedupe using your package manager.
The following conflicting packages were found:
        cjs 10.2.6      node_modules/@astar-network/swanky-cli/node_modules/@polkadot/util-crypto/cjs
        cjs 10.2.1      node_modules/@astar-network/swanky-cli/node_modules/@astar-network/swanky-core/node_modules/@polkadot/util-crypto/cjs
        cjs 10.2.1      node_modules/@astar-network/swanky-cli/node_modules/@polkadot/keyring/node_modules/@polkadot/util-crypto/cjs

 

コントラクトをdeployするときの"args"って何に使われる?

swanky contract deploy flipper --account alice -g 1000000000 --args true         

argsを入れないとどうもエラーになる。
このtrueは何?と思ったけど、
flipperのconstructorの引数に設定されることになります。

 

Polkadot/Substrate Portal からlocal nodeを見るにはbraveブラウザ挙動怪しい

Waiting to establish a connection with the remote endpoint. 
というエラーでぐるぐるして、どうもローカルで立ち上げたノードに
繋がりません。

Google Chromeにブラウザを変更したら、解決。

braveブラウザの何か仕様が制限かかっているのかもしれません。

 

"Weight v2"への対応状況でフロントエンドからの呼び方変わる

docs.astar.network

 

手元の環境でわかる限りだと、

swanky node (1.0.7) → Weight V1

astar-collator(4.39.1) → Weight V2

shibuya → Weight V2

shiden → Weight V2

 

そして、Polkadotポータルって、おそらくWeight V2にまだ未対応なのでは?
と思わしきエラーが出る。

参考

smart contract function call error - Substrate and Polkadot Stack Exchange

 

結論、スマートコントラクトのみの実装時は、

swanky nodeを使う。

 

フロンドエンドと合わせる時は、

astar-collatorを使う。

そしてそろそろテストネットでもと思ったらshibuyaを使う。

のが良さそう。

 

String型はopenbrushのOption<String>を使おう

swankyでdeployをする時のこのエラーで、
数時間溶けた!笑 (でもコード読めるようになってきた感)

 Deployingerror: system.ExtrinsicFailed contracts.CodeRejected
Error: contracts.CodeRejected
    at /Users/yasuyasu/.nodebrew/node/v18.13.0/lib/node_modules/@astar-network/swanky-cli/node_modules/@astar-network/swanky-core/dist/lib/substrate-api.js:108:27
    at Array.forEach (<anonymous>)
    at /Users/yasuyasu/.nodebrew/node/v18.13.0/lib/node_modules/@astar-network/swanky-cli/node_modules/@astar-network/swanky-core/dist/lib/substrate-api.js:89:18
    at /Users/yasuyasu/.nodebrew/node/v18.13.0/lib/node_modules/@astar-network/swanky-cli/node_modules/@polkadot/api/cjs/promise/decorateMethod.js:72:33
    at /Users/yasuyasu/.nodebrew/node/v18.13.0/lib/node_modules/@astar-network/swanky-cli/node_modules/@polkadot/util/cjs/nextTick.js:20:7

どうもですね、use ink_prelude::string::String;

で読み込むString型は、substrateのノードに弾かれるよう。
コンパイルは通るんですけどねぇ。

使って欲しくない型なのかな。

 

フロントエンドから呼ぶときメソッド名が変わるの怪

たとえば、スマートコントラクトで
以下のような名前のメソッドを定義しているとします。

/// Simply return value.
        #[ink(message)]
        pub fn get_description(&self) -> Option<String> {
            return self.description.clone();
        }

 

metadata.json(abiファイルになる)にも、同じメソッド名ですね。

{
          "args": [],
          "docs": [
            " Simply return value."
          ],
          "label": "get_description",
          "mutates": false,
          "payable": false,
          "returnType": {
            "displayName": [
              "Option"
            ],

なんですが、フロントエンド(next.js)から呼ぶときは、
contract.query.getDescription
のような記法で呼び出さないと、エラーになります。

そういえば、Polkadot Portalの方でも、getDescriptionと変換されていましたし。

 

rustの方と、substrateの方でそれぞれにメソッド名への流儀があるのかな。
ちなみに、rustの方でgetDescriptionとすると、get_descriptionにしてね
とうwarningが出ます笑