🤚

solidity を solang でwasm にコンパイルして astar-collator にデプロイする

2022/02/13に公開

環境

  • windows 11
  • WSL2 Ubuntu 20.04
  • astar-collator 3.6.0-08c5843f-x86_64-linux-gnu

実践

以下のチュートリアルをやってみる。
https://docs.astar.network/v/japanese-v1.0.4/build/smartcontract/solidity

今回もたくさん怒られながらやった。
が、solang のインストール以外は簡単なお仕事であった。

solang のビルド

以下のページを参考に、solang をインストールする。
https://solang.readthedocs.io/en/latest/installing.html#download-release-binaries

今回のエラー達

  1. llvm のバージョンが足りない
   Compiling pest_generator v2.1.3
error: No suitable version of LLVM was found system-wide or pointed
              to by LLVM_SYS_120_PREFIX.

以下から llvm をダウンロードして任意のディレクトリにインストールして解決。
https://github.com/hyperledger-labs/solang/releases/download/llvm13.0-1/llvm13.0-linux-x86-64.tar.xz

  1. tower-lsp が古い?
   Compiling tower-lsp v0.14.1
error[E0308]: mismatched types
   --> /home/hoge/.cargo/registry/src/github.com-1ecc6299db9ec823/tower-lsp-0.14.1/src/lib.rs:108:1
    |
108 | #[rpc]
    | ^^^^^^ expected enum `std::option::Option`, found enum `Id`
    |
    = note: expected enum `std::option::Option<Id>`

上記、ソースコードからbuild すれば回避可能であった。
すると、以下のようなエラーに見舞われる。

  1. libxml2 が無いよ
s/solang-ce72bae96e48c656" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro,-znow" "-Wl,-O1" "-nodefaultlibs"
  = note: /usr/bin/ld: cannot find -lxml2
          collect2: error: ld returned 1 exit status

なので、 xml2 をインストールする。

sudo apt install libxml2-dev

solang ビルド終わり

以下の成果物ができていれば成功。

$ ./target/release/solang -V
solang version v0.1.9-134-gcfb502f2

solang で flipper をコンパイルする

チュートリアル通り、以下のコマンドを実行する。

wget https://raw.githubusercontent.com/hyperledger-labs/solang/master/examples/flipper.sol
solang flipper.sol

すると、以下のように怒られる。

$ solang flipper.sol
error: The following required arguments were not provided:
    --target <TARGET>

USAGE:
    solang [OPTIONS] --target <TARGET> <INPUT>...

For more information try --help

target を指定してくれ、と。
solang --help でもっと情報を集める。すると、以下のように書かれている。

        --target <TARGET>
            Target to build for [possible values: solana, substrate, ewasm]

astar は substrate ベース?[1]なので、 substrate を指定して、以下の様に実行する。

solang --target substrate flipper.sol

すると、以下の成果物を得られる。

$ls
flipper.contract  flipper.sol  flipper.wasm

後は、以下の記事通り、 flipper.contract を polkadot.js 上でデプロイできる。
https://zenn.dev/polonity/articles/fc511a376af0f0

後は煮るなり焼くなり好きに楽しむ。

脚注
  1. この表現が正しいか自信ないっす。。。substrate のどのパッケージまで使用しているかをちゃんと調べたい。 ↩︎

Discussion