イーサリアムのトークン規格について「ERC20」「ERC721」は有名だけど、
改めてどんなものだっけ?ということで、エンジニア視点でまとめてみました。
目次
トークン規格って?
イーサリアムにはNFTなどのトークンを発行するための仕組みとして、スマートコントラクトという機能があります。
※スマートコントラクトはざっくりいうと、契約締結を自動で行い所有者を明確にするという画期的な技術のこと。
で、別々のトークンの売買や交換をするためには、共通のルールでトークンを発行する必要あるよね。
ということで規格というものが存在します。
貨幣の仕組みは全世界大体同じなのと一緒。
例えば、貨幣なら最小単位は何という呼称なのかとか。(日本円なら〇銭、米ドルなら〇セント)
異なる貨幣同士を交換しやすいように規格が決まってます。
それは暗号通貨も一緒。ということでまとめていきます。
ERC20
まずは有名なERC20から。
この規格はイーサリアムなどと同じような複数を所有できるトークンです。
1eth=〇円 みたいな貨幣のイメージに近いです。
ERC20のトークン規格に含まれる主な機能
function name() public view returns (string) function symbol() public view returns (string) function decimals() public view returns (uint8) function totalSupply() public view returns (uint256) function balanceOf(address _owner) public view returns (uint256 balance) function transfer(address _to, uint256 _value) public returns (bool success) function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) function approve(address _spender, uint256 _value) public returns (bool success) function allowance(address _owner, address _spender) public view returns (uint256 remaining)
nameはトークン名です。ex)Dai
symbolはシンボル(略称)です。ex)DAI
decimalsはトークンを表現する際の小数点以下桁数です。
totalSupplyは総供給量。トークンの発行数です。
balanceOfは残高照会。
transferは送金。
transferFromは資金移動。transferとの違いは、誰から誰におくるという送り元の指定ができることです。
approveはいくら資金移動をしてよいか許可を出します。
allowanceはapproveで設定した移動を許可した資金量を取得します。
参考:
https://ethereum.org/ja/developers/docs/standards/tokens/erc-20/
ERC721
ERC721は話題のNFT(Non-Fungible Token)のトークン規格です。
ERC20との大きな違いは、1つ1つのトークンが一意であり、世の中に1つしか存在しない1点モノということです。
ERC20は言ってしまえば貨幣なので、Aさんが持っている1円玉とBさんが持っている1円玉は同じ価値で、交換しても意味のない代替可能なトークン。
反対にERC721は、Aさんが持っているモナリザの絵(原画)とBさんが持っているゴッホの絵(原画)は世の中に1点しか存在しないものなので、代わりが効かない。つまり代替不可能なモノということです。
ERC721のトークン規格に含まれる主な機能
function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool);
balanceOfは所有者がもつNFTの個数を取得。
ownerOfは該当のNFTの所有者(ウォレットアドレス)を取得。
safeTransferFromはNFTをAからBに送る。
approveは該当のNFTの送信許可を与える。
setApprovalForAllは管理者へNFTの操作許可を与える。
getApprovedは該当のNFTに許可が与えられているか取得。
isApprovedForAllは〇〇が管理者へ許可を与えているか取得。
ERC1155
ざっくりいうと、ERC721・ERC20両方の性質をもったトークン規格です。
1トークンを送る際はERC721のようなNFT的扱いとなり、
2トークン以上送る際はERC20のような扱いになるようです。
送る数量によって性質が変わる規格ということで、ERC721とERC20の良いとこどりをしてますね。
ERC1155のトークン規格に含まれる主な機能
function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external; function balanceOf(address _owner, uint256 _id) external view returns (uint256); function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); function setApprovalForAll(address _operator, bool _approved) external; function isApprovedForAll(address _owner, address _operator) external view returns (bool);
safeTransferFromはERC20、721にもあったトークンを送る
safeTransferFromは異なる種類のトークンを一括で送る
balanceOfは残高参照
balanceOfBatchは異なる種類のトークンの残高を一括で取得
setApprovalForAllはトークン移動の許可を与える
isApprovedForAllは許可の状況を取得する
今回は代表的な3つのトークン規格をまとめてみました。
他にもトークン規格はあります。引き続きキャッチアップしていきたいと思います。