Zenn
🍋

Aleph Zero でスマートコントラクトを作ってみよう!

2024/11/24に公開

この記事では Aleph Zero でスマートコントラクトを開発する方法を紹介します。環境構築からスマートコントラクトのデプロイまでの手順を取り上げます。

Aleph Zero とは

https://alephzero.org/
Aleph Zero は、高スケーラビリティとプライバシー保護を重視した分散型ブロックチェーンプロジェクトです。略して AZERO とも呼びます。独自のコンセンサスアルゴリズム「AlephBFT」を使用した高速で効率的なトランザクション処理や、ゼロ知識証明技術を活用したプライバシー保護機能が特徴です。ネイティブトークンは $AZERO です。

アカウントセットアップ

アカウントの準備

アカウントの作成方法は3種類あります。

  1. Aleph Zero のコアチームによって開発されているブラウザ拡張機能である Aleph Zero Signer extension または Polkadot{.js} extension を利用
  2. サードパーティ製ウォレットを利用
  3. azero.dev 上で手動で作成

私は SubWallet を利用しているため 2. の方法で進めました。

faucet でトークンを取得

こちらからテストネットのトークン(TZERO)を取得できます。ウォレットアドレスを入力して"Make it rain!"ボタンをクリックするだけです。デプロイの際に利用するので入手しておきましょう。
https://faucet.test.azero.dev/

開発環境の構築

Rust のインストール

Rust のデフォルトのインストール方法に従ってインストールします。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env

続けてスマートコントラクト開発のために、nightly(最新)バージョンや追加コンポーネントをインストールします。

rustup toolchain install nightly
rustup component add rust-src --toolchain nightly
rustup target add wasm32-unknown-unknown --toolchain nightly

Rustにはネイティブ・パッケージ・マネージャーとして cargo が付属しています。以下のコマンドで cargo が正しくインストールされているか確認できます。

cargo --help

ink! のインストール

ink! は Rust で WASM スマートコントラクトを記述するための eDSL です。
以下のコマンドでインストールすることができます。環境によりコマンドが異なります。

# Ubuntu or Debian の場合
sudo apt install binaryen
# MacOS の場合
brew install binaryen
# Arch or Manjaro の場合
pacman -S binaryen

cargo contract のインストール

binaryen をインストール後、cargo contract をインストールできるようになります。cargo contract は、Rust で書かれた Substrate で動作するスマートコントラクトを開発するためのツールです。

cargo install --force --locked cargo-contract

スマートコントラクトの作成

テンプレートの作成

cargo contract を使ってテンプレートコントラクトを作成します。mytoken の部分は好きな名前を指定できます。

cargo contract new mytoken
cd  mytoken

正常に処理が終了すると、次の3つのファイルが生成されます。

  • lib.rs: スマコンのコードが書かれた Rust ファイル
  • Cargo.toml: スマコンのビルドに関する設定ファイル
  • .gitignore: gitに管理させないファイル・フォルダを記述するファイル

テンプレートファイル(lib.rs)の実装内容

今回はスマコンの実装内容の変更は行わないため内容を理解せずに以降のセクションを進めることも可能ですが、簡単に内容も見てみましょう。

コントラクトの状態変数を定義します。状態変数は storage と呼ばれる部分で定義します。ここでは単一のブール値 value を格納するための変数を定義しています。

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

スマコンの機能部分です。コンストラクター(constructor)と関数を定義しています。(関数など外部とやりとりする部分を message と呼びます。)ここでは constructor として、デプロイ時に初期値を設定できる init() と初期値を false に設定してデプロイする default() の2つが定義されています。そして message として今の value の値を取得する get() と、value の値を変更する flip() の2つが定義されています。

impl Mytoken {
        /// Constructor that initializes the `bool` value to the given `init_value`.
        #[ink(constructor)]
        pub fn new(init_value: bool) -> Self {
            Self { value: init_value }
        }

        /// Constructor that initializes the `bool` value to `false`.
        ///
        /// Constructors can delegate to other constructors.
        #[ink(constructor)]
        pub fn default() -> Self {
            Self::new(Default::default())
        }

        /// A message that can be called on instantiated contracts.
        /// This one flips the value of the stored `bool` from `true`
        /// to `false` and vice versa.
        #[ink(message)]
        pub fn flip(&mut self) {
            self.value = !self.value;
        }

        /// Simply returns the current value of our `bool`.
        #[ink(message)]
        pub fn get(&self) -> bool {
            self.value
        }
    }

さらにその後ろに自動テストの実装が続きます。#[cfg(test)] から始まる部分が単体テスト、#[cfg(all(test, feature = "e2e-tests"))] から始まる部分が e2e テストです。

コンパイル

次のコマンドでコンパイルを行います。

cargo +nightly contract build --release
実行結果
〜略〜
Original wasm size: 21.3K, Optimized: 1.7K

The contract was built in RELEASE mode.

Your contract artifacts are ready. You can find them in:
/Users/hoge/azero-tutorial/mytoken/target/ink

  - mytoken.contract (code + metadata)
  - mytoken.wasm (the contract's code)
  - mytoken.json (the contract's metadata)

実行後、mytoken/target/ink/ フォルダにファイルが生成されます。コンパイルが問題なく完了すると、次の3つのファイルが生成されます。

  • mytoken.wasm: コンパイルされたコントラクトの WASM ファイル
  • mytoken.json: コントラクトの ABI を含むファイル
  • mytoken.contract: ポータルやエクスプローラー等で使用するために上記2つをまとめたファイル

テストネットへのデプロイ

デプロイはこちらのポータルサイトから行います。
https://ui.use.ink/

今回はテストネットにデプロイするので、左上は Aleph Zero Testnet にします。

中央の "upload a new contract" をクリックしするとこの画面に遷移します。ここではデプロイするウォレットの設定と、スマートコントラクトの名前を設定し、コンパイル時に生成されたスマコンの定義ファイルである mytoken.contract ファイルをアップロードします。

アップロードに成功すると以下のようにコントラクトの内容が表示され、内容に問題がなければ右側に緑色の文字で "The instantiation will be successful." と表示されます。

確認の画面が表示されます。このあとウォレット側で署名などが求められます。

無事デプロイができると以下のような画面が表示されます。

スマートコントラクトを操作

現在の value の値の確認と、value の値を変更(flip)してみましょう。

読み取り(値の確認)

左側の赤いボックスの部分にスマコンに実装されている関数が一覧で表示されます。ここを value の値を読み取る関数である get() に変更すると、右側に関数の結果である今の value の値が表示されます。default() でスマコンを初期化しているため期待通り false が表示されます。

書き込み(値の変更)

今度は value の値を変更する flip() をセットします。実行ボタンを押すとウォレットの署名を求められます。

実行完了後、再度 get()value の値を取得すると、期待通り true に値が変わっていました。


Aleph Zero でスマートコントラクトを開発方法について、環境構築からスマートコントラクトのデプロイまでを取り上げました。今回取り上げた方法は Substrate ベースのスマコンの開発方法ですが、Aleph Zero では EVM ベースのスマコンを実装することも可能です。この記事が少しでも皆様の参考になれば幸いです。ここまで読んでいただきありがとうございました!

Discussion

ログインするとコメントできます