エンティティERC-20インタフェースと実装


ERC-20コネクタ


ERC-20インタフェースは、ユーザ間でコインを交換するための基本的なスマート会議機能を提供する.
構成は以下の通り

n.関数

  • total Supply():発行された総トークン数を返します.
  • function totalSupply() public view returns (uint256 : 총 토큰 개수)
  • balanceof():所有者勘定科目の残高を返します.
  • function balanceOf(address _owner) public view returns (uint256 : 잔고)
  • transfer():イーサをアドレスvalueに送信します.
  • function transfer(address _to, uint256 _value) public returns (bool : 성공 - 실패여부)
    
    Transfer 이벤트를 호출해야 하며, 보유한 이더가 _value보다 작을 경우 throw로 에러를 명시
  • transferFrom():イーサをアドレスvalueに送信します.
  • function transferFrom(address _from, address _to, uint256 _value) public returns (bool : 성공 - 실패여부)
    
    ransfer 이벤트를 호출해야 하며, 0 이더를 보내는 동작도 정상으로 처리
  • approve():spenderが抽出できるしきい値を指定します.(クレジットカードの額が同じような気がします)
  • function approve(address _spender, uint256 _value) public returns (bool : 성공 - 실패여부)
    
    Approval 이벤트를 호출해야한다
  • 許容差():ownerはspenderが抽出することを許可するコインの数
  • 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つの条件をチェック
  • 送信者のアドレスが間違っているかどうかを確認する
  • 受信者のアドレスが間違っているかどうかを確認します.
  • 伝達関数を実行する送信者(sender)が、申請値(amount)より大きいタグ
  • を有するかどうか.
    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は簡単に変更するための関数なので、内部ではincreateApprovalとdecreateApproval関数が使用されます.
    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);
        }
  • transferFromは、譲渡を実行するトランザクションエージェント(msg.sender)が許可する値に従って、トークンを相手(受信者)
  • に移動する.
    transfer関数を実行して
  • 移動
  • transferは、譲渡する送信者の残高を一定数に減らし、受信者の残高を一定数の
  • に増やす.
  • transfer関数の実行が完了し、すべてのリクエストが通過した場合、currentAllowanceをチェックしてapprove関数
  • を実行します.
    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数)