この記事の目的は、ERC20トークンをできるだけ短時間で作成する方法を示すことです。
基本から始めましょう: ERC20トークンとは何ですか?
近年、ERC20トークン仕様はイーサリアムトークンの事実上の標準になりました。言い換えれば、今日出回っているほとんどのイーサリアム契約はERC20に準拠しています。この記事では、独自のイーサリアムトークンを作成する方法について詳しく説明しますが、始める前に、ERC20標準について詳しく見ていきましょう。
ERC20トークンがこれほど魅力的で成功している理由は何ですか?関係するいくつかの要因があります:
他のイーサリアムトークンと同様に、ERC20トークンはスマートコントラクトとして実装され、分散型の方法でイーサリアム仮想マシン(EVM)で実行されます。
イーサリアムのスマートコントラクトはSolidityで書かれています。代替言語はありますが、この目的でそれらを使用する人はほとんどいません。 SolidityはJavaScriptに似ているため、JavaScript、またはJavaやその他のCのような言語についてある程度の知識がある場合は、実際にSolidityを十分に習得する前であっても、Solidityのコードの一部が理解できることを問題なく理解できます。それ。
簡単なERC20コントラクトの作成をすぐに開始できるはずなので、ここから楽しみが始まります。これは単純なタスクであり、この記事ではERC20トークンを1時間以内に作成してデプロイする方法を説明するのに十分なほど単純です。
このデモンストレーションで作成するトークンは、あまり多くのベルやホイッスルがない、最低限のERC20実装になります。しかし、私は現実の世界で多くの同様に単純なトークンを見てきました、そしてそれらは非常にうまくいく傾向があります。
簡単に言えば、ERC20標準は、他の契約、ウォレット、またはマーケットプレイスとの統合を可能にするために、すべてのERC20トークンによって実装される一連の関数を定義します。この一連の関数はかなり短く、基本的です。
function totalSupply() public view returns (uint256); function balanceOf(address tokenOwner) public view returns (uint); function allowance(address tokenOwner, address spender) public view returns (uint); function transfer(address to, uint tokens) public returns (bool); function approve(address spender, uint tokens) public returns (bool); function transferFrom(address from, address to, uint tokens) public returns (bool);
ERC20関数を使用すると、外部ユーザー(暗号ウォレットアプリなど)がユーザーの残高を確認し、適切な承認を得て、あるユーザーから別のユーザーに資金を送金できます。
投資された現金が時間の経過とともに収入を得るという事実は、お金の時間価値と呼ばれます。
スマートコントラクトは、2つの明確に定義されたイベントを定義します。
event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Transfer(address indexed from, address indexed to, uint tokens);
これらのイベントが呼び出されるか、 放出された ユーザーがアカウントからトークンを引き出す権利を付与されたとき、およびトークンが実際に転送された後。
標準のERC20関数に加えて、多くのERC20トークンには追加のフィールドもあり、書面でなくても実際には、ERC20標準の事実上の一部になっているものもあります。このようなフィールドの例をいくつか示します。
string public constant name; string public constant symbol; uint8 public constant decimals;
ERC20とSolidityの命名法に関するいくつかのポイントは次のとおりです。
public
機能は契約自体の外部でアクセスできますview
基本的には一定を意味します。つまり、コントラクトの内部状態は関数によって変更されません。event
Solidityがクライアントを許可する方法です。コントラクト内の特定の発生について通知を受けるアプリケーションフロントエンドすでに基本的なJava / JavaScriptスキルを持っている場合、ほとんどのSolidity言語構成は明確である必要があります。
基本の概要を説明し、ERC20トークンを作成するために必要なことを説明したので、次はロジックの作成を開始します。
まず、2つのマッピングオブジェクトを定義する必要があります。これは、連想配列またはキー/値配列のSolidityの概念です。
awsソリューションアーキテクト合格点
mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed;
式mapping(address => uint256)
キーがタイプaddress
—アカウントアドレスを示すために使用される数値であり、値がタイプuint256
—トークンの残高を格納するために通常使用される256ビット整数である連想配列を定義します。
最初のマッピングオブジェクトbalances
は、各所有者アカウントのトークン残高を保持します。
2番目のマッピングオブジェクトallowed
には、特定のアカウントからの引き出しが承認されたすべてのアカウントと、それぞれに許可された引き出し額が含まれます。
ご覧のとおり、許可されたマッピングの値フィールドは、それ自体が、承認された引き出し合計へのマッピングプロットアカウントアドレスです。
これらのマッピングは、他のすべてのコントラクトフィールドとともにブロックチェーンに保存され、 採掘 その結果、変更がすべてのネットワークユーザーノードに伝播されます。
ブロックチェーンストレージは高価であり、契約のユーザーは何らかの方法で料金を支払う必要があります。したがって、常にストレージサイズを最小限に抑えてブロックチェーンに書き込むようにする必要があります。
必要なデータ構造が整ったので、ERC20ロジックを適切な関数に実際に記述し始めることができます。
ICOトークンの数をどのように設定しますか?さて、ICOトークンの最大数を設定する方法はいくつかあり、この問題自体は長い議論の価値があるかもしれません。
ECR20チュートリアルのニーズに応じて、最も簡単なアプローチを使用します。契約作成時にトークンの合計量を設定し、最初にすべてのトークンを「契約所有者」、つまりスマートコントラクトを展開したアカウントに割り当てます。
uint256 totalSupply_; constructor(uint256 total) public { totalSupply_ = total; balances[msg.sender] = _totalSupply; }
コンストラクターは、コントラクトがデプロイされた直後にイーサリアムによって自動的に呼び出される特別な関数です。これは通常、コントラクトのデプロイアカウントから渡されたパラメータを使用してトークンの状態を初期化するために使用されます。
msg
イーサリアム自体によって宣言され、入力されるグローバル変数です。契約を履行するための重要なデータが含まれています。ここで使用しているフィールド:msg.sender
現在の契約機能を実行しているイーサリアムアカウントが含まれています。
デプロイするアカウントのみがコントラクトのコンストラクターに入ることができます。契約が開始されると、この関数は使用可能なトークンを「契約所有者」アカウントに割り当てます。
function totalSupply() public view returns (uint256) { return totalSupply_; }
この関数は、所有者に関係なく、このコントラクトによって割り当てられたすべてのトークンの数を返します。
function balanceOf(address tokenOwner) public view returns (uint) { return balances[tokenOwner]; }
balanceOf
所有者のアドレスで識別される、アカウントの現在のトークン残高を返します。
function transfer(address receiver, uint numTokens) public returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender] — numTokens; balances[receiver] = balances[receiver] + numTokens; emit Transfer(msg.sender, receiver, numTokens); return true; }
その名前が示すように、transfer
関数は移動に使用されますnumTokens
所有者の残高から別のユーザーの残高までのトークンの量、またはreceiver
。譲渡する所有者はmsg.sender
ですつまり、関数を実行しているものです。これは、トークンの所有者だけがトークンを他の人に転送できることを意味します。
Solidityが述語を主張する方法はrequire
です。この場合、振替口座には振替を実行するのに十分な残高があります。 require
の場合ステートメントが失敗した場合、トランザクションはブロックチェーンに書き込まれる変更なしですぐにロールバックされます。
終了する直前に、関数はERC20イベントを発生させますTransfer
登録されたリスナーがその完了に反応できるようにします。
この関数は、トークンマーケットプレイスのシナリオで最もよく使用されます。
function approve(address delegate, uint numTokens) public returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; }
何approve
所有者を許可することです。つまり、msg.sender
代理人アカウント(場合によってはマーケットプレイス自体)を承認して、自分のアカウントからトークンを引き出し、他のアカウントに転送します。
ご覧のとおり、この関数は、所有者がマーケットプレイスでトークンを提供しているシナリオで使用されます。これにより、マーケットプレイスは事前の承認を待たずにトランザクションを完了することができます。
実行の最後に、この関数はApproval
を起動します。イベント。
function allowance(address owner, address delegate) public view returns (uint) { return allowed[owner][delegate]; }
この関数は、approve
で設定されているように、所有者によって現在承認されているトークンの数を特定のデリゲートに返します。関数。
transferFrom
関数はapprove
のピアです以前に説明した関数。これにより、引き出しが承認された代理人は、所有者の資金を第三者の口座に送金することができます。
function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner] — numTokens; allowed[owner][msg.sender] = allowed[from][msg.sender] — numTokens; balances[buyer] = balances[buyer] + numTokens; Transfer(owner, buyer, numTokens); return true; }
2つrequire
関数開始時のステートメントは、トランザクションが正当であること、つまり、所有者が転送するのに十分なトークンを持っていること、および代理人が(少なくとも)numTokens
を承認していることを確認することです。撤退する。
numTokens
の転送に加えて所有者から購入者への金額。この関数はnumTokens
も減算します。代議員の手当から。これは基本的に、与えられた手当を持つ代表者がそれをいくつかの別々の引き出しに分割することを可能にします。これは典型的な市場の行動です。
ここで停止して、有効なERC20実装を作成できます。ただし、産業用強度トークンが必要なため、さらに一歩進んでいきたいと考えています。これには、コードをもう少し安全にする必要がありますが、基本的ではないにしても、トークンを比較的単純に保つことができます。
SafeMath は、ハッカーが契約を破ることが知られている1つの方法である整数オーバーフロー攻撃に対処することを目的としたSolidityライブラリです。このような攻撃では、ハッカーは、関連する整数を取るパラメータを渡すことにより、契約に誤った数値を使用するように強制します 過去 それらの最大値。
ユニットテストjavaの書き方
SafeMath 算術アクションを実行する前にオーバーフローをテストすることでこれを防ぎ、オーバーフロー攻撃の危険性を排除します。ライブラリは非常に小さいため、契約サイズへの影響は最小限であり、パフォーマンスは発生せず、ストレージコストのペナルティもほとんどありません。
追加しましょう SafeMath 私たちのコードに:
library SafeMath { // Only relevant functions function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a — b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c>= a); return c; } }
SafeMath assert
を使用します渡されたパラメーターの正確さを検証するステートメント。すべきassert
失敗した場合、関数の実行はただちに停止され、すべてのブロックチェーンの変更はロールバックされます。
次に、ライブラリをSolidityコンパイラに導入する次のステートメントを追加しましょう。
using SafeMath for uint256;
次に、最初に使用した単純な算術をSafeMath関数に置き換えます。
balances[msg.sender] = balances[msg.sender].sub(numTokens); balances[receiver] = balances[receiver].add(numTokens); balances[buyer] = balances[buyer].add(numTokens); balances[owner] = balances[owner].sub(numTokens);
Solidityでは、スマートコントラクトの機能とイベントは、と呼ばれるエンティティにラップされます。 契約する これをサイレントに「ブロックチェーンクラス」に変換できます。以下は、コードの要点を含め、作成したERC20互換のコントラクトです。名前と記号のフィールドは自由に変更できます。ほとんどのトークンは10進値を18に保つので、同じことを行います。
時が来た 契約をブロックチェーンにデプロイする 。展開後、契約はネットワークに参加しているすべてのノードに転送されます。コントラクトに加えられたすべての変更は、参加しているすべてのノードに伝播されます。
イーサリアムの開発者は通常、次のような展開ツールを使用します トリュフ 。トリュフでさえ、この記事の限られたニーズと呼ばれる単純なオンラインツールにはやり過ぎです リミックス 十分であろう。
使用するには、をインストールする必要があります MetaMaskプラグイン ブラウザと、少なくともいくつかのRinkeby Etherを含むRinkeby(Ethereumテストネットワーク)アカウント。これらは比較的簡単な手順なので、詳しくは説明しません。
どちらもお持ちでない場合は、 MetaMask そして リンケビュー ダウンロードリンクと明確なインストールと使用方法を取得するため。
すべてのビルディングブロックが配置されたので、次の手順に進みます。 リミックス プラグマ行とSafeMathライブラリを含む上記のコードをオンラインエディタに貼り付けます。
次に、右側の2番目のタブ「」に移動します。 実行 」をクリックし、「 デプロイ 。」トランザクションの確認を求めるMetaMaskポップアップが表示されます。もちろん、私たちはそれを承認します。
要旨 : https://gist.github.com/giladHaimov/8e81dbde10c9aeff69a1d683ed6870be#file-basicerc20-sol
モバイルで不和ボットを作成する方法
おめでとうございます! 本当のように、最初のERC20トークンをデプロイしました イーサリアムプロフェッショナル 。約束通り、トークンはシンプルで軽量でありながら完全に機能し、ERC20標準に準拠し、MathSafeで保護されています。ブロックチェーン全体で購入、支払い、転送する準備ができています。
いいえ、近いわけではありません。簡単なデモンストレーションは表面をほとんど傷つけず、スマートコントラクト開発の1つの側面のみを扱っているためです。
スマートコントラクトは、ビジネスロジック、ユーザーインタラクションのモデリング、トークンのマイニングと書き込みを許可するかどうか、コントラクトに導入するライフサイクルの変更、通常は管理者レベルの機能の必要性によって、はるかに複雑になる可能性があります。管理者が承認した一連の機能など。あなたは絵を手に入れます。
それでも、ここで行ったことを再現できれば、それは知識を拡大し、必要に応じてより複雑な契約に移行するための強固な基盤となります。
スマートコントラクトは、イーサリアム仮想マシンで実行されるコードの一部です。イーサリアムのスマートコントラクトは不変であり、イーサリアムとデータを送受信できます。
簡単に言えば、ERC20トークンはERC20標準を実装するコントラクトです。これらの契約によって処理される操作には、トークンの総供給量と残高の取得、およびトークンの転送に使用される方法が含まれます。
イーサリアムの開発は現在、JavaScript、Python、C ++に触発された契約指向のプログラミング言語であるSolidityで行われています。
ERCはEthereumRequest forCommentの略です。このリクエストには番号20が割り当てられているため、サフィックスが付けられます。