コントラクトの構造

 

Solidityのコントラクトは、オブジェクト指向言語のクラスに似ています。 各コントラクトには、状態変数関数関数修飾子イベント構造体型、および列挙型の宣言を含めることができます。 さらに、コントラクトは他のコントラクトから継承することができます。

状態変数

状態変数は、コントラクトストレージに永続的に格納される値です。

 

pragma solidity ^0.4.0;

contract SimpleStorage {
    uint storedData; // State variable
    // ...
}

 

有効な状態変数の型については、「タイプ」のセクションを参照してください。また、可視性のための選択肢については、「可視性とゲッター」を参照してください。

関数

関数は、コントラクト内のコードの実行可能な単位です。

 

pragma solidity ^0.4.0;

contract SimpleAuction {
    function bid() public payable { // Function
        // ...
    }
}

 

ファンクションコールは、内部的または外部的に発生することができ、他のコントラクトに対して異なるレベルの可視性(VisibilityおよびGetters)を持ちます。

関数修飾子

関数修飾子は、宣言的な方法で関数のセマンティクスを修正するために使用できます(コントラクトの節の関数修飾子を参照してください)。

pragma solidity ^0.4.22;

contract Purchase {
    address public seller;

    modifier onlySeller() { // Modifier
        require(
            msg.sender == seller,
            "Only seller can call this."
        );
        _;
    }

    function abort() public onlySeller { // Modifier usage
        // ...
    }
}

Events

イベントは、EVMログ機能との便利なインターフェイスです。

 

pragma solidity ^0.4.21;

contract SimpleAuction {
    event HighestBidIncreased(address bidder, uint amount); // Event

    function bid() public payable {
        // ...
        emit HighestBidIncreased(msg.sender, msg.value); // Triggering event
    }
}

 

イベントが宣言され、dapp内からどのように使用されるかについては、契約のセクションの「イベント」を参照してください。

構造体の型

構造体は、いくつかの変数をグループ化できるカスタム定義の型です(「型の構造体」を参照)。

 

pragma solidity ^0.4.0;

contract Ballot {
    struct Voter { // Struct
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}

列挙型

列挙型は、「定数値」の有限集合を持つカスタム型を作成するために使用できます(型の列挙型を参照)。

 

pragma solidity ^0.4.0;

contract Purchase {
    enum State { Created, Locked, Inactive } // Enum
}