作成方法と実装方法 ERC-20トークン イーサリアムブロックチェーン上で。現在の発展速度で、ブロックチェーンは徐々に世界を征服しつつあります。最も人気のあるビットコイン cryptocurrency、世界初で最もよく知られたブロックチェーン技術の製品です。イーサリアムはブロックチェーンの副産物であり、ビットコインが繁栄し始めたときに誕生しました。
ビットコインは通貨に向かって進んだだけですが、イーサリアムは、ユーザーがネットワーク上でトークンを作成できるようにする仮想マシン (EVM) とスマート コントラクトを提供するというビジョンをさらに進めています。
トークンはお金、ゴールド、宝くじなどを表すことができます。イーサリアム ブロックチェーンではあらゆる種類のトークンを開発できますが、このチュートリアルでは ERC-20 トークンの作成とデプロイに焦点を当てます。
トークンを作成する前に、ブロックチェーン テクノロジー、Solidity 言語、およびイーサリアムの仕組みについて少なくとも基本を理解しておく必要があります。
ブロックチェーンとは何ですか 方法 システムを教えてください。
つまり、ブロックチェーンは、多くのネットワーク参加者のための分散台帳またはデータベース内のトランザクションの記録です。この台帳には、ネットワーク上で実行されたトランザクションの記録が含まれています。
トランザクションとは、ネットワーク上で特定の通貨または金額をあるユーザーから別のユーザーに送金する行為です。アリスが 30BLC をボブに送信するとします。このトランザクションは、ネットワーク上の特定のノードによって暗号的にハッシュされ、総勘定元帳に記録されます。
このノードは、トランザクションをネットワーク内の他のノードに送信します。つまり、トランザクションをネットワークに伝播します。他のノードはトランザクションを受信し、標準的な方法を使用してレビューし、台帳に追加します。
ネットワーク上のノードは、ネットワーク上で新たに送信されたトランザクションを受信し、そのトランザクションを台帳に追加します。ネットワーク上のすべてのノードは台帳のコピーを所有または所有しています。これにより、ブロックチェーンの分散型の特徴が生まれます。
「ブロックチェーン」という言葉は、台帳内のトランザクションや記録がリンクされてチェーンを形成するという事実に由来しています。ご存知のとおり、トランザクションはノード内の 2 者間の通貨交換を表し、JSON では次のように表すことができます。
{
"に": 「0xalice」,
"から": 「0xボブ」,
"量": 「30BLC」
}
これは単純な記録またはトランザクションです。ボブはアリスに 30BLC を転送しました。
このトランザクションは、次の JSON データ形式を使用して書き込まれたブロックに記録されます。
[
{
"に": 「0xalice」,
"から": 「0xボブ」,
"量": 「30BLC」
}
]
ブロックは、多数のトランザクション オブジェクトを含むシーケンスのようなものです。したがって、このブロックには複数のトランザクションを含めることができます。
[
{
"に": 「0xalice」,
"から": 「0xボブ」,
"量": 「30BLC」
},
{
"に": 「0×テレサ」,
"から": 「0xarinze」,
"量": 「5BLC」
}
]
トランザクションが追加されるブロックの場所が表示されます。チェーンは相互接続されたブロックで構成されます。各ブロックチェーンは Genesis ブロックから始まり、作成者がそれを追加してネットワークに配布します。
各ブロックには、ネットワーク上で一意の識別子として機能する暗号化ハッシュもあります。同じハッシュを持つ 2 つのブロックはありません。
ブロックがノードによって検証されてネットワークに追加されると、そのブロックにはネットワーク上の最後のブロックのハッシュへのポインタが含まれます。
[
{
"ハッシュ": 「0×0」,
「前のハッシュ」: "",
「txns」: [
{
"に": 「0xalice」,
"から": 「0xボブ」,
"量": 「30BLC」
},
{
"ハッシュ": 「0×1」,
「前のハッシュ」: 「0×0」,
"に": 「0×テレサ」,
"から": 「0xarinze」,
"量": 「5BLC」
}
]
},
{
"ハッシュ": 「0×1」,
「前のハッシュ」: 「0×0」,
「txns」: [
{
"に": 「0xalice」,
"から": 「0xボブ」,
"量": 「30BLC」
},
{
"に": 「0×テレサ」,
"から": 「0xarinze」,
"量": 「5BLC」
}
]
}
]
ハッシュ 0x0 を持つ最初のブロックが元のブロックです。ハッシュ 0x1 を持つ次のブロックには、0x0、つまりネットワーク内の最初のブロックを指す prevHash があります。
このようにして、ネットワークに挿入される新しいブロックはそれぞれ、最初に隣接する最新のブロックを指します。これにより、ブロックチェーン内に「チェーン」が作成されます。
イーサリアムとは
イーサリアムは、ETHと呼ばれる独自のデジタル通貨を備えたブロックチェーンです。他のブロックチェーンと同様に、トランザクションは台帳に保存されます。
イーサリアムが他のブロックチェーンと異なる点は、その柔軟性です。多くのブロックチェーン プラットフォームは送金のみをサポートしていますが、イーサリアムではすべてのデータがブロックチェーンを介して転送され、手数料を ETH で支払うことができます。
イーサリアムはどのように機能しますか?
上で述べたように、イーサリアム ブロックチェーン内のあらゆるデータを転送し、ETH で料金を支払うことができます。
上の例の BLC トランザクションと同様に、イーサリアム ブロックチェーンは ETH トランザクションをサポートしています。アリスが 1 ETH をボブに送金するとします。このトランザクションはネットワーク内のノードによって検証され、ブロックチェーン内のブロックに追加されます。
さらに、イーサリアムにはマイニングがあり、ETHを取得するには作業が必要です。このタスクでは、正しい答えが見つかるまでさまざまな方法を試して、難しい計算を解決します。ネットワーク内の任意のノードが参加できます。計算を正常に解決したノードには、一定量の ETH が報酬として与えられます。トランザクションが減れば減るほど、計算の難易度は上がります。
イーサリアム ブロックチェーンでトランザクションがトリガーされるたびに、ネットワーク内のマイニング ノードがこのトランザクションを生成します。トランザクションの送信者は、このノードに一定の ETH 金額を支払うことに同意する必要があります。これはガソリン価格として知られています。
スマートな契約とは何ですか?
スマート コントラクトは、イーサリアム ブロックチェーン上で実行されるコードを含むツールです。スマート コントラクトは Solidity 言語で記述され、ABI コードにコンパイルされます。この ABI コードはイーサリアム ブロックチェーン上で提供されます。スマート コントラクトは、送信者の外部アドレスを取得し、それをノンス (固有の番号) と混合して、イーサリアム ブロックチェーン上のアドレスを形成します。
スマート コントラクトにより、デジタル コントラクトの作成が可能になります。実際の契約と同様に、デジタル契約は、イーサリアム ブロックチェーン内の 2 つ以上の当事者間のトランザクションを設定するのに役立ちます。
スマート コントラクトはイーサリアムのアカウントの一種であり、ユーザーによって制御されず、ブロックチェーン上でトランザクションを送信できることを意味します。スマート コントラクトはアカウントであるため、残高があり、EVM コードが含まれています。
ERC-20トークンとは何ですか?
Ethereum 仮想マシン (EVM) は、コンパイルされた Solidity ABI コードを実行する仮想マシンです。イーサリアムのスマート コントラクトは、さまざまなトークンを作成するための世界標準となっています。これらの標準は、イーサリアムのコメント要求 (ERC) 標準として知られています。
イーサリアムにはたくさんあります デフォルト、しかし最も一般的に使用され、広く使用されているのはERC-20とERC-721です。 ERC-20はトークン生成に使用され、ERC-721はNFT開発に使用されます。
ERC-20 は Fabian Vogelsteller によって提案された標準であり、多数の API を含むスマート コントラクトです。 ERC20 は、ERC-20 標準を選択するすべてのトークンに適用される一連のルールです。
上で述べたように、ERC-20 はビットコインや ETH などの仮想通貨の作成に使用できます。 ERC-20 標準に従って作成された最も有名なトークンには、Binance Coin (BNB) と Shiba Shabu (KOBE) があります。
ユーザーは ERC-20 トークンを送受信できます。これらのトークンは代替可能です。つまり、その価値はブロックチェーン上のどこでも同じです。
Blockchain.com, ウォレットと取引所はこの標準を使用して、さまざまな ERC-20 トークンをプラットフォームに統合し、交換や他の多くの暗号通貨を容易にします。
ERC-20 標準が何であるかを理解したところで、ERC-20 トークンの内容を見てみましょう。
トークンの内容 ERC-20
ERC-20 トークンには、ERC-20 トークンに必要なメソッドとイベントが含まれています。
ERC-20 トークンは次のことができる必要があります。
- あるアカウントから別のアカウントにトークンを転送する
- 口座残高を返却する
- トークンで使用可能なトークンの総数を返します。
- トークンをアカウントに転送する
実際、Solidity で書かれた場合、ERC-20 は次のようになります。
function 名() 公共 ビュー 収益 (文字列)
function シンボル() 公共 ビュー 収益 (文字列)
function 小数() 公共 ビュー 収益 (単位8)
function 総供給量() 公共 ビュー 収益 (単位256)
function balanceOf(住所_所有者) 公共 ビュー 収益 (uint256 バランス)
function 転送(アドレスへ, uint256 _value) 公共 収益 (ブール 成功)
function からの転送(住所_from, アドレスへ, uint256 _value) 公共 収益 (ブール 成功)
function 承認する(アドレス_spender, uint256 _value) 公共 収益 (ブール 成功)
function 手当(住所_所有者, アドレス_spender) 公共 ビュー 収益 (残り uint256)
ERC-20 トークンには次のメソッドを含めることができます。
- name – トークンの名前を返します (例: Binance Coin)
- シンボル - トークンのシンボルを返します (BNB など)
- 小数点以下の桁数 – トークンで使用される小数点以下の桁数を返します。
- totalSupply – トークンの初期在庫全体を返します
- BalanceOf – アカウント残高を返します
- transfer – 一定量のトークンをアドレスに転送します
- transferFrom – 受信者アドレスから受信者アドレスに特定の数のトークンを転送します。
- 承認 – 所有者のアドレスから一定数のトークンまでのトークンを引き出します
- Exemption – 所有者のアカウントから引き出すことができるトークンの量を返します。
シグナルの送信時にイベントを適切にキャプチャするために、トークンにイベントを登録することもできます。 ERC-20 トークンには次のイベントがあります。
イベント転送 (_from でインデックスされたアドレス、_to でインデックスされたアドレス、uint256 _value)
イベントの承認 (アドレス インデックス付き _owner、アドレス インデックス付き _spender、uint256 _value)
- 転送 – トークンを転送するときにアクティブ化されます
- 承認 – アカウントが特定の数のトークンを受け取ることが承認されるとアクティブ化されます。
ERC 20トークンを生成する
このセクションを理解しやすくするために、この記事では、単純なトークンを作成し、それを ND コインと呼ぶ方法を示します。
// SPDX ライセンス識別子: GPL-3.0
プラグマソリッド性 >=0.7.0 <0.9.0;
縮小することはできません。 NDコインERC20 {
イベント Transfer
(インデックス付きアドレス から, インデックス付けされたアドレス, uint トークン);
イベント 承認(アドレスインデックス付きトークン所有者, インデックス付き支出者のアドレス指定, uint トークン);
文字列 公共 定数名 = 「NDコイン」;
文字列 公共 定数記号 = 「NDN」;
単位8 公共 定数小数 = 18;
マッピング(住所 => 単位256) バランス;
マッピング(住所 => マッピング (住所 => 単位256)) 許可されて;
uint256 totalSupply_;
コンストラクタ(uint256 合計) {
総供給量_ = 合計;
バランス[MSG.トランスミッタ] = 総供給量_;
}
function 総供給量() 公共 ビュー 収益 (単位256) {
return 総供給量_;
}
function balanceOf(アドレストークンの所有者) 公共 ビュー 収益 (uint) {
return バランス[トークン所有者];
}
function 転送(アドレス受信者, uint トークン数) 公共 収益 (ブール) {
必要とする(トークン数 <= バランス[MSG.トランスミッタ]);
バランス[MSG.トランスミッタ] -= トークン数;
バランス[受信機] += トークン数;
放出する Transfer
(MSG.トランスミッタ, 受信機, トークン数);
return true;
}
function 承認する(住所 委任する, uint トークン数) 公共 収益 (ブール) {
許可されています\[メッセージ.送信者\][委任する] = トークン数;
放出する 承認(MSG.トランスミッタ, 委任する, トークン数);
return true;
}
function 手当(アドレス所有者, 住所 委任する) 公共 ビュー 収益 (uint) {
return 許可された\[所有者\][委任する];
}
function からの転送(アドレス所有者, 購入者の住所, uint トークン数) 公共 収益 (ブール) {
必要とする(トークン数 <= バランス[所有者]);
必要とする(トークン数 <= 許可された\[所有者\][MSG.トランスミッタ]);
バランス[所有者] -= トークン数;
許可された\[所有者\][MSG.トランスミッタ] -= トークン数;
バランス[買い手] += トークン数;
放出する Transfer
(所有者, 買い手, トークン数);
return true;
}
}