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

更新 發佈閱讀 10 分鐘

學了這麼多的Solidity後,該來完整的寫一個ERC20的token,順便也了解一下發幣的邏輯。

那麼ERC20是什麼呢?
ERC-20(Ethereum Request for Comments 20)由 Fabian Vogelsteller 於 2015 年 11 月提出,是一種在智能合約中實現代幣 API 的代幣標準。(以太坊官網)

然後只要符合下面這些標準的就可以是ERC20:

raw-image

我們就把上面的這些寫入程式碼中:

// 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
留言分享你的想法!
avatar-img
宅D嘉的開發人生
21會員
50內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/03/28
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
2025/03/28
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
2025/03/22
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Thumbnail
2025/03/22
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Thumbnail
2025/03/21
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
Thumbnail
2025/03/21
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
Thumbnail
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
ERC-20 是以太坊上的一種標準協議,用於創建和交換可互操作的代幣。它定義了一組規則和函數,使開發者能夠在以太坊區塊鏈上創建代幣,並在兼容 ERC-20 的錢包和交易所中進行交易。
Thumbnail
ERC-20 是以太坊上的一種標準協議,用於創建和交換可互操作的代幣。它定義了一組規則和函數,使開發者能夠在以太坊區塊鏈上創建代幣,並在兼容 ERC-20 的錢包和交易所中進行交易。
Thumbnail
用過以太坊、買過以太幣,也知道以太坊創辦人是誰,但你真正理解潛藏在以太坊公鏈背後的 ERC 代幣標準是什麼嗎? 什麼是 ERC 代幣標準? 要認識 ERC 代幣標準是什麼,首先我們要先理解何謂ERC。 ERC 代幣標準有哪些? ERC-20:一種發行代幣技術標準,提供以太坊上的發行代幣遵循規則。
Thumbnail
用過以太坊、買過以太幣,也知道以太坊創辦人是誰,但你真正理解潛藏在以太坊公鏈背後的 ERC 代幣標準是什麼嗎? 什麼是 ERC 代幣標準? 要認識 ERC 代幣標準是什麼,首先我們要先理解何謂ERC。 ERC 代幣標準有哪些? ERC-20:一種發行代幣技術標準,提供以太坊上的發行代幣遵循規則。
Thumbnail
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol 上面也有其他的程式碼,各位有興趣的可以上去看看。 下面就直接上程式碼: 之後你應該會看到新的lin幣
Thumbnail
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol 上面也有其他的程式碼,各位有興趣的可以上去看看。 下面就直接上程式碼: 之後你應該會看到新的lin幣
Thumbnail
上一篇寫完了ERC20的程式碼,這篇來寫寫怎麼發幣,上去區塊鏈,但有一些基本的設定要完成,也就是必須連結MetaMask錢包(人稱:狐狸錢包),拿Ropsten測試網路來當發幣測試,先過去MetaMask做好設定(沒有的上網註冊一個,不會用的上網查一下怎麼設定有很多介紹,這邊就不再介紹了)。
Thumbnail
上一篇寫完了ERC20的程式碼,這篇來寫寫怎麼發幣,上去區塊鏈,但有一些基本的設定要完成,也就是必須連結MetaMask錢包(人稱:狐狸錢包),拿Ropsten測試網路來當發幣測試,先過去MetaMask做好設定(沒有的上網註冊一個,不會用的上網查一下怎麼設定有很多介紹,這邊就不再介紹了)。
Thumbnail
學了這麼多的Solidity後,該來完整的寫一個ERC20的token,順便也了解一下發幣的邏輯。 然後只要符合下面這些標準的就可以是ERC20: 我們就把上面的這些寫入程式碼中: 有什麼想要了解或是不清楚的部份,歡迎留言和我分享。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
Thumbnail
學了這麼多的Solidity後,該來完整的寫一個ERC20的token,順便也了解一下發幣的邏輯。 然後只要符合下面這些標準的就可以是ERC20: 我們就把上面的這些寫入程式碼中: 有什麼想要了解或是不清楚的部份,歡迎留言和我分享。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
Thumbnail
這次的 NFT 開發,希望讓讀者們在實作時,盡量用最少的程式碼也能夠完成你的 NFT 作品,而這篇文章可以當做是一個暖身,我們會大致瀏覽本次開發 NFT 所需要用到的一些工具與小知識,大概整理之後暫時先分為六大主題...
Thumbnail
這次的 NFT 開發,希望讓讀者們在實作時,盡量用最少的程式碼也能夠完成你的 NFT 作品,而這篇文章可以當做是一個暖身,我們會大致瀏覽本次開發 NFT 所需要用到的一些工具與小知識,大概整理之後暫時先分為六大主題...
Thumbnail
下面我們就來講解Import該怎麼使用及可以調用外部在GitHub上面寫好的合約,比如說OpenZeppelin的ERC20合約。
Thumbnail
下面我們就來講解Import該怎麼使用及可以調用外部在GitHub上面寫好的合約,比如說OpenZeppelin的ERC20合約。
Thumbnail
ERC-20是以太坊區塊鏈上其中一個最被廣泛使用的智能合約協議標準。相信有買賣加密貨幣和NFT經驗的讀者對這個名字不會感到陌生,已有很多區塊鏈的專家、博客在網上詳細說明它的優點缺陷和功能比較,大家只要google一下便可找到很多相關文章,所以我反而想說說一個關於ERC-20的命名故事。
Thumbnail
ERC-20是以太坊區塊鏈上其中一個最被廣泛使用的智能合約協議標準。相信有買賣加密貨幣和NFT經驗的讀者對這個名字不會感到陌生,已有很多區塊鏈的專家、博客在網上詳細說明它的優點缺陷和功能比較,大家只要google一下便可找到很多相關文章,所以我反而想說說一個關於ERC-20的命名故事。
Thumbnail
此篇文是在練習並熟悉solidity與remix的操作
Thumbnail
此篇文是在練習並熟悉solidity與remix的操作
Thumbnail
從2021年開始相信大家就很常聽到同質化代幣與非同質化代幣(NFT)這兩個名詞,因為NFT熱潮,大家比較容易理解什麼是非同質化代幣。 但代幣有不同的應用與功能,產生許多不同的代幣標準,以下由貝瑞大叔替大家整理代幣標準的起源以及不同的代幣標準之間到底有什麼差異呢? |關於以太坊ERC標準的起源
Thumbnail
從2021年開始相信大家就很常聽到同質化代幣與非同質化代幣(NFT)這兩個名詞,因為NFT熱潮,大家比較容易理解什麼是非同質化代幣。 但代幣有不同的應用與功能,產生許多不同的代幣標準,以下由貝瑞大叔替大家整理代幣標準的起源以及不同的代幣標準之間到底有什麼差異呢? |關於以太坊ERC標準的起源
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News