智能合約開發實戰(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
宅D嘉的開發人生
22會員
55內容數
加密貨幣很有趣,遊戲開發也很有趣,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
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
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的命名故事。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News