メインコンテンツまでスキップ

Solidity 言語仕様 基本編

· 約5分

論理知識ある程度まとめたので、実際にスマートコントラクトを作成したいです。 他の言語もありましたが、Solidityのほうが一番情報多いので、Solidityで進めます。

Solidity

基本的には JavaScriptライク、静的な型付けプログラミング言語である

  • 大文字小文字は区別する
  • 文(Statement)最後にはセミコロン

基本記法

contract SingleNumRegister {
uint storedData;

function set(uint x) {
storedData = x;
}

function get() constant returns (uint retVal) {
return storedData;
}
}

特別の箇所だけ抜粋

  • contractでコントラクトを定義
  • functionで関数定義
    • 戻り値ある場合、明示にデータ型を定義する必要がある
    • 戻り値ない場合、定義なし

データ型

カテゴリ定義意味
基本型boolブーリアン
int符号付き整数
uint符合なし整数
addressアドレス専用のデータ型 補足1
enum列挙
function関数
参照型array配列
structsストラクト
その他mappingキーバリューのマップ
  • 参照型(配列とストラクと)は、データの保存場所(Data location)という概念がある
    • memoryまたはstorage
      • memoryの場合は、処理中だけ保持され、終わったら保持されない
      • storageの場合は、処理後、ブロックチェーンに保持される
    • 変数の定義コンテキストによって、デフォルト値をもっていて、強制的に変更も定義できる
      • 関数のパラメータはデフォルト memory
      • ローカル変数の場合はデフォルト storage
    • ステート変数の場合は強制的に storage
      • ステート変数と言うのは、上記基本記法のサンプルにあるstoredDataです。
      • オブジェクト指向の考え方から例を上げると、たとえ ruby で言いますと、コントラクトはクラスであり、ステート変数と言うのは、インスタンスである
      • インスタンス変数を保持する必要があるので、強制的に storage になる
    • 実はまた3個目の場所 calldata がある。外部に公開する関数の場合、そのパラメータに渡される値はこれに該当する。ほとんど memory と同じ動作になる。違うのは、値の変更は不可なところです
  • mapping も参照型だと理解していますが、公式ドキュメントはそう分類されてないので、その他カテゴリにしています
    • mapping はJavaScriptの連想配列と同じ感じですが、特別なのは、キーを保存せず、キーのkeccak256値を保存するので、mapping のサイズ、キー集合、値集合は取得できない。取得したい場合は、右記のように自分で実装する必要がある dapp-bin/iterable_mapping.sol at master · ethereum/dapp-bin

単位とグローバル値

  • 1 ether == 10^8 wei
  • 時刻単位: 1 hour == 60 minutes
  • ブロックチェーン周り(よく使うものを抜粋)
    • block.gaslimit (uint): 当該ブロックの gas limit
    • block.number (uint): 当該ブロックの番号
    • block.timestamp (uint): 当該ブロックのタイムスタンプ、秒数
    • msg.sender (address): 当該呼び出しの呼び出し元アドレス
    • now (uint): block.timestamp と同じ
    • tx.gasprice (uint): 当該トランザクションの gas price

関数とステート変数のアクセス範囲定義

  • external
    • コントラクトのインタフェースであり、他のコントラクトやトランザクションから呼び出せる。内部で直接に呼び出せない。 f()はだめで this.f() はOK
  • public:
    • コントラクトのインタフェースであり、内部か、メッセージ経由で呼び出せる。パブリックなステート変数の場合、自動的にgetter関数が生成される
  • internal:
    • 現在のコントラクトまたは派生コントラクトから呼び出せる
  • private:
    • 現在のコントラクトのみ呼び出せ、派生コントラクトから呼び出せない

参考記事