このトピックでは、簡単なコントラクトコードを例に、コード構造について説明します。
サンプルコード
次のコードは、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;
}転送操作は発行操作に似ています。ただし、転送操作とクエリ操作には管理者権限は必要ありません。