イーサリアムスマートコントラクト:ICOのシンプルなコントラクトの作成

最近、ICOを実施するためのスマートコントラクトを開発するための膨大な数の支援要請を受け取りましたが、すべての人を支援する十分な時間はありません。 そこで、プロジェクトで使用できるクラウドセールの非常にシンプルなスマートコントラクトを説明するこの短い投稿(投稿の最後にあるビデオへのリンク)を書くことにしました。







時間を節約するために、事前に契約を書きました。 少しずつ見ていきましょう。



スマートコントラクトは、プログラミング言語で書かれたプログラムです。 私たちの場合、Solidityの言語で。 シンプルなコントラクトを開発するには、オンラインエディターとRemixコンパイラーを使用します。



良い味の兆候は、すべてのプログラムを含むとみなされます。 そして、スマートコントラクトは、配布に基づいてライセンスを示します。 私たちの場合、これはGPLです。 もちろん、詐欺プロジェクトの契約書を書いていない場合、契約の作成者であることを示すこともできます。



/* This file is part of the EasyCrowdsale Contract. The EasyCrowdsale Contract is free software: you can redistribute it and/or modify it under the terms of the GNU lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The EasyCrowdsale Contract is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU lesser General Public License for more details. You should have received a copy of the GNU lesser General Public License along with the EasyCrowdsale Contract. If not, see <http://www.gnu.org/licenses/>. @author Ilya Svirin <i.svirin@prover.io> */
      
      





その直後に、使用するコンパイラのバージョンを示す行が続きます。 この行が存在しない場合、スマートコントラクトはコンパイルされません。



 pragma solidity ^0.4.0;
      
      





次はスマートコントラクト自体のソースコードです。これはコントラクトの階層として構造化され、それぞれが完成した機能を実装します。 これにより、契約でのコードの理解とその後の使用が簡単になります。



まず、スマートコントラクトをイーサリアム仮想マシンにロードした後、他のすべてのユーザーと同様に、共通コントラクトとやり取りすることを理解しておく必要があります。 私たちはプロジェクトチームとして特権的な状態になりたいと考えています。これは少なくとも、チームトークン専用に契約を結ぶ必要があり、もちろん収集された放送時間を提供するという事実で表現されるべきです。 このため、契約はその所有者を知っている必要があり、これはまさに「所有」契約の責任です。



 contract owned { address public owner; function owned() payable { owner = msg.sender; } modifier onlyOwner { require(owner == msg.sender); _; } function changeOwner(address _owner) onlyOwner public { owner = _owner; } }
      
      





「所有」契約にはパブリックフィールド「所有者」が1つだけ含まれ、その値はコンストラクターでグローバル構造「msg」の「送信者」フィールドの値によって初期化されます。したがって、契約の元の所有者が実装します。



秘密鍵が侵害された場合に所有権が変更される可能性を想定することは論理的であり、このために、パラメータとして新しい所有者のアドレスを受け取る「changeOwner」機能が提供されます。 同じスマートコントラクト内で定義されている「onlyOwner」修飾子を確認する必要があります。 修飾子は、スマートコントラクト関数を呼び出すための条件をグループ化して名前を付けることができる非常に便利な設計です。 onlyOwner修飾子は、所有者フィールドに格納されているアドレスから関数が呼び出されることを確認します。



「所有」契約は完全に機能的で非常にシンプルですが、「changeOwner」機能を呼び出すと、存在しないアドレスを誤って指定する可能性があるため、契約の制御を失うため、1つの隠れた脅威があります。 この欠点を修正するには、別のフィールドに入力するだけで十分です。「候補」と呼びます。関数「changeOwner」を呼び出すときは、まず「候補」に新しい値を保存し、候補者が権利への入力を確認したらすぐに「所有者」に移動しますアドレスからconfirmOwner関数を呼び出します。



階層内の次の契約はクラウドセールです。これは、資金調達とトークンの発行を直接担当し、以前に所有していた契約を継承します。



 contract Crowdsale is owned { uint256 public totalSupply; mapping (address => uint256) public balanceOf; event Transfer(address indexed from, address indexed to, uint256 value); function Crowdsale() payable owned() { totalSupply = 21000000; balanceOf[this] = 20000000; balanceOf[owner] = totalSupply - balanceOf[this]; Transfer(this, owner, balanceOf[owner]); } function () payable { require(balanceOf[this] > 0); uint256 tokensPerOneEther = 5000; uint256 tokens = tokensPerOneEther * msg.value / 1000000000000000000; if (tokens > balanceOf[this]) { tokens = balanceOf[this]; uint valueWei = tokens * 1000000000000000000 / tokensPerOneEther; msg.sender.transfer(msg.value - valueWei); } require(tokens > 0); balanceOf[msg.sender] += tokens; balanceOf[this] -= tokens; Transfer(this, msg.sender, tokens); } }
      
      





契約の次の要素に特に注意を払う必要があります。





これら3つの要素はすべて1つにまとめられています。これらはERC20標準の必須部分です。これは、トークンに関する情報がユーザーおよびetherscan.ioのウォレットに正しく表示されるように遵守する必要があります。



Crowdsale Smart Contract Designerは非常にシンプルです。 まず、「totalSupply」フィールドの値が初期化されます。 私たちの契約は2100万トークンを発行し、そのうち2000万トークンはすぐにスマート契約の残高に移されます。 スマートコントラクトアドレスからのトークンは販売可能であると想定しています。 残りのトークン(この場合は100万)は、契約所有者の住所に書き込まれます。 まあ、コンストラクターの最後に、「転送」イベントが発生します。これはブロックチェーンに配置され、対応する数のトークンが契約残高から契約保有者の残高に転送されたことを契約ユーザーに通知します。 このイベントの発行により、etherscan.ioがトークンホルダーとその残高を正しく表示できるようになります。



さて、スマートコントラクトの最も重要な機能は「クラウドセール」、いわゆるフォールバック機能です。これは、ブロードキャストがスマートコントラクトのアドレスに到着するたびに呼び出されます。 最初に、スマートコントラクトの残りに少なくともいくつかのトークンが販売されていることを確認します。 次に、トークンの固定価格-1エーテルあたり5000個を設定します。 次に、エーテルの送信者に送信する必要があるトークンの数を計算します。 トランザクションで転送された資金の量は、グローバル構造「msg」の「value」フィールドに記録され、「wei」で示されます。したがって、トークンの数を決定する際に、「wei」を「ether」に変換します。



次に、スマートコントラクトの販売残高に十分なトークンがあることを確認します。 スマートコントラクトよりも多くのトークンが要求された場合、残りのすべてのトークンを転送します。 残りのトークンの「wei」の値を決定し、過剰に変換されたエーテルを送信者に返します。 購入したトークンの数がゼロ以外であることを確認した後、この数のトークンを購入者の残高に書き込み、スマートコントラクトの残高からそれらを取り消します。 最後に、Transferイベントをスローすることを忘れないでください。



これで、資金調達機能の実際の実装は完了しましたが、トークンを操作可能にし、ERC20標準の機能をさらに実装する必要があります。 これは、前述のCrowdsaleコントラクトを継承するEasyTokenコントラクトで行われます。



 contract EasyToken is Crowdsale { string public standard = 'Token 0.1'; string public name = 'EasyTokens'; string public symbol = "ETN"; uint8 public decimals = 0; function EasyToken() payable Crowdsale() {} function transfer(address _to, uint256 _value) public { require(balanceOf[msg.sender] >= _value); balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; Transfer(msg.sender, _to, _value); } }
      
      





まず、4つのパブリックフィールドを定義します。これらのフィールドは現在、どのウォレットでも実際には使用されていませんが、順序のためにまだ定義しています。 ここでは、トークンの完全な名前と省略名、および小数記号の数を示します。 私たちの場合、トークンは分割不可能です。 小数フィールドは0に設定されます。



そして最後に、この契約を作成した唯一のEasyTokenスマートコントラクト機能は転送であり、これもERC20標準の一部であり、ユーザーのウォレットがトークンを相互に転送し、取引所に転送し、そこから引き出せるようにします。 関数の実装は非常に簡単で、送信者の残高のトークン数の十分性が確認され、その後、送信者の残高が減少し、要求されたトークン数だけ受信者の残高が増加します。 最後に、「転送」イベントが発行されます。 これで、トークンは動作可能になり、最も重要なことを行うことになります-契約保有者に回収されたエーテルを回収する機会を提供することです。 これはEasyCrowdsale契約で行います。



 contract EasyCrowdsale is EasyToken { function EasyCrowdsale() payable EasyToken() {} function withdraw() public onlyOwner { owner.transfer(this.balance); } }
      
      





「withdraw」関数には「onlyOwner」修飾子があります。 スマートコントラクトの所有者のみが呼び出すことができます。 彼女が行う唯一のことは、スマート契約の残高全体をスマート契約の所有者の住所に変換することです。



確認したスマートコントラクトは完全に機能的で完全であるという事実にもかかわらず、実際のプロジェクトで使用することはお勧めしません。 契約の論理の過度の簡素化は、そのような契約が投資家の利益を適切に保護しない、すなわち、クラウドセールを確立せず、最低手数料制限を確立せず、最小境界に達していない場合に投資家に資金を返還せず、多くの既知の情報も含むという事実につながりましたたとえば、Solidityコンパイラレベルの脆弱性は、いわゆるショートアドレス攻撃の影響を受けます。



これらの欠点の多くは、 PROVERプロジェクトのスマートコントラクトで解消されました。 PROOFコントラクトは、このアドレスの Ethereumに慣れ親しんだソースコードとともにアップロードされます。 実際の空気を送信することで、契約がどのように機能するかを確認することもできます。今、Pre-ICOを用意しています:) 実際、9月末まで続くPROVERプロジェクトの先行販売にご参加いただければ幸いです。 PROVERは、ブロックチェーンとビデオ分析に基づいてビデオ素材の信頼性を検証するためのユニークなテクノロジーです。



便利なリンク:






All Articles