本文へスキップ
このページは英語からの機械翻訳を使用しており、誤りや不明瞭な表現が含まれている可能性があります。最も正確な情報については、オリジナルの英語版をご覧ください。頻繁な更新のため、一部のコンテンツはオリジナルの英語になっている可能性があります。Crowdinでの取り組みに参加して、このページの翻訳改善にご協力ください。 (Crowdin translation page, Contributing guide)

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 pragma
L02:
L03: import "filename"; // (optional) importing other source files
L04:
L05: // (optional) smart contract definition
L06: contract UserStorage {
L07: mapping(address => uint) userData; // state variable
L08:
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. コンパイラーはコメントを無視する。
  • L01pragma文は、コンパイラの最小バージョンを示す。
  • L03import ステートメントは、"ファイル名" からすべてのグローバルシンボルをインポートする。 filenameは実際のファイル名でなければならない。
  • L05 - L20UserStorage というスマートコントラクトを定義している。 キーワード contract はコントラクト名の前にあり、コードがスマート・コントラクトを表すことを宣言する。 Solidity のコントラクトは、オブジェクト指向言語のクラスに似ています。 各コントラクトには、ステート変数、関数、関数修飾子、イベント、構造体タイプ、enumタイプの宣言を含めることができる。 さらに、契約は他の契約を継承することができる。 サンプルコードには 1 つのコントラクト定義が含まれていますが、1 つの Solidity ファイルには複数のコントラクト定義が含まれている場合があります。
  • L07では、userDataはマッピングタイプの状態変数である。 状態変数はコントラクト・ストレージに恒久的に保存される。 状態変数 userDataaddressuint 値の対応を保持する。 address 型は20バイトのアドレスを保持します(KaiaはEthereumと同様の20バイトのアドレスを使用します)。
  • L09 では、メッセージの送信者の値 xuserData に保存するパブリック関数 set を定義しています。 変数 msg.sender は、Solidityで定義された特別な変数であり、メッセージ(つまり、現在のコール)の送信者のアドレスを表します。 publicというキーワードは、その関数がコントラクト・インターフェースの一部であり、外部からも内部からも呼び出せることを意味する。
  • L13get 関数と L17getUserData 関数は 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 のコードをデバッグするのは、他のプログラミング言語で書かれたコードをデバッグするよりも難しい。 以下に、Solidity のデバッグに関するリソースをいくつか示します。 以下に、Solidity のデバッグに関するリソースをいくつか示します。

注:このセクションは将来更新される予定です。

スマート・コントラクトのベスト・プラクティス

スマートコントラクトからセキュリティの懸念とコード品質の問題を取り除くには、Solidityプログラミングのベストプラクティスを学び、それに従うことが重要です。 ここでは、Solidityのベストプラクティスのリファレンスを示します。 ここでは、Solidityのベストプラクティスのリファレンスを示します。

注:このセクションは将来更新される予定です。

参考文献

ページを改善してください。