What is “ink!”???

ひょんなことから「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!?

What is Parity’s ink!?

Core Developer @ Parity Technologies September 20, 2022 in 13 min read On the occasion of ink! surpassing 1,000 stars on Github, we take a deep dive into the smart contract programming language. ink! is a programming language for smart contracts – one of several that blockchains built with the Substrate framework can choose from.

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

No Title

No Description

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つ。

UIについては4つ?(there are currently three choicesとあるが・・・)

Why Rust for Smart Contracts?

元のページに戻ってきました。

なぜink!は新しい言語を作らなかったのか、その理由を確認。

Why Rust for Smart Contracts? | ink! documentation

Version: 4.0-rc ink! chooses not to invent a new programming language, but rather adapt a subset of Rust to serve our purpose. If this doesn’t already convince you, you find many more good reasons here: Rust is an ideal smart contract language: It is type safe, memory safe, and free of undefined behaviors.

  • Rust is an ideal smart contract language: タイプセーフ、メモリセーフ、かつ未定義の振る舞いがない。
  • Rust ecosystem: Rustエコシステムのサポートを受けられる。
  • Tooling: rustfmtclippyrust-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ベースのブロックチェーンで効率的にスマートコントラクトの開発ができるとのこと。