🦔

今更だけどSubstrateのブロックチェーン作成チュートリアルをやってみる

2023/12/04に公開

はじめに

こんにちは〜!皆様いかがお過ごしでしょうか? no plan inc. CTOの @serinuntius です。
これはno plan inc.の Advent Calendar 2023の5日目の記事です。

Rustをいい感じに勉強したので、今更ですがSubstrateのチュートリアルをやってみました。
SubstrateはRustを使って書かれたブロックチェーンフレームワークで、PolkadotAstar などがSubstrateで作られています。

環境構築

  • Rustのインストール
  • Nodeのインストール
  • yarnのインストール

この辺りはあらかじめ済ませておいてください。

テンプレートのダウンロード

git clone https://github.com/substrate-developer-hub/substrate-node-template

cd substrate-node-template

git switch -c my-learning-branch-2023-11-07

cargo build --release
# Finished release [optimized] target(s) in 7m 15s

初めてRustのコンパイルをした方は時間かかりすぎ〜って思うかもしれないですが、それはゼロからのコンパイルの場合で、2回目以降はキャッシュが効くので早いです。

起動する


./target/release/node-template --dev

Macの場合ネットワークの許可のダイアログが出ると思うので、許可してください。

フロントエンドのテンプレートをダウンロード

別窓で以下を実行します。

git clone https://github.com/substrate-developer-hub/substrate-front-end-template

cd substrate-front-end-template
yarn

フロントエンドを起動する

yarn start
http://localhost:8000/substrate-front-end-template

こんな感じの画面が出てきたら成功です。

このサイトは簡易的なウォレットが内蔵されているようで、画面右上のところからアカウントを切り替えることができます。

送金してみる

Transfer パネルのところで送金できます。

試しにdaveへ3000トークンを送金してみます。

txhashが表示され、balanceが変更されてます。

ブロックチェーンのアプリケーションロジックを追加してみる

本当はチュートリアルをそのまま進めると、ネットワークにバリデーターとしてもう1つのノードを追加するところから始まるのですが、今回はブロックチェーンのアプリケーションロジックを追加してみます。

ランタイムにパレットを追加する

substrate-node-template は、カスタムブロックチェーンを開発するための出発点として、デフォルトのFRAME開発モジュールを含むランタイム環境を提供します。

このチュートリアルでは、そうしたランタイム環境に新しいパレットを追加するための基本的なステップを説明し、そのプロセスがどんな感じで一般的に適用可能であるかを示しながらも、特定のパレットが要求するユニークな設定やパラメーター、型についても注意を払う必要があることを確認します。

各パレットは、ブロックチェーン内で特定の機能を果たすために、独自の構成要素を必要とします。これらの要素は、ブロックチェーンがその能力を最大限発揮するために最適化されるべき重要な部分です。

runtimeのCargo.tomlを編集する

[dependencies]
pallet-nicks = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v1.0.0" }

同ファイルの featurespallet-nicks/std を追加する。

[features]
default = ["std"]
std = [
  ...
  "pallet-aura/std",
  "pallet-balances/std",
  "pallet-nicks/std",
  ...
]

ちゃんと依存関係を解決できるかチェックする。

cargo check -p node-template-runtime --release

Finished release [optimized] target(s) in 2m 16s 大丈夫そう。

runtime/src/lib.rs を編集する

impl pallet_balances::Config for Runtime { の下に以下を追加する。

impl pallet_nicks::Config for Runtime {
	type Currency = Balances;
	type ReservationFee = ConstU128<100>;
	type Slashed = ();
	type ForceOrigin = frame_system::EnsureRoot<AccountId>;
	type MinLength = ConstU32<8>;
	type MaxLength = ConstU32<32>;
	type RuntimeEvent = RuntimeEvent;
}

lib.rsのどこかで呼ばれている construct_runtime! の中に Nicks: pallet_nicks, を追加する。

construct_runtime!(
	pub struct Runtime {
		System: frame_system,
		Timestamp: pallet_timestamp,
		Aura: pallet_aura,
		Grandpa: pallet_grandpa,
		Balances: pallet_balances,
		TransactionPayment: pallet_transaction_payment,
		Sudo: pallet_sudo,
		TemplateModule: pallet_template,
        // これだけ追加
		Nicks: pallet_nicks,
	}
);

checkして、問題なければビルドする。

cargo check -p node-template-runtime --release
cargo build -p node-template-runtime --release

ノードを起動する

./target/release/node-template --dev

フロントエンドを起動する

cd substrate-front-end-template
yarn start

ニックネームを登録する

http://localhost:8000/substrate-front-end-template にアクセスして、Pallet Interactor パネルに行く。

Extrinsicを選択して、nicks を選択し、 setName を選択する。

適当に名前を入れて、 signed で送信する。

ニックネームを確認する

Interaction Type Query を選択し、nicks を選択し、 nameOf を選択する。そこでさっきのcallerのアカウントを入れて、送信する。

私はaliceで登録したので、 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY を入れて送信する。

そうすると謎の文字列と100を得ることができました。

["0x62726f6164636173746572",100]

先頭の文字列はasciiエンコードされた文字列なので、asciiでデコードすれば元の文字列が見られます。

$ echo 0x62726f6164636173746572 | xxd -r -p
broadcaster

100はMaxLengthですね。

まとめ

Substrateのチュートリアルをやってみましたが、思った以上に簡単にブロックチェーンを作ることができました。
皆さんも是非チャレンジしてみてください。

no plan株式会社について

  • no plan株式会社は 「テクノロジーの力でZEROから未来を創造する、精鋭クリエイター集団」 です。
  • ブロックチェーン/AI技術をはじめとした、Webサイト開発、ネイティブアプリ開発、チーム育成、などWebサービス全般の開発から運用や教育、支援なども行っています。よくわからない、ふわふわしたノープラン状態でも大丈夫!ご一緒にプランを立てていきましょう!
  • no plan株式会社について
  • no plan株式会社 | web3実績
  • no plan株式会社 | ブログ一覧

エンジニアの採用も積極的に行なっていますので、興味がある方は是非ご連絡ください!

参考文献

https://docs.substrate.io/tutorials/build-a-blockchain/
https://docs.substrate.io/tutorials/build-application-logic/
https://docs.substrate.io/tutorials/build-application-logic/add-a-pallet/
https://docs.substrate.io/tutorials/collectibles-workshop/03-create-pallet/

Discussion