ひょんなことから「ink!」を使うことになり、調べることに。
ink! is a programming language for smart contracts.
You can use it with blockchains built on Substrate.
“ink!”はスマートコントラクトのためのプログラミング言語。
Substrate上に作られたブロックチェーンで使うことができる。
・・・
読み進めていこうと思ったら良い記事が。
What is Parity’s ink!?
2022年9月の記事だが、GitHub上のParityリポジトリで、SubstrateとPolkadotに次いで3番目に大きなリポジトリとのこと。
ink! is a programming language, specifically it is an embedded domain-specific language (eDSL) for the popular Rust programming language.
ink!はRust言語用のeDSL(embedded domain-spacific language)。
With ink! you can write smart contracts in Rust for blockchains built with Substrate that include the Contracts pallet.
ink!を使うことで、Contract palletを含むSustrateで構築されたブロックチェーンにRust言語でスマートコントラクトを書ける。
To restate this important distinction: developing a parachain runtime is different from developing a smart contract ‒ a smart contract sits on top of a parachain.
パラチェーンの開発とスマートコントラクトの開発は異なる。
スマートコントラクトはパラチェーン上にあるもの。
Why include the Contracts pallet on a parachain?
- Use Case 1: Smart Contracts as “first-class citizens”: チェーンの中心的な価値としてのスマートコントラクト
- Use Case 2: Smart Contracts as “second-class citizens”: add-onとしてのスマートコントラクト
- Use Case 3: Smart Contracts as a first step into Polkadot or Kusama: PolkadotやKusamaに移行するためのプロトタイプ
A simple ink! smart contract
The colored lines are ink!-specific annotations in the code, the rest is just normal Rust syntax.
カラー行がink!専用のアノテーションで、残りはRustの文法。
cargo-contract
コマンドを使うことで、cargo build
だけでなく、3つの重要なステップも実行してくれる。
- It runs a linter for ink! contracts: コントラクトのliner(Rustのclippyのようにink!の慣用的な使い方がされているかのチェック)を実行する
- It post-processes and compresses your contract’s binary: バイナリの後処理と圧縮
- It generates metadata for the contract: コントラクトのメタデータ生成
結果3つの成果物ができる。
- my_contract.contract: JSONファイルで、コントラクトのメタデータを含んだもの。
- metadata.json: JSONファイルで、コントラクトのメタデータだけのもの。
- my_contract.wasm: コントラクトのWebAssemblyバイナリ。
Development Environments
ネットワークは2つ。
- substrate-contracts-node: https://github.com/paritytech/substrate-contracts-node
- Rococo: PolkadotとKusamaのテストネット
UIについては4つ?(there are currently three choicesとあるが・・・)
- Contracts UI: https://contracts-ui.substrate.io/ ※初心者用
- polkadot.js: https://polkadot.js.org/apps/#/explorer ※上者用
- ink! playground: https://ink-playground.substrate.io/: ※コードスニペットをシェアできる
- cargo-contract: https://github.com/paritytech/cargo-contract ※これはCLI。
Why Rust for Smart Contracts?
元のページに戻ってきました。
なぜink!は新しい言語を作らなかったのか、その理由を確認。
- Rust is an ideal smart contract language: タイプセーフ、メモリセーフ、かつ未定義の振る舞いがない。
- Rust ecosystem: Rustエコシステムのサポートを受けられる。
- Tooling:
rustfmt
、clippy
、rust-analyzer
- No overhead: 最小のランタイム。
- Safe & Efficient: ゼロコスト、安全な抽象化。
- Productive: Cargoとcrates.ioのエコシステム
- 1st class Wasm: Wasmのファーストクラスの支援を提供。
- Small Size: ブロックチェーンではサイズは重要で、Rustのデータ構造はコンパクトで多くの場合Cよりコンパクト。
Why WebAssembly for Smart Contracts?
- High performance: ハイパフォーマンスで、プラットフォーム非依存。
- Small size: ブロックチェーンに非常によくフィットできるくらい小さいバイナリ。
- General VM & bytecode: EVMと違って、多くのツールが利用でき、大企業も多くのリソースを開発に投入している。
- Efficient JIT execution: CPUの命令と1:1で対応する64bitと32bitの整数演算をサポート。
- Minimalistic: 1ページに収まる仕様。
- Deterministic execution: 浮動小数展演算を除くことで決定論的にすることができる。
- Open Standards > Custom Solutions: WasmはGoogle、Mozillaなどが含まれるW3Cが開発しているWebブラウザの標準。
- Many languages available: 慣れした親しんだ言語を使うことが可能。ただし、Rustはランタイムのオーバーヘッドがないし、セキュリティ特性などもあり、好んでいる。
- LLVM support: 10年以上も使われてきたLLVMの恩恵を受けられる。
- Large companies involved: Google、Apple、MS、Mozilla、Facebookなど大企業が継続的に開発している。
まとめ
ink!はRustにちょっとしたアノテーションを加えたもので、Substrateベースのブロックチェーンで効率的にスマートコントラクトの開発ができるとのこと。