すべてのプロダクト
Search
ドキュメントセンター

Blockchain as a Service:Solidity 開発スタートアップ

最終更新日:Jan 19, 2025

このトピックでは、簡単なコントラクトコードを例に、コード構造について説明します。

サンプルコード

次のコードは、Ant Blockchain のコントラクトプラットフォームにおける、クレジットの発行、転送、および照会のメソッドを含む、シンプルなクレジット管理プロジェクトを示しています。

pragma solidity ^0.4.0;

contract CreditManager {
    int256 creditLimit = 1000000000;   // 発行限度
    int256 issueAmount = 0;           // 発行総額
    identity admin;                    // コントラクトの管理者

    mapping(identity=>int256) credit; 

    event IssueEvent(identity indexed to, int256 indexed value);
    event TransferEvent(identity indexed from, identity indexed to, int256 indexed value);

    function CreditManager() {
        admin = msg.sender;
    }

    // 修飾子
    modifier onlyAdmin() {
        require(msg.sender == admin,"権限が拒否されました");
        _;
    }

    // クレジットを発行する。管理者のみ実行可能
    function Issue(identity account, int256 value) public onlyAdmin returns(bool) {
        // 値は 0 より大きく、issueAmount に value を加えた値は issueAmount より小さく、value は 0 より大きい必要があります。
        require(issueAmount + value <= creditLimit && issueAmount + value > issueAmount && value > 0, "無効な値です!") ;
        credit[account] += value;
        issueAmount += value;
        IssueEvent(account,value);
        return true;
    }

    function Transfer(identity account,int256 value) public returns(bool) {
        require(credit[msg.sender] >= value, "残高が不足しています!") ;
        require(value > 0 && value <= creditLimit, "無効な値です!") ;
        credit[msg.sender] -= value;
        credit[account] += value;
        TransferEvent(msg.sender,account,value);
        return true;
    }

    function Query(identity account) public returns(int256) {
        return credit[account];
    }
}

コード分析

コントラクトバージョンを宣言する

まず、contract キーワードの宣言から始めて、コントラクトバージョンを宣言する必要があります。

次のコードに示すように、Ant Blockchain のコントラクトプラットフォームは、Solidity バージョン 0.4.24 をベースに修正および再設計されています。バージョン 0.4.24 より前の機能がサポートされています。

pragma solidity ^0.4.0;
contract CreditManager {

変数を宣言する

このコントラクトの例では、クレジットの総額(creditLimit)と発行済みの額(issueAmount)を保持するために 2 つの変数が定義されています。identity データ型は、各ユーザーを識別するために使用されます。たとえば、コントラクト管理者(admin)の ID は 32 バイトの文字列です。各 ID はブロックチェーン上で一意であり、ユーザーのクレジットにラベルを付けるために使用できます。

int256 creditLimit = 1000000000;   // 発行限度
int256 issueAmount = 0;           // 発行総額
identity admin;                   // コントラクトの管理者
mapping(identity=>int256) credit;

イベントを宣言する

この例では、対応するメソッドの実行を記録するために、IssueEvent と TransferEvent の 2 つのイベントが宣言されています。IssueEvent はクレジットの発行を記録し、TransferEvent はクレジットの転送を記録します。ログの詳細については、第 6 章を参照してください。

event IssueEvent(identity indexed to, int256 indexed value);
event TransferEvent(identity indexed from, identity indexed to, int256 indexed value);

コンストラクター関数を定義する

コンストラクター関数では、コントラクト管理者(admin)のアカウント ID を設定し、modifier キーワードを使用して管理者権限を設定します。(キーワードの説明を見るにはクリックしてください)

function CreditManager() {
    admin = msg.sender;
}

// 修飾子、mas.sender が admin と異なる場合、コントラクトは出力に「権限が拒否されました」と表示します
modifier onlyAdmin() {
    require(msg.sender == admin,"権限が拒否されました");
    _;
}

実装メソッドを定義する

この例では、コントラクトには、クレジットの発行、転送、および照会の各実装メソッドが含まれています。

次のコードに示すように、対応するメソッドを呼び出してクレジットを発行する場合、onlyAdmin フィールドを使用して、この操作を管理者のみが実行できるようにします。次に、ユーザーによって渡されたアカウントにクレジットが追加されます。発行プロセス中にクレジットのオーバーフローが発生しないようにします。クレジットが発行された後、クレジット発行イベントがトリガーされ、ユーザーはログでイベントレコードを表示できます。

// クレジットを発行する。管理者のみ実行可能
    function Issue(identity account, int256 value) public onlyAdmin returns(bool) {
        // 値は 0 より大きく、issueAmount に value を加えた値は issueAmount より小さく、value は 0 より大きい必要があります。
        require(issueAmount + value <= creditLimit && issueAmount + value > issueAmount && value > 0, "無効な値です!") ;
        credit[account] += value;
        issueAmount += value;
        IssueEvent(account,value);
        return true;
    }

転送操作は発行操作に似ています。ただし、転送操作とクエリ操作には管理者権限は必要ありません。