エンティティERC-20インタフェースと実装
ERC-20コネクタ
ERC-20インタフェースは、ユーザ間でコインを交換するための基本的なスマート会議機能を提供する.
構成は以下の通り
n.関数
function totalSupply() public view returns (uint256 : 총 토큰 개수)
function balanceOf(address _owner) public view returns (uint256 : 잔고)
function transfer(address _to, uint256 _value) public returns (bool : 성공 - 실패여부)
Transfer 이벤트를 호출해야 하며, 보유한 이더가 _value보다 작을 경우 throw로 에러를 명시
function transferFrom(address _from, address _to, uint256 _value) public returns (bool : 성공 - 실패여부)
ransfer 이벤트를 호출해야 하며, 0 이더를 보내는 동작도 정상으로 처리
function approve(address _spender, uint256 _value) public returns (bool : 성공 - 실패여부)
Approval 이벤트를 호출해야한다
function allowance(address _owner, address _spender) public view returns (uint256 : 남은 인출 한도)
イベント(発生時にクライアントに情報を渡すためのもの)event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
タグの作成
ブログサンプルコードの作成
トークン名Sample
他の見積書との相互作用のみを宣言する関数のインタフェースを作成します。
pragma solidity ^0.8.10;
interface ERC20Interface {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function transferFrom(address spender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 amount);
event Transfer(address indexed spender, address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 oldAmount, uint256 amount);
}
インタフェースは、使用する関数の形式を宣言します.実際の関数の内容はContractで使用されます.Transferイベントはタグ移動時にログを残し、Approvalイベントはapprove関数の実行時にログを残します.
構成関数
function (<parameter types>) {internal | external | public | private} [pure | constant | view | payable] [(modifiers)] [returns (<return types>)]
parameter types
関数から受信するタイプのパラメータを宣言します.
Visibility Keyword (internal, external, public, private)
Visibility Keywordは、JavaまたはC++でPublic、Private、Protectedなどのアクセス制御者の役割を果たします.
Visivilityキーワードは以前のブログに整理されています.
関数の動作に関連するキーワード
pure:変数がストレージから取得または書き込みされていない関数であることを示します.
constant,view:ステータスを変更しない関数であることを示します
買掛/未払金:送金を受け入れることができる関数を示します.
返品
contract Sample is ERC20Interface { ... }
Sample Contract宣言はERC 20インタフェース関数(IS)を呼び出すことができる二重マッピングの承認を表示できます
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) public _allowances;
ERC-20関数
totalSupply
:インテリジェント見積に基づくERC-20トークンの総発行量を確定する
function totalSupply() external view virtual override returns (uint256) {
return _totalSupply;
}
balanceOf
:所有者が所有するトークンの数を確認します.
マッピング値balanceに入力したaddress accountが持つトークン数を返します.
function balanceOf(address account) external view virtual override returns (uint256) {
return _balances[account];
}
transfer
:トークンを送信し、内部関数transferを呼び出す
呼び出しが正常に完了するとTransferイベントが発生します
function transfer(address recipient, uint amount) public virtual override returns (bool) {
_transfer(msg.sender, recipient, amount);
emit Transfer(msg.sender, recipient, amount);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
}
Transfer requireで3つの条件をチェック3つの条件を満たす場合、実行者(送信者)は、所持するコインの財布からコインの個数を減算し、コインの個数を受信者(受信者)のコイン財布に加算する.
approve
spenderにvalueに等しいコインを抽出する権利を与える.この関数を使用する場合は、Approvalイベント関数を呼び出す必要があります.
function approve(address spender, uint256 amount) external virtual override returns (bool) {
uint256 currentAllownace = _allowances[msg.sender][spender];
require(currentAllownace >= amount, "ERC20: Transfer amount exceeds allowance");
_approve(msg.sender, spender, currentAllownace, amount);
return true;
}
function _approve(address owner, address spender, uint256 currentAmount, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
require(currentAmount == _allowances[owner][spender], "ERC20: invalid currentAmount");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, currentAmount, amount);
}
approveはrequiredを使用して、譲渡するトークン値currentAllowanceが現在持っているトークン量より少ないかどうかをチェックします.
譲渡するトークン値に問題がない場合は、内部関数approveを呼び出します.
approveはallowanceで私が相手(spender)に譲渡する金額を記録します
Approval eventを呼び出して記録します(譲渡は実際に発生するのではなく、譲渡するアドレスと数を決定します)
approveでは、spenderがアカウントの金額限度額の下で複数回のアクセスを許可します.この関数を複数回呼び出す場合は、ライセンスをamountにリセットするだけです.
allowance
所有者がspenderに譲渡したタグ量の確認
permissionは、入力された2つのアドレス値のallowance値、すなわち所有者がspenderにトークンを登録する数を返します.
function allowance(address owner, address spender) external view override returns (uint256) {
return _allowances[owner][spender];
}
transferFrom
spenderトランザクション可能なトークンの送信
function transferFrom(address sender, address recipient, uint256 amount) external virtual override returns (bool) {
_transfer(sender, recipient, amount);
emit Transfer(msg.sender, sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][msg.sender];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, msg.sender, currentAllowance, currentAllowance - amount);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
}
function _approve(address owner, address spender, uint256 currentAmount, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
require(currentAmount == _allowances[owner][spender], "ERC20: invalid currentAmount");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, currentAmount, amount);
}
transfer関数を実行して
ERC-20では、トークンの所有者は直接他の人にトークンを送信することができるが、トークンを譲渡可能な程度に登録し、必要に応じて第三者を通じてトークンを譲渡することができる.
タグを直接他の人に送信するときにtransfer関数を使用する
登録トークンを使用している場合は、approve、permission、transferFrom関数を使用します.
approveは財布の持ち主にEXCHANGEにコインを渡し、自分が持っているコインよりもコインの数を少なくすることができます.
permissionは、OWNERとEXCHANGEの値を入力することで、どれだけ登録されているかを確認できます
TransferFromはEXCHANGEがBUYERに購入申請した金額OWNERに預けたコインを販売しています.
二重マッピングapprovals変数は二重オブジェクトです.
オブジェクトのキーはOWNERのaddress(アドレス値)、値はトークン譲渡を受けるSPENDERのオブジェクト
KEY:OWNERのaddress
VALUE:(KEY:SPENDERのアドレス、VALUE:格納されているTOKEN数)
Reference
この問題について(エンティティERC-20インタフェースと実装), 我々は、より多くの情報をここで見つけました https://velog.io/@gunkk/솔리디티-ERC-20-인터페이스와-구현テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol