Solidityとスマートコントラクト: 投資分配を例に
こんにちは、みなさん。今回はJavaScriptの経験があるけれどもSolidityやスマートコントラクトは初めてという方向けに、具体的なスマートコントラクトの一例を通じて、その基本的な概念と作成方法について解説します。
まず、スマートコントラクトとは?
スマートコントラクトは自己実行契約で、契約条件の適用をコードで書くことでデジタル的に追跡し、検証することができます。これらは、トランザクションとともにブロックチェーンに格納され、不変であり、検証可能です。
Solidityとは?
Solidityは、Ethereumブロックチェーン上でスマートコントラクトを作成するための主要なプログラミング言語です。JavaScriptと似た文法を持ち、オブジェクト指向プログラミングをサポートしています。
では、実際に具体的なスマートコントラクトの一例を見てみましょう。
pragma solidity ^0.8.0;
contract FundDistribution {
address owner;
uint totalFunds;
bool projectSuccess;
constructor() payable {
owner = msg.sender; //msg sender represents address that is being called
totalFunds = msg.value; //msg value tell us how much ether is being sent
projectSuccess = false;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
modifier mustBeSuccessful {
require(projectSuccess == true);
_;
}
address payable[] investors;
mapping(address => uint) investments;
function setInvestment(address payable wallet, uint amount) public {
investors.push(wallet);
investments[wallet] = amount;
}
function payout() private mustBeSuccessful {
for(uint i=0; i< investors.length; i++) {
investors[i].transfer(investments[investors[i]]);
}
}
function projectSucceeded() public onlyOwner {
projectSuccess = true;
payout();
}
}
イメージ図
スマートコントラクトの資金分配管理
このスマートコントラクトは、あるプロジェクトの資金分配を管理します。プロジェクトのオーナーが投資家とその投資額を設定します。そして、プロジェクトが成功したら(これは projectSucceeded
関数を呼び出すことで示されます)、オーナーは投資家に利益を分配することができます。
重要な変数と関数
-
owner
: コントラクトを作成(デプロイ)したアドレス。このアドレスのみがプロジェクトの成功を宣言したり、投資を設定することができます。 -
totalFunds
: コントラクトの作成時に送られるEtherの量。これはプロジェクトの総資金です。 -
projectSuccess
: プロジェクトが成功したかどうかを表すブール値。初期状態はfalse
ですが、オーナーがprojectSucceeded
関数を呼び出すとtrue
になります。 -
investors
: 投資家のアドレスのリスト。 -
investments
: 各投資家の投資額を記録するマッピング。キーは投資家のアドレスで、値はその投資額です。 -
setInvestment
: 投資家とその投資額を設定する関数。この関数を呼び出すと、指定されたアドレスと投資額がinvestors
リストとinvestments
マッピングに追加されます。 -
payout
: プロジェクトが成功した場合にのみ呼び出される関数。この関数を呼び出すと、すべての投資家にその投資額が返されます。 -
projectSucceeded
: プロジェクトが成功したことを宣言し、投資の返済を開始するためにオーナーが呼び出す関数。
スマートコントラクトの流れ
このスマートコントラクトの流れは次の通りです:
- プロジェクトのオーナー(コントラクトの作成者)が各投資家とその投資額を設定します。
- プロジェクトが成功したら、オーナーが
projectSucceeded
関数を呼び出します。これによりprojectSuccess
がtrue
に設定され、payout
関数が呼び出されます。 -
payout
関数は、各投資家に対してその投資額を返します。
まとめ
この例を通じて、Solidityを使用してスマートコントラクトをどのように作成するかを学びました。このスマートコントラクトはシンプルながら、Ethereumブロックチェーン上でトランザクションを行い、状態を管理し、様々なアドレス間でEtherを転送するといった基本的な機能を示しています。
実際には、もっと複雑なロジックや安全対策が必要な場合が多いですが、この基本的な例がSolidityとスマートコントラクトの世界への入門となることを願っています。
以上、読んでいただきありがとうございました。