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

更新 發佈閱讀 10 分鐘

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

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

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

vocus|新世代的創作平台

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

// 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
宅D嘉的開發人生
22會員
58內容數
加密貨幣很有趣,遊戲開發也很有趣,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
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
ERC-20是以太坊區塊鏈上其中一個最被廣泛使用的智能合約協議標準。相信有買賣加密貨幣和NFT經驗的讀者對這個名字不會感到陌生,已有很多區塊鏈的專家、博客在網上詳細說明它的優點缺陷和功能比較,大家只要google一下便可找到很多相關文章,所以我反而想說說一個關於ERC-20的命名故事。
Thumbnail
ERC-20是以太坊區塊鏈上其中一個最被廣泛使用的智能合約協議標準。相信有買賣加密貨幣和NFT經驗的讀者對這個名字不會感到陌生,已有很多區塊鏈的專家、博客在網上詳細說明它的優點缺陷和功能比較,大家只要google一下便可找到很多相關文章,所以我反而想說說一個關於ERC-20的命名故事。
Thumbnail
學了這麼多的Solidity後,該來完整的寫一個ERC20的token,順便也了解一下發幣的邏輯。 然後只要符合下面這些標準的就可以是ERC20: 我們就把上面的這些寫入程式碼中: 有什麼想要了解或是不清楚的部份,歡迎留言和我分享。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
Thumbnail
學了這麼多的Solidity後,該來完整的寫一個ERC20的token,順便也了解一下發幣的邏輯。 然後只要符合下面這些標準的就可以是ERC20: 我們就把上面的這些寫入程式碼中: 有什麼想要了解或是不清楚的部份,歡迎留言和我分享。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
上一篇寫完了ERC20的程式碼,這篇來寫寫怎麼發幣,上去區塊鏈,但有一些基本的設定要完成,也就是必須連結MetaMask錢包(人稱:狐狸錢包),拿Ropsten測試網路來當發幣測試,先過去MetaMask做好設定(沒有的上網註冊一個,不會用的上網查一下怎麼設定有很多介紹,這邊就不再介紹了)。
Thumbnail
上一篇寫完了ERC20的程式碼,這篇來寫寫怎麼發幣,上去區塊鏈,但有一些基本的設定要完成,也就是必須連結MetaMask錢包(人稱:狐狸錢包),拿Ropsten測試網路來當發幣測試,先過去MetaMask做好設定(沒有的上網註冊一個,不會用的上網查一下怎麼設定有很多介紹,這邊就不再介紹了)。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
ERC-20 是以太坊上的一種標準協議,用於創建和交換可互操作的代幣。它定義了一組規則和函數,使開發者能夠在以太坊區塊鏈上創建代幣,並在兼容 ERC-20 的錢包和交易所中進行交易。
Thumbnail
ERC-20 是以太坊上的一種標準協議,用於創建和交換可互操作的代幣。它定義了一組規則和函數,使開發者能夠在以太坊區塊鏈上創建代幣,並在兼容 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
下面我們就來講解Import該怎麼使用及可以調用外部在GitHub上面寫好的合約,比如說OpenZeppelin的ERC20合約。
Thumbnail
下面我們就來講解Import該怎麼使用及可以調用外部在GitHub上面寫好的合約,比如說OpenZeppelin的ERC20合約。
Thumbnail
用過以太坊、買過以太幣,也知道以太坊創辦人是誰,但你真正理解潛藏在以太坊公鏈背後的 ERC 代幣標準是什麼嗎? 什麼是 ERC 代幣標準? 要認識 ERC 代幣標準是什麼,首先我們要先理解何謂ERC。 ERC 代幣標準有哪些? ERC-20:一種發行代幣技術標準,提供以太坊上的發行代幣遵循規則。
Thumbnail
用過以太坊、買過以太幣,也知道以太坊創辦人是誰,但你真正理解潛藏在以太坊公鏈背後的 ERC 代幣標準是什麼嗎? 什麼是 ERC 代幣標準? 要認識 ERC 代幣標準是什麼,首先我們要先理解何謂ERC。 ERC 代幣標準有哪些? ERC-20:一種發行代幣技術標準,提供以太坊上的發行代幣遵循規則。
Thumbnail
這次的 NFT 開發,希望讓讀者們在實作時,盡量用最少的程式碼也能夠完成你的 NFT 作品,而這篇文章可以當做是一個暖身,我們會大致瀏覽本次開發 NFT 所需要用到的一些工具與小知識,大概整理之後暫時先分為六大主題...
Thumbnail
這次的 NFT 開發,希望讓讀者們在實作時,盡量用最少的程式碼也能夠完成你的 NFT 作品,而這篇文章可以當做是一個暖身,我們會大致瀏覽本次開發 NFT 所需要用到的一些工具與小知識,大概整理之後暫時先分為六大主題...
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News