1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Solidityとスマートコントラクト: 投資分配を例に

Last updated at Posted at 2023-06-15

Solidityとスマートコントラクト: 投資分配を例に

こんにちは、みなさん。今回はJavaScriptの経験があるけれどもSolidityやスマートコントラクトは初めてという方向けに、具体的なスマートコントラクトの一例を通じて、その基本的な概念と作成方法について解説します。

まず、スマートコントラクトとは?

スマートコントラクトは自己実行契約で、契約条件の適用をコードで書くことでデジタル的に追跡し、検証することができます。これらは、トランザクションとともにブロックチェーンに格納され、不変であり、検証可能です。

Solidityとは?

Solidityは、Ethereumブロックチェーン上でスマートコントラクトを作成するための主要なプログラミング言語です。JavaScriptと似た文法を持ち、オブジェクト指向プログラミングをサポートしています。

では、実際に具体的なスマートコントラクトの一例を見てみましょう。

FundDistribution.sol
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();
    }
}

イメージ図

スクリーンショット 2023-06-16 午前5.54.26.png

スマートコントラクトの資金分配管理

このスマートコントラクトは、あるプロジェクトの資金分配を管理します。プロジェクトのオーナーが投資家とその投資額を設定します。そして、プロジェクトが成功したら(これは projectSucceeded 関数を呼び出すことで示されます)、オーナーは投資家に利益を分配することができます。

重要な変数と関数

  • owner: コントラクトを作成(デプロイ)したアドレス。このアドレスのみがプロジェクトの成功を宣言したり、投資を設定することができます。

  • totalFunds: コントラクトの作成時に送られるEtherの量。これはプロジェクトの総資金です。

  • projectSuccess: プロジェクトが成功したかどうかを表すブール値。初期状態は false ですが、オーナーが projectSucceeded 関数を呼び出すと true になります。

  • investors: 投資家のアドレスのリスト。

  • investments: 各投資家の投資額を記録するマッピング。キーは投資家のアドレスで、値はその投資額です。

  • setInvestment: 投資家とその投資額を設定する関数。この関数を呼び出すと、指定されたアドレスと投資額が investors リストと investments マッピングに追加されます。

  • payout: プロジェクトが成功した場合にのみ呼び出される関数。この関数を呼び出すと、すべての投資家にその投資額が返されます。

  • projectSucceeded: プロジェクトが成功したことを宣言し、投資の返済を開始するためにオーナーが呼び出す関数。

スマートコントラクトの流れ

このスマートコントラクトの流れは次の通りです:

  1. プロジェクトのオーナー(コントラクトの作成者)が各投資家とその投資額を設定します。
  2. プロジェクトが成功したら、オーナーが projectSucceeded 関数を呼び出します。これにより projectSuccesstrue に設定され、payout 関数が呼び出されます。
  3. payout 関数は、各投資家に対してその投資額を返します。

まとめ

この例を通じて、Solidityを使用してスマートコントラクトをどのように作成するかを学びました。このスマートコントラクトはシンプルながら、Ethereumブロックチェーン上でトランザクションを行い、状態を管理し、様々なアドレス間でEtherを転送するといった基本的な機能を示しています。

実際には、もっと複雑なロジックや安全対策が必要な場合が多いですが、この基本的な例がSolidityとスマートコントラクトの世界への入門となることを願っています。

以上、読んでいただきありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?