Solidity - スマートコントラクト言語
この章では、Solidity で記述された高レベルの概念、開発プロセス、例のみを説明します。 言語の仕様や実装については、以下の参考文献をご参照ください。 本章の内容は、参考文献に掲載されている様々なウェブサイトに基づいている。
SolidityとKaia
Solidity は、イーサリアムプラットフォーム上でスマートコントラクトを実装するための、高レベルの静的型付けされたコントラクト指向言語です。 Solidityはもともとイーサリアム用に設計されたものだが、スマートコントラクトを記述するのに十分な汎用性があるため、Kaiaなど他のブロックチェーンプラットフォームにも使用できる。 Solidityはもともとイーサリアム用に設計されたものだが、スマートコントラクトを記述するのに十分な汎用性があるため、Kaiaなど他のブロックチェーンプラットフォームにも使用できる。
Kaiaは、ロンドンのEthereum Virtual Machine (EVM) バージョンと正式に互換性があります。 カイアの他のEVMバージョンとの後方互換性は保証されません。 したがって、Istanbul ターゲットオプションを使用して Solidity コードをコンパイルすることを強く推奨します。 solcのEVMバージョンの設定方法をご参照ください。
v1.7.0プロトコルアップグレード - IstanbulハードフォークアイテムとKaia自身のアイテムを含む互換性のない変更。
It has been enabled from block number #75,373,312
in case of Baobab network and #86,816,005
for the Cypress network.
v1.7.3プロトコルアップグレード - ロンドンハードフォークからのベースフィーを含む互換性のない変更。
It has been enabled from block number #80,295,291
in case of Baobab network and #86,816,005
for the Cypress network.
It has been enabled from block number #80,295,291
in case of Baobab network and #86,816,005
for the Cypress network.
v1.8.0プロトコルアップグレード - ロンドンハードフォークからのベースフィーを含む互換性のない変更。
It has been enabled from block number #86,513,895
in case of Baobab network and #86,816,005
for the Cypress network.
It has been enabled from block number #86,513,895
in case of Baobab network and #86,816,005
for the Cypress network.
Kaiaのスマートコントラクトを開発する際には、Remix ㊨やTruffle ㊨などの開発ツールを利用することができます。 KaiaチームはEthereumの開発ツールとKaiaの開発ツール間の互換性を維持するよう努めますが、必要に応じてKaiaスマートコントラクト開発者にこれらのツールの拡張版または更新版を提供することを選択する可能性があります。
スマートコントラクトの開発には、RemixやTruffleを利用するのが便利ですが、Solidityコンパイラは、以下のウェブページに記載されている手順に従ってビルドまたはインストールすることで、ローカルで使用することができます:
コマンドラインのSolidityコンパイラーは2つあります:
- solc: 高機能コンパイラ
- Solidity ドキュメント
- solcjs_:solc_のJavascriptバインディング
- 別プロジェクトsolc-jsとして管理されている。
- solcjs_のコマンドラインオプションは_solc_のものと互換性がない。
その他、Solidity を使い始めるのに役立つ資料には次のようなものがあります:
スマート・コントラクトの書き方
このセクションでは、スマートコントラクトがどのように見え、どのようにコントラクトを書くかを読者に提供するために、Solidityソースコードの例を示します。 ここに含まれるコードは、説明のためだけに提供されるものであり、本番用ではないことに注意されたい。 コード中の(require)は、その行がSolidityソースファイルに必要であることを意味し、(optional)
は、その行が必ずしも必要でないことを意味します。 記号 Ln:
は Solidity のコードの一部ではないので、ここでは行番号を表示するためだけに含まれています。 これらの記号は、実際の使用を目的としたソースコードには含めないでください。
L01: pragma solidity 0.5.12; // (required) version pragmaL02:L03: import "filename"; // (optional) importing other source filesL04:L05: // (optional) smart contract definitionL06: contract UserStorage {L07: mapping(address => uint) userData; // state variableL08:L09: function set(uint x) public {L10: userData[msg.sender] = x;L11: }L12:L13: function get() public view returns (uint) {L14: return userData[msg.sender];L15: }L16:L17: function getUserData(address user) public view returns (uint) {L18: return userData[user];L19: }L20: }
したがって、他のプログラミング言語に慣れている人は、このセクションの以下の説明を読み飛ばして、次のセクションに飛んでも構わない。 しかし、コードが何をするのか明確に理解できない人や、Solidityが初めてのプログラミング言語である人のために、以下にソースコードの簡単な説明を記載します: この章では、Solidity で記述された高レベルの概念、開発プロセス、例のみを説明します。 言語の仕様や実装については、以下の参考文献をご参照ください。 本章の内容は、参考文献に掲載されている様々なウェブサイトに基づいている。
- The portions of the code starting with a double forward slash (
//
) are comments rather than code; they are used to annotate and explain the code. コンパイラーはコメントを無視する。 L01
のpragma
文は、コンパイラの最小バージョンを示す。L03
のimport
ステートメントは、"ファイル名
" からすべてのグローバルシンボルをインポートする。filename
は実際のファイル名でなければならない。L05
-L20
はUserStorage
というスマートコントラクトを定義している。 キーワードcontract
はコントラクト名の前にあり、コードがスマート・コントラクトを表すことを宣言する。 Solidity のコントラクトは、オブジェクト指向言語のクラスに似ています。 各コントラクトには、ステート変数、関数、関数修飾子、イベント、構造体タイプ、enumタイプの宣言を含めることができる。 さらに、契約は他の契約を継承することができる。 サンプルコードには 1 つのコントラクト定義が含まれていますが、1 つの Solidity ファイルには複数のコントラクト定義が含まれている場合があります。L07
では、userData
はマッピングタイプの状態変数である。 状態変数はコントラクト・ストレージに恒久的に保存される。 状態変数userData
はaddress
とuint
値の対応を保持する。address
型は20バイトのアドレスを保持します(KaiaはEthereumと同様の20バイトのアドレスを使用します)。L09
では、メッセージの送信者の値x
をuserData
に保存するパブリック関数set
を定義しています。 変数msg.sender
は、Solidityで定義された特別な変数であり、メッセージ(つまり、現在のコール)の送信者のアドレスを表します。public
というキーワードは、その関数がコントラクト・インターフェースの一部であり、外部からも内部からも呼び出せることを意味する。L13
のget
関数とL17
のgetUserData
関数はview
で宣言されている。 これらの宣言にはreturns (uint)
が含まれており、これはuint
値を返すことを意味している。
Solidity 言語の構文とセマンティクスの詳細については、Solidity ドキュメント を参照してください。
コンパイル、デプロイ、実行の方法
このセクションでは、スマートコントラクトがどのように見え、どのようにコントラクトを書くかを読者に提供するために、Solidityソースコードの例を示します。 ここに含まれるコードは、説明のためだ けに提供されるものであり、本番用ではないことに注意されたい。 コード中の(require)は、その行がSolidityソースファイルに必要であることを意味し、(optional)
は、その行が必ずしも必要でないことを意味します。 記号 Ln:
は Solidity のコードの一部ではないので、ここでは行番号を表示するためだけに含まれています。 これらの記号は、実際の使用を目的としたソースコードには含めないでください。 This compiler can produce various outputs, ranging from simple binaries and assembly to an abstract syntax tree (parse tree). 上記のコードをUserStorage.sol
に保存すると仮定した場合(上記のソースファイルでは L03
は除外されている)、UserStorage.sol
をコンパイルする例を以下に示す。
$ solc --bin UserStorage.sol
- このコマンドはコンパイル出力をバイナリ、すなわちバイトコードとして表示する。
solc -o output --bin --ast --asm UserStorage.sol
- コンパイラは、バイナリの(
--bin
)ファイル、抽象構文木の(--ast
)ファイル、アセンブ リコードの(--asm
)ファイルを、それぞれ別のファイルとしてoutput
ディレクトリに生成します。
solc --optimize --bin UserStorage.sol
- より良いパフォーマンスを得るためには、コンパイル時に
--optimize
フラグを使ってオプティマイザを有効にすることができる。
スマート・コントラクトをコンパイル、デプロイ、実行するためのリソースを以下にいくつか挙げる。
- Solidityコマンドラインコンパイラの使用
- Remixを使った契約のコンパイル
- リミックスによる取引の実行
- リミックス・ラーネス・チュートリアル
- Truffle による契約のコンパイル
- Truffleでコントラクトを展開する
注:このセクションは将来更新される予定です。