January 25, 2026

Capitalizations Index – B ∞/21M

cryptoZombies 教學 Lesson5-Day12 – Howard Wang – Medium

Cryptozombies 教學 lesson5-day12 – howard wang – medium

cryptoZombies 教學 Lesson5-Day12 – Howard Wang – Medium

Cryptozombies 教學 lesson5-day12 – howard wang – medium

在這堂,我們會解說各種不一定的Token,像常見的ERC20,ERC721以及ERC721x,都懂了之後就能交易我們的殭屍了喔.

Chapter 1: Tokens on Ethereum

相信大家都有在以太上聽過Token, 最常見的ERC20 Token等等.

Token是什麼呢: Token就是一個遵守一些共同規則的智能合約,這句話或許很繞口,不過看看例子,最常見的通常會遵守transferFrom(address _from, address _to, uint256 _tokenId)and balanceOf(address _owner) ,以及在合約內部都會有mapping(address => uint256) balances ,

第一個function 帶有Token從哪來,要給誰,是哪種Token.

第二個function 這個合約擁有者有多少餘額.

還會有個映射來記錄餘額.

所以Token簡單來說就是一個智能合約可以追蹤誰擁有了多少Token以及可以交易這些Token.

Why does it matter?

由於ERC20 Token都擁有一樣名稱的function就可以一樣的方式進行互動.

也就是說你可以自己使用ERC20的技術創造一個Token就可以與任何也用ERC20技術的Token進行交易.並且ERC20都有既定程式碼,只要複製改下Token名稱,你也能創造Token.

亦或是像交易所,可以插入新的Token地址,這樣交易所就能多購買一種Token了

Disadvantage for ERC20

ERC20在Token方面對人們來說是一件很酷的技術,不過以殭屍遊戲的例子來說,卻不是個好工具,大家都知道你可以只購買0.26個ETH,但是卻不能只購買0.49個殭屍吧.

並且不是所有的殭屍都是一樣的吧,你不想你的99等殭屍與1等殭屍做同等交換吧

ERC721 Token

所以這時候就有了一個新的技術稱為ERC721, 他假設每樣Token都是獨特的並且都擁有自己的ID,也就是說不能進行交換,而且要購買時只能一次買走全部而不能只購買一半.這對我們殭屍的交易來說是一件好事

並且使用這樣的規範,我們不用自己識做一個拍賣所,只要我們符合規範,就可以上架在交易平台進行拍賣,統一管理會比我們自己實作來的乾淨明瞭.

Putting it to the Test

這堂課是要實作ERC721的合約

  1. 宣告Solidity版本號
  2. 匯入zombieattack.sol.
  3. 繼承ZombieAttack.

答案如圖1–1

圖1–1

Chapter 2: ERC721 Standard, Multiple Inheritance

我們先來看ERC721的標準

contract ERC721 

可能現在還不是很了解也很繁雜,不過在往後章節我們都會一步一步帶著你實現製作一個ERC721的合約:)

Implementing a token contract

在製作ERC721合約時,都必須匯入ERC721文件,並且多載這些function ,不過妳一定有個疑問,我們原本的合約不是已經繼承上一份合約了嗎,要怎麼在繼承一個呢,在Solidity中,擁有了多重繼承的能力,所以你可以不只繼承一份合約呢(是不是很像我們的殭屍一樣,可以繼承很多食物的能力呢XD)

contract SatoshiNakamoto is NickSzabo, HalFinney 

而語法就像上述所寫,以逗號隔開即可.

Putting it to the Test

  1. 匯入ERC721文件
  2. 繼承ERC721合約

答案如圖2–1

圖2–1

Chapter 3: balanceOf & ownerOf

首先我們要先實作最基本的兩個function ,balanceOf ownerOf

balanceOf :function balanceOf(address _owner) external view returns (uint256 _balance); 將可見度設為external 並且使用view 來返回餘額,還記得為甚麼嗎(Hint:GAS),在殭屍的例子中,為輸入擁有者的地址,返回殭屍數量.

ownerOf: function ownerOf(uint256 _tokenId) external view returns (address _owner); 傳入TokenID,在殭屍的例子中,TokenID為殭屍的ID,返回殭屍的主人.

Putting it to the Test

還記得之前的合約有設置mapping 來儲存殭屍的數量以及擁有者嗎,如果忘記了請去找找zombiefactory.sol

  1. 在合約內實作balanceOf 以及ownerOf

答案如圖3–1

圖3–1

Chapter 4: Refactoring

這裡有個壞消息告訴各位,還記得我們之前有實作過一個modifier 叫做ownerOf 吧,我們在上一章節也引用了ERC721裡的ownerOf function ,這樣當你編譯之後就會產生錯誤,那你會想說,我們更改ERC721裡面的function 名字就好啦,這樣就不符合ERC721的規範,別人也無法以ERC721規範來使用這個合約,所以我們要更改ownerOf modifier 的名字.

Putting it to the Test

  1. zombiefeeding.sol 中的ownerOf modifier 改為onlyOwnerOf.
  2. 將有使用到這modifier 都更改為正確名稱.

答案如圖4–1

圖4–1

Chapter 5: ERC721: Transfer Logic

ERC721中有兩種交易Token的方式.

  1. function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

第一種方式為想賣Token的人會傳入自己的地址,對方的地址,TokenID

  1. function approve(address _approved, uint256 _tokenId) external payable;
  2. function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

第二種方式為賣家先傳自己的地址,對方的地址,TokenID到一個名為approvefunction ,之後用mapping (uint256 => address)儲存被承認的買家地址,買家以及賣家可以去呼叫第二個transferFrom ,而transferFrom 會先驗證你是否在mapping 裡面,如果在mapping 裡面才能取得Token.

第一種通常為Token的擁有者呼叫,而第二種通常為Token的接收者呼叫

Putting it to the Test

讓我們來定義一個 _transfer

  1. 定義ㄧ_transfer function 帶有三個參數address _from, address _to, and uint256 _tokenId 並且將可見度設為private
  2. function 首先要將對方的殭屍數量增加並且減少擁有方的數量
  3. 再來要將殭屍的主人名字改成買方.
  4. 最後因為在ERC721文件中, transfer 為一 event ,所以我們可以使用 emit 將他廣播出來.

答案如圖5–1

圖5–1

Chapter 6: ERC721: Transfer Cont’d

Putting it to the Test

  1. 新增一個mapping(uint => address) zombieApprovals 來儲存可呼叫transferFrom的地址,如果有人呼叫了這個transferFrom function 就可以快速檢查他是否在名單上了
  2. transferFrom 新增require 檢查住址是否為擁有者或是買家地址.
  3. 最後,別忘了呼叫_transfer

答案如圖6–1,6–2

圖6–1
圖6–2

Published at Sun, 24 Feb 2019 13:56:23 +0000

Previous Article

Bitcoin [BTC] worth $300,000 stolen by scammers in email-based “Sextortion” racket |

Next Article

Bitcoin Breaks Down = Retrace (Support Where? $3740 – $3665 Firs

You might be interested in …