iT邦幫忙

2022 iThome 鐵人賽

DAY 4
1
Web 3

Road Map To DApp Developer系列 第 4

【DAY4】 - ERC721 Token ( Introduction)

  • 分享至 

  • xImage
  •  

Preface

ERC721 Token aka NFT 對世界造成了諸多的改變與影響,但是事實上有些人(如幾個月前的我)對於 NFT 為何可以用在藝術品收藏、憑證、或甚至作為一個 token 的概念並不是非常熟悉。因此希望可以透過這篇文章來介紹 ERC721 協議做了哪些事情使他具有憑證的特性,當然還有介紹在發 NFT 的時候需要做什麼事情。

另外不管是發行 NFT 或是 ERC1155 的代幣,都需要理解 ERC20 標準中寫了些什麼,還有具有那些函式以及它們的功能等,因此我也會在這篇介紹 ERC20 中需要的函式有哪些以及它們的功能!

What is ERC?

我們都聽過 ERC20、ERC721,但是好像卻沒有了解過 ERC 到底是什麼東西。事實上,ERC 的全名是 Ethereum Request for Comment,後面的 Request for Comment(縮寫為 RFC),意為「請求意見稿」,就是某些社群希望透過網路上的大家幫忙制定的一個協議。而以以太坊為例,ERC20、ERC721(還有其延伸協議:ERC721R、ERC721A、ERC721Votes 等)或是 ERC1155 都是徵求社群中某些人的提案,隨後將經由審查與流程,最終由社群決定是否通過,而在 EIP 上的狀態顯示「Final」 的提議就代表是通過了。(根據維基百科的中文翻譯,ERC 又被稱為智能合約協議)

而 ERC20 與 ERC721 與 token 相關,人們可以透過這些協議來 mint(鑄造)代幣,而若是不同的應用程式使用不同的協議,則會帶來許多不便。例如我們今天自己寫了一個轉出幣的 function 叫做 tranfer(_to, _from),但是別人寫的 function 可能是相反的 tranfer(_from, _to),這些不同會導致不同應用程式之間的互動性下降而無法相容。

Fungible Token

Non-fungible Token 的中文名稱為「非同質化代幣」,但是在進入這個名詞的解釋前,可能先了解「同質化代幣」(Fungible Token)會比較好理解。

同質化代幣的概念就像是一般的法定貨幣,如新台幣、美金,或是加密貨幣如比特幣、以太幣等。可以思考一下,這些貨幣擁有那些特性?我認為同質化代幣的特性有兩種:

  • 這些貨幣不具有獨特性(具有同質性)。

    • A 持有的一顆以太幣,與 B 持有的一顆以太幣的價值是相同的。
    • A 轉帳給 B 的一顆以太幣,只會跟 B 錢包中的以太幣結合,分不清哪一顆是 A 轉給 B 的。
  • 這些貨幣可以被分割。

    • 可分割性:可以購買到非整數的以太幣或是比特幣,如 0.001 顆 ETH、0.12 顆 BTC。

更多 ERC20 的相關資訊可以看這邊

Non-fungible Token

而另一方面,「非同質化代幣」的特性則與同質化代幣完全相反。非同質化代幣是 「無法被分割」且「獨一無二的」

以我小時候最愛玩的楓之谷為例,一般來說,每一張地圖裡面會有一些 NPC 販賣著固定價錢的道具,像是「紅藥水」,我認為紅藥水就非常像是 同質化代幣,因為它一瓶定價 50 楓幣,且 NPC 賣的紅藥水都有相同的功能「回血 100 滴」。但另一方面,裡面也有一個市集叫做自由市場,一些玩家在打怪掉出了一些很稀有的道具或是透過卷軸衝出很好的道具,都會到聚集到這個市場並開始擺攤,這些商品就比較像是 NFT 一樣,每一件商品的數值都不同,因此價值也不同。

Why NFTs?

你可能會想說,在傳統的藝術世界中,已經具有公允的憑證(用來證實作品的真偽),那為什麼還需要 NFT 將他放到鏈上,不僅麻煩又還要手續費?又或者你覺得,這些網路上的 NFT 都只是一張張的 jpg 而已,截圖之後就可以拿來當大頭貼了阿!

所有權證明

其實 NFT 最主要的功能就是 「所有權證明」。ERC721 這個協議所鑄造的 token,除了可證明它的真偽,還具有追蹤的功能。具體來說,NFT 透過區塊鏈,將交易紀錄全都儲存於其中,而這一個行為同時保證了 NFT 的安全性與真實性

舉例來說,若 A transfer 了一個 NFT 給 B,就代表這個 NFT 的所有權轉移給 B,且這一次的交易會被永遠的記錄在以太坊的區塊鏈上,像是在 opensea 的 Meebit#446,點開後找到下面的 Item activity 便可以看到像下面顯示的紀錄,這些交易都是被永遠儲存在鏈上的

以上面這張圖為例,這張 Meebit#446 最新的所有權的擁有者(撰文時)叫做 fupogroupdao,而也可以在 Etherscan 或是直接在 opensea 上查到這個帳戶是 0xf4431EC76055687b5b3A88997DeA49ad70F7bA6a


Meebit#446

因此在上述兩個疑問,便可以在現在回答:我們不需要去懷疑這個 NFT 的所有權是否是造假的,因此降低了很多鑑定人員的人事成本、器材成本,或甚至運送成本等。此外,區塊鏈上可以記錄這個 NFT 的交易紀錄(包含二級市場中的紀錄)與目前的所有權帳戶,因此將 NFT 截圖,當作自己的大頭貼並不代表你真實擁有這個 token

而事實上 NFT 可以不只是一張 JPG 圖檔,它可以是很多樣化的,像是音樂、影片、文章,都可以是一枚 NFT。但是更意想不到的是,NFT 還可以應用在生活中,像是房屋的權證、真實畫作的權證等,都是 NFT 的應用範圍。

ERC20 Standard

ERC20 Interface

所謂的 Interface,指的是只有函數宣告的合約,就像是 C 語言會在程式的一開始宣告函式的名稱一樣。

而 ERC20 中的函式如下:

contract IERC20 {
/*FUNCTIONS*/
    function name() public view returns (string)
    function symbol() public vieww returns (string)
    function totalSupply() public view returns (uint256)
    function balanceOf(address _owner) public view returns (uint256 balance)
    function transfer(address _to, uint256 _value) public returns (bool sucess)
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
    function allowance(address _owner, address _spender) public view returns (uint256 remaining)
    function approve(address _spender, uint256 _value) public returns (bool success)
    

/*EVENTS*/
    event Transfer(address indexed _from, address indexed _to, uint256 _value)
    event Approval(address indexed _owner, address indesed _spender, uint256 _value)
    
}

functions

因為有些函式如 name()symbol() 其實看名字就大概知道它的意思了,因此在此不會過多做說明,我會介紹一些我自己看了後覺得不太懂的來說明。

1. transfer(address _to, address _value) -> bool

  • msg.sender 送出 _value 的 token 給予 _to 這個地址的人。
  • 如果 msg.sender 的 balance 為 0 則會 throw
  • transfer() 會觸發 Transfer() event(下面會提到)。
  • return: true: 交易成功;false == 交易失敗

2. transferFrom(_address from, address _to, uint256 _value) -> bool

  • _from 地址中轉 _value 的 token 到 _to 的帳戶中。
  • 這個函式的重點是可以透過合約來 transfer token,也就是 _from 可以是合約地址或是 EOA(EOA = External Owned Address,就是一般錢包的 address) 。
  • _from 需要先透過其他方式授權 msg.sender 後才能發起這筆交易。
  • 也會觸發 Transfer() event。
  • return: true: 交易成功;false: 交易失敗。

3. approve(address _spender, uint256 _value) -> bool

transferFrom() 中的第三點,msg.sender 需要被授權才能使用,而授權的 function 就是 approve()

  • 允許 _spender 可以從你的地址中提取最多 _value 的 token。
  • 如果被重複呼叫會重新計算 allowance() 中的 _value

4. allowance(address _owner, address _spender) -> (uint256)

  • 回傳 _spender 可以從 _owner 那取走多少的 token。(有點像紀錄上方 approve() 中剩下的 _value)。
  • 如果是增加既有的 allowance,會利用下面這種方式:
    approve(owner, spender, allowance(owner, spender) + addedValue)

事件

事件的功能大概是(依我目前的了解),是類似於 console.log,或是 printf、cout 等概念,當你 emit 時便會在 console 裡面吐出你寫入的資訊。

Transfer(address _from, address _to, uint256 _value)

  • 在 transfer() 觸發時 emit。

Approval(address indexed _owner, address indexed _spender, uint256 _value)

  • 會在 approve()transferFrom() 觸發時 emit,裡面會有三個參數:owner、spender、value。(見 allowance)

Closing

雖然此篇的結尾停在 ERC20,但 ERC721 有許多功能是從 ERC20 standard 發展而來,因此了解 ERC20 中的函式也是前往開發 NFT 的重要一環!

References


若有文章內有任何錯誤的地方歡迎指點與討論!非常感謝!

歡迎贊助窮困潦倒大學生
0xd8538ea74825080c0c80B9B175f57e91Ff885Cb4


上一篇
【DAY3】- Side Project Breakdown
下一篇
【DAY5】 - ERC721 (Mint Your 1st NFT)
系列文
Road Map To DApp Developer30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
Cuvy Jet
iT邦新手 5 級 ‧ 2022-09-19 23:41:57

ERC20的functions和events解釋部分寫得不錯,滿好懂的

foodchain iT邦新手 3 級 ‧ 2022-09-20 00:57:39 檢舉

感謝!!

我要留言

立即登入留言