2種類のアドレス
Ethereumには2種類のアドレスがあります。それはExternally Owned Account(EOA)とコントラクトアカウントです。
EOAはビットコインや他の通貨と同じようなアドレスだと思ってもらって大丈夫です。コントラクトアドレスはスマートコントラクトが紐づけられておりスマートコントラクを実行することができます。
ETHの送金
別の誰かにETHを送金する場合は基本的にEOAからEOAに対して行われます。AからBに1ETH送る場合、Aの秘密鍵を使ってトランザクションに署名し、Bのアドレスに送金します。
ちなみにEthereumでは残高の管理はビットコインで使われているUTXO形式ではなく、残高情報を直接データとして保存しています。UTXO形式の場合の残高は取引履歴からアカウントの残高を算出しています。
ERC20トークンの送金
ERC20に限らずEthereumで発行されたトークンの送金はETHの送金とは異なります。まずトークンの残高はkey-valueストアの変数に保存さてれいてどのアドレスがどれだけのトークンを持っているかわかるようになっています。
トークンの送金はこのkey-valueストアのデータを書き換えることでトークンの残高を変更しています。下記はほとんどのERC20トークンで使われているZeppelin SolidityのBasicTokenで実装されている送金の仕組みです。
balances[msg.sender]に対して送金分のトークン(_value)を減らし、balances[_to]に対して送金分のトークン(_value)を増やしています。こう見るとデータを書き換えているだけなので全然ハイテクな感じがしませんね笑
銀行とか取引所での残高管理の仕組みと一緒だと思ってもらえば理解がしやすいかと思います。
/** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { /** * @dev transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); // SafeMath.sub will throw if there is not enough balance. balances[msg.sender] = balances[msg.sender].sub(_value); // 送信者のアドレスから残高を減らす balances[_to] = balances[_to].add(_value); // 送信先のアドレスの残高を増やす Transfer(msg.sender, _to, _value); return true; } }
まとめ
Ethereumではスマートコントラクトで作成したトークンの送金方法もこのようにコントラクトで実装することができます。この仕組みはすごくて、ERC20とは違う送金の仕組みを作ることができるということです。
もっと安全で、コストがかからないものはどんどん出てきていてERC223やERC721、ERC777など多くの実装が出てきています。ぜひ下記のリンクも読んでみてください。
関連記事:EthereumのERC20 Tokenの問題点を解決したERC223 Tokenとは?
最後に
最後にブロックチェーンエンジニアって何?どうやったらなれるの?という人向けに書いた下の記事も読んでみてください。
おすすめ書籍
Ethereumを使ったDApps開発を学びたいなら今だとこの1冊が1番良いです!開発環境の構築から使うべきツール、フレームワーク、実装方法・注意点まで網羅的に解説されている書籍なのでおすすめです。出版も2018年1月ということでかなり新しい本で、DMM Bitcoinを作っているネクストカレンシー所属の方が書いているので信頼できます。
ビットコインとブロックチェーンの詳細をしっかりと学びたい方にはこちらの書籍が非常におすすめです。ウォレットの仕組み、楕円曲線暗号、P2Pプロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
お聞きしたいことがあります。メタマスクから、取引所にイーサリアムトークンを送りました。送信は完了しています。
しかし、取引所の受信アドレスは、ERC20ですが、間違えて、BEP20で、送ってしまいました。取り戻す方法はありますか?
どうぞよろしくお願いいたします。