KryptoCamp ERC20教學

閱讀時間約 10 分鐘

以前覺得程式隔行如隔山, 一直都鴨子聽雷進入自我懷疑回圈, 特別感謝Paul老師, 願意花大量時間鉅細靡遺的介紹, 像解釋文言文一般, 悉心的一字一句清晰的解釋成白話文給我們大家, 終於找到了火山登山口的感覺, 繼續加油 🌳

1. mapping(address account => uint256) private _balances;

mapping -> 一個table, 左邊欄位(address)對應到右邊欄位(uint256) = 哪個地址擁有多少錢, 表示含金度

2. mapping(address account => mapping(address spender => uint256)) private _allowances;

allowance 紀錄: 擁有者(owner) 授權, 設定讓某個人(spender)動用多少自己的資產

allowance 指的是一種功能,用於實現代幣擁有者(owner)授權另一個帳戶(spender)代表自己進行轉移一定數量的代幣。具體來說,ERC-20 標準中的 allowance 機制通常用於實現代幣轉移的授權管理,以及允許合約代表用戶進行轉移 - ChatGPT

3. uint256 private _totalSupply;

這個幣總量發了多少?

4. string private _name;

這個幣的名稱

5. string private _symbol;

這個幣的縮寫

6. constructor(string memory name_; string memory symbol) { _name = name_; _symbol = symbol_; }

在合約被創建時, 就要表示代幣的名稱簡稱是什麼?

constructor 是一種特殊的函數,用於合約的初始化。當一個合約被創建時(即合約部署到區塊鏈上時),constructor 函數會被自動執行一次來初始化合約的狀態。 -ChatGPT

7. function name() public view virtual returns (string memory) { return _name;}

功能是取得合約的名稱

8. function symbol() public view virtual returns (string memory) { return _symbol;}

功能是取得合約的簡稱

9. function decimals() public view virtual returns (uint8) { return 18;}

功能直接把10^18固定住了, 是預設值, 但因為這是virtual, 所以繼承合約後可以覆寫override

10. function totalSupply() public view virtual returns (uint256) {return _totalSupply;}

取得目前代幣總共發了多少顆?

11. function balanceOf(address account) public view virtual returns (uint256) { return _balances(account);

呼應前面的mapping, 取得擁有者有多少幣

12. function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; }

帶入你要傳送對象的地址(address to), 以及你要傳送給他的幣量(uint256 value)

13. function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowance[owner][spender];

  • 可以查詢某一個user, 授權給另一個address多少的幣
  • 在某一個function後面看到view或是pure, 就是查資料, 不會扣到gas fee,
  • 如果沒有看到 view 或是 pure, 他就認為你要改變合約狀態, 就要付gas fee

14. function approve (address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); returns true;}

告訴他你要授權多少幣量給哪個地址, 會寫進allowance的mapping裡

15. function transferfrom address from, address to, uint256 value) public view returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value; _transfer(from, to, value); return true; }

從user轉移到sender多少量, 必須先有user授權可以動用這筆資產 (這段有點聽不懂, 之後再回過頭來聽)

16. function _mint(address account, uint256 value) internal { if(account == address(0)) { revert ERC20 InvalidReceiver(address(0), account, value);}

提供一個internal的function, 我的合約繼承他之後, 可以一開始都發完, 不用讓用戶來mint

老師講義

1. 狀態變數

  • _balances: 持幣紀錄。(address => uint256)
  • _allowances: 授權關係。 (address => (address => uint256))
  • _totalSupply:代幣供給量。
  • _name: 代幣名稱。
  • _symbol: 代幣簡稱。

2. Function

2.1 Get: (查資料, 不會耗費gas)

  • name():取得代幣名稱。

symbol():取得代幣簡稱。

decimals():取得精度。

totalSupply():取得總發行量。

balanceOf(address account):取得「某地址」的「持幣量」。

2.2 Write: (會改變合約狀態)

  • transfer(address to, uint256 value):轉移代幣。
  • approve(address spender, uint256 value):授權「某地址」操作「某數量」代幣。
  • transferFrom(address from, address to, uint256 value):轉移代幣,通常「被授權者」會呼叫這個。

2.3 internal:

  • _mint(address account, uint256 value):鑄造代幣。
  • _burn(address account, uint256 value):燒掉代幣。

Demo Code (發幣只需要27行)

  • 釣魚網站陷阱: 授權
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

// 幣的名稱, 以及繼承ERC20合約
contract ERC20Example is ERC20 {

// 定義最大供給量, 規定這個幣最多發多少
uint256 public maxSupply;

//建構子初始化ERC20必要參數(name與symbol),並多加設定題目要求的maxSupply
constructor(
string memory _name,
string memory _symbol,
uint256 _maxSupply
) ERC20(_name, _symbol){
//執行時填入10000000000(100億) * 1000000000000000000(單位)
maxSupply = _maxSupply;
}
// 為了讓用戶自己鑄造
// 用戶輸入uint256 amount的數量
// 要自己實作mint function,主要用來demo確認用
function mint (uint256 amount) external {
//判斷這筆交易若完成,是否會超出最大供給量,如果會就回傳錯誤字串"over max supply."
require(amount + totalSupply() <= maxSupply, "over max supply.");
_mint(msg.sender, amount); // 如果上一行成立, 就會呼叫這行執行, 右邊的數量, 轉給呼叫者
}
}

[Reference]

  1. Solidity 實戰系列工作坊第 3 場精彩重播: ERC20 同質化代幣與 ERC721 NFT 非同質化代幣
  2. Week3- Token (ERC20) & NFT (ERC721), 講師 Paul Wu, 2024/5/12
    尋大神腳印, 亦步亦趨。
    留言0
    查看全部
    發表第一個留言支持創作者!
    5.3
    閱讀時間約 1 分鐘
    5.4
    閱讀時間約 1 分鐘
    5.5 Merkle Tree x Whitelist
    閱讀時間約 1 分鐘
    4.1
    閱讀時間約 1 分鐘
    4.4
    閱讀時間約 7 分鐘
    4.5
    閱讀時間約 1 分鐘
    你可能也想看
    不是網站404,是ERC-404ERC-404是蝦米碗糕? 根據這篇文章表示: ERC-404是一個新的、實驗性的以太坊代幣標準,由匿名創建者"ctrl"和"Acme"開發。它結合了ERC-20(代表可替代代幣)和ERC-721(代表非同質化代幣,即NFT)的特點,創建了一種「半同質化」的數字資產。ERC-404的獨特之處在於
    Thumbnail
    avatar
    楊懂
    2024-02-14
    NFT的重要進展- ERC6551最近不少文章把ERC6551說成NFT的救世主、GameFi的救星/顛覆者等等(標題總是誇張了點),這個由原ERC721團隊創造的新協議,確實把「NFT即錢包」這個概念推到很高的討論度。 什麼是NFT即錢包?比較簡單的想像就是「網路遊戲的帳號」,這個帳號裡頭有高等級角色、裝備而且可以在像8591
    Thumbnail
    avatar
    EasonHu.eth
    2023-08-04
    什麼是 ERC-20?ERC-20 是以太坊上的一種標準協議,用於創建和交換可互操作的代幣。它定義了一組規則和函數,使開發者能夠在以太坊區塊鏈上創建代幣,並在兼容 ERC-20 的錢包和交易所中進行交易。
    Thumbnail
    avatar
    Yish
    2023-07-04
    ERC20 / ERC721 / ERC1155 代表什麼含意? | NFT探索EP03ERC20 / ERC721 / ERC1155 ? 會想要瞭解這三個專有名詞的差異,想必是已經開始對區塊鏈的細節產生興趣的朋友。 ERC的英文全稱是 "Ethereum Request for Comments",其中 "Ethereum" 是以太坊的名稱 "Request for Comment
    Thumbnail
    avatar
    自由之心本部
    2023-04-04
    【新手學習】在 OpenSea 上查看 ERC-1155 NFT 擁有數量 及 取消隱藏 NFT 的圖文教學ERC-1155 讓 NFT 失去了獨特性,變成了現在常見的大量印刷商品。這個做法可以節省創作者及鑄造者的鑄造及轉移 NFT 的成本,特別是 Gas Fee,效果顯著。因此,一些非 PFP 類似的 NFT,如通行證、商品類的 NFT 就十分適合使用 ERC-1155 進行鑄造了。
    Thumbnail
    avatar
    熊太先森
    2023-03-14
    NextJS & HTML 實作 ERC20 交易網站【開發筆記】說是開發過程的筆記,應該是撞牆心血錄,因為各式各樣的原因,所以為前後端串接困擾了很久⋯⋯
    Thumbnail
    avatar
    Lien
    2022-12-05
    ERC-5050 智能合約新標準?近日有個項目在Opensea上宣稱mint它們的項目有50%的機率免錢(當然Gas是一定要付的就算免錢,只會返回你的mint價)。這個項目就是
    Thumbnail
    avatar
    楊懂
    2022-07-07
    加密貨幣背後的故事系列(二) ERC-20,為什麼叫20而不叫19或21?ERC-20是以太坊區塊鏈上其中一個最被廣泛使用的智能合約協議標準。相信有買賣加密貨幣和NFT經驗的讀者對這個名字不會感到陌生,已有很多區塊鏈的專家、博客在網上詳細說明它的優點缺陷和功能比較,大家只要google一下便可找到很多相關文章,所以我反而想說說一個關於ERC-20的命名故事。
    Thumbnail
    avatar
    Pak Lun Wong
    2022-04-28
    【區塊鏈知識】快速瞭解以太坊的 ERC 與 EIP在這篇文章中,我們會提到 EIP 是甚麼,它的種類有哪些,還有所謂的 ERC 的代幣協議是甚麼,如果你也是想要透過寫程式的方式,在以太坊兼容的區塊鏈上發行自己的代幣或是 NFT 的話,那麼大致上瞭解 EIP 與 ERC 就會是需要的功課。
    Thumbnail
    avatar
    ITechNote 科技隨筆
    2022-04-21
    WireX crypto ERC20轉CDC這篇要來分享Wirex購入USDC.USDT,透過ERC20轉到CDC app 雖然我還是比較喜歡用WISE走歐元法幣入金,轉帳費用固定 但剛好想嘗試看看從wirex,因為無論是刷卡入金USD或USDC.USDT,資金在此停泊都有滿好的利息,而且是周領 因此可以在美元便宜時多換一些,當作定存
    avatar
    劉佳雯
    2022-04-15