智能合約開發實戰(20) - 從頭到尾寫一個ERC20的加密貨幣(一)

閱讀時間約 1 分鐘
學了這麼多的Solidity後,該來完整的寫一個ERC20的token,順便也了解一下發幣的邏輯。
那麼ERC20是什麼呢?
ERC-20(Ethereum Request for Comments 20)由 Fabian Vogelsteller 於 2015 年 11 月提出,是一種在智能合約中實現代幣 API 的代幣標準。(以太坊官網)
然後只要符合下面這些標準的就可以是ERC20:
我們就把上面的這些寫入程式碼中:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
//https://github.com/openzeppelin/openzeppelin-contracts/blob/v3.0.0/contracts/token/ERC20/IERC20.sol
//引用ERC20標準
interface IERC20 {
  function name() external view returns (string memory);
  function symbol() external view returns (string memory);
  function decimals() external view returns (uint8);
  function totalSupply() external view returns (uint256);
  function balanceOf(address _owner) external view returns (uint256 balance);
  function transfer(address _to, uint256 _value) external returns (bool success);
  function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
  function approve(address _spender, uint256 _value) external returns (bool success);
  function allowance(address _owner, address _spender) external view returns (uint256 remaining);
  event Transfer(address indexed _from, address indexed _to, uint256 _value);
  event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract MyToken is IERC20 {
  string private _name;
  string private _symbol;
  uint8 private _decimal;
  uint256 private _totalSupply;
  mapping (address => uint256) private balances; //cryto.eth => 1000, adam.eth => 500
  mapping (address => mapping (address => uint256)) private allowances; // crypto(adam) =>, adam(zhangsan) => 100
  //初始化
  constructor(string memory _na, string memory _sym, uint8 _deci, uint256 _initialSupply) {
    _name = _na;
    _symbol = _sym;
    _decimal = _deci;
    _totalSupply = _initialSupply;
    //初始化時先把錢打給自己
    balances[msg.sender] = _initialSupply;
  }
  //下面寫入把ERC20的function各個override變自己的
  function name() external override view returns (string memory) {
    return _name;
  }
  function symbol() external override view returns (string memory) {
    return _symbol;
  }
  function decimals() external override view returns (uint8) {
    return _decimal;
  }
  function totalSupply() external override view returns (uint256) {
    return _totalSupply;
  }
  function balanceOf(address _owner) external override view returns (uint256 balance) {
    return balances[_owner];
  }
  //轉帳
  function transfer(address _to, uint256 _amount) external returns (bool success) {
    require(balances[msg.sender] > _amount, "Not enough amount!");
    balances[msg.sender] -= _amount;
    balances[_to] += _amount;
    emit Transfer(msg.sender, _to, _amount);
    return true;
  }
  
  //從哪裡移轉出去
  function transferFrom(address _from, address _to, uint256 _value) external returns (bool success) {
    //找到我(_from)的帳號給發起這個轉帳的人(msg.sender)足夠的金錢去花費(允許的數量)
    uint _allowance = allowances[_from][msg.sender];
    //剩餘數量=允許的數量 - 發送的數量
    uint leftAllowance = _allowance - _value;
    //檢查剩餘數量是否>0
    require(leftAllowance >= 0, "Not enought allowance!");
    //把剩餘的數量寫回允許的數量
    allowances[_from][msg.sender] = leftAllowance;
    //檢查我的(_from)剩餘餘額是否足夠
    require(balances[_from] > _value, "Not enought Amount");
    balances[_from] -= _value; //發送的錢包扣掉數量
    balances[_to] += _value; //發送到的錢包加入此數量
    emit Transfer(msg.sender, _to, _value);
    return true;
  }
  //批准誰可以花我的錢
  function approve(address _spender, uint256 _value) external override returns (bool success) {
    allowances[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    
    return true;
  }
  
  function allowance(address _owner, address _spender) external override view returns (uint256 remaining) {
    return allowances[_owner][_spender];
  }
}
上面的代碼看起來很長,其實就是MyToken繼承了ERC20了而已然後再override成自己需要的樣子,比較麻煩的大概就是transferFrom比較需要去理解,說明我都寫在程式碼裡面了,發幣的部份我們留著下一篇來說明,這篇就先寫到這,謝謝。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
為什麼會看到廣告
avatar-img
20會員
38內容數
目前加密貨幣的市場上幣種非常的多 讓你看得眼花撩亂了嗎? 可以藉由這一系列的加密貨幣分析 能夠幫忙您了解每一個加密貨幣它的價值所在 每一集都會介紹一種幣 是一個很實用的專題,歡迎大家訂閱~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
宅D嘉的沙龍 的其他內容
最近在幣圈最火紅的不外乎就是LUNA和UST的暴跌了,只要上Google打LUNA或是UST就可以看到一堆的新聞或是文章了,這邊就不多說明,想知道原因的可以上Google大神去查詢。 我這邊要來說一下我的想法,和從這個事件中,我學到了什麼? 穩定幣不一定是安全的 留心高收益的陷阱 未來我的調整
factory pattern 工廠模式簡單的說就是負責創建一系列相同品質的智能合約,為什麼說是相同品質呢?因為有相同的模版,所以做出來的智能合約品質也會相同,我知道看到這裡可能還是有人會覺得霧煞煞的,沒關係,我們用下面的實作來說明就會比較清楚了: 提高合約安全性。
下面來Deploy看看: Deploy只要佈署Counter和MyContract就可以了,interface是不需要佈署的。 實現從MyContract經由接口去調用Counter的increment 可以藉由調用Uniswap的Interface來查看Uniswap兩個幣目前的流動狀況:
講完Import,這一篇我們來講講也是很重要的Library,我們之前有提到,程式是愈直覺簡單愈好,可以大大的減少維護成本,把可以共用的部份都抽離出來寫成部份程式碼就是我們今天要講的Library,可以是共用的功能或是檢查。 Library.sol testLibrary.sol
下面我們就來講解Import該怎麼使用及可以調用外部在GitHub上面寫好的合約,比如說OpenZeppelin的ERC20合約。
創建兩個合約A和B,介紹怎麼由合約B去調用合約A
最近在幣圈最火紅的不外乎就是LUNA和UST的暴跌了,只要上Google打LUNA或是UST就可以看到一堆的新聞或是文章了,這邊就不多說明,想知道原因的可以上Google大神去查詢。 我這邊要來說一下我的想法,和從這個事件中,我學到了什麼? 穩定幣不一定是安全的 留心高收益的陷阱 未來我的調整
factory pattern 工廠模式簡單的說就是負責創建一系列相同品質的智能合約,為什麼說是相同品質呢?因為有相同的模版,所以做出來的智能合約品質也會相同,我知道看到這裡可能還是有人會覺得霧煞煞的,沒關係,我們用下面的實作來說明就會比較清楚了: 提高合約安全性。
下面來Deploy看看: Deploy只要佈署Counter和MyContract就可以了,interface是不需要佈署的。 實現從MyContract經由接口去調用Counter的increment 可以藉由調用Uniswap的Interface來查看Uniswap兩個幣目前的流動狀況:
講完Import,這一篇我們來講講也是很重要的Library,我們之前有提到,程式是愈直覺簡單愈好,可以大大的減少維護成本,把可以共用的部份都抽離出來寫成部份程式碼就是我們今天要講的Library,可以是共用的功能或是檢查。 Library.sol testLibrary.sol
下面我們就來講解Import該怎麼使用及可以調用外部在GitHub上面寫好的合約,比如說OpenZeppelin的ERC20合約。
創建兩個合約A和B,介紹怎麼由合約B去調用合約A
你可能也想看
Google News 追蹤
Thumbnail
这篇文章主要介绍了以太坊科普:理解ERC-20 token合约的相关资料,希望这篇关于理解ERC-20 token合约的文章,能够帮助各位朋友对以太坊有个更加深入的了解。 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 🔑 专属邀请码: R8
Thumbnail
为了编写智能合约,开发人员往往需要选择一种适合的编程语言,目前市场上有几种常用的智能合约编程语言,比如Solidity、Vyper、Michelson等,那么具体智能合约常用语言有哪些,让我们一起来看看吧 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续
Thumbnail
本文深入解析BRC-20到DRC-20协议,揭示技术逻辑和原理,并分析BRC20的现状和局限性,总结出五大优势,为读者提供全面的协议解读。 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 🔑 专属邀请码: R851UX3N 目录* 引言
Thumbnail
在加密货币世界中,隐私和安全一直是重要的话题。随着TRON网络上的TRC20代币和以太坊网络上的ERC20代币的兴起,人们对匿名兑换和隐私保护的需求日益增加。本文将探讨TRC20和ERC20代币的匿名兑换--Cce.Cash混币技术,以及它是如何帮助加密货币用户保护个人隐私和增强交易安全性。
TRC20,ERC20,Bep20是三种不同的区块链协议,分别基于波场(TRON),以太坊(Ethereum)和币安智能链(BSC)网络。它们都可以用来发行代币,比如USDT,但是在转账费用、交易速度、智能合约等方面有一些差异。本文将介绍TRC20和ERC20的概念、特点和区别,以及如何在两种协议之
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
1. ERC-20 ERC20 (KryptoCamp) ERC20 (Naz Dumansky) 多簽錢包的設計 - 23:02 🌳 基礎題 1 解答說明: 發行總量100億顆、位數 18 的代幣 - 07:15 🌳 自製 ERC20 交換腦西幣 (HaHow 朱西西) 2. ER
Thumbnail
之前討論過基於Ordinals協議的BRC-20,意旨將比特幣最小單位的SATS聰(以中本聰Satoshis命名)進行編號排序,使得可以在比特鏈上發行同質化代幣FT。
Thumbnail
過去BTC比特幣協定主要作為紀錄的block區塊,所以較沒有ETH以太坊生態的靈活性,2023年Casey Rodarmor提出Ordinals銘文概念,使比特生態有了新的樣貌,而BRC-20即是Ordinals銘文概念的一種延伸,類似於以太鏈的ERC-20。
Thumbnail
二月份最火熱的話題就是由Pandora團隊開發的ERC-404代幣標準,儘管目前ERC-404不屬於以太坊提案標準,但其結合ERC-20與ERC-721運用的概念,仍為市場帶來新的玩法。
Thumbnail
这篇文章主要介绍了以太坊科普:理解ERC-20 token合约的相关资料,希望这篇关于理解ERC-20 token合约的文章,能够帮助各位朋友对以太坊有个更加深入的了解。 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 🔑 专属邀请码: R8
Thumbnail
为了编写智能合约,开发人员往往需要选择一种适合的编程语言,目前市场上有几种常用的智能合约编程语言,比如Solidity、Vyper、Michelson等,那么具体智能合约常用语言有哪些,让我们一起来看看吧 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续
Thumbnail
本文深入解析BRC-20到DRC-20协议,揭示技术逻辑和原理,并分析BRC20的现状和局限性,总结出五大优势,为读者提供全面的协议解读。 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 🔑 专属邀请码: R851UX3N 目录* 引言
Thumbnail
在加密货币世界中,隐私和安全一直是重要的话题。随着TRON网络上的TRC20代币和以太坊网络上的ERC20代币的兴起,人们对匿名兑换和隐私保护的需求日益增加。本文将探讨TRC20和ERC20代币的匿名兑换--Cce.Cash混币技术,以及它是如何帮助加密货币用户保护个人隐私和增强交易安全性。
TRC20,ERC20,Bep20是三种不同的区块链协议,分别基于波场(TRON),以太坊(Ethereum)和币安智能链(BSC)网络。它们都可以用来发行代币,比如USDT,但是在转账费用、交易速度、智能合约等方面有一些差异。本文将介绍TRC20和ERC20的概念、特点和区别,以及如何在两种协议之
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
1. ERC-20 ERC20 (KryptoCamp) ERC20 (Naz Dumansky) 多簽錢包的設計 - 23:02 🌳 基礎題 1 解答說明: 發行總量100億顆、位數 18 的代幣 - 07:15 🌳 自製 ERC20 交換腦西幣 (HaHow 朱西西) 2. ER
Thumbnail
之前討論過基於Ordinals協議的BRC-20,意旨將比特幣最小單位的SATS聰(以中本聰Satoshis命名)進行編號排序,使得可以在比特鏈上發行同質化代幣FT。
Thumbnail
過去BTC比特幣協定主要作為紀錄的block區塊,所以較沒有ETH以太坊生態的靈活性,2023年Casey Rodarmor提出Ordinals銘文概念,使比特生態有了新的樣貌,而BRC-20即是Ordinals銘文概念的一種延伸,類似於以太鏈的ERC-20。
Thumbnail
二月份最火熱的話題就是由Pandora團隊開發的ERC-404代幣標準,儘管目前ERC-404不屬於以太坊提案標準,但其結合ERC-20與ERC-721運用的概念,仍為市場帶來新的玩法。