
在這堂,我們會解說各種不一定的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的合約
- 宣告Solidity版本號
- 匯入
zombieattack.sol. - 繼承
ZombieAttack.
答案如圖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
- 匯入ERC721文件
- 繼承ERC721合約
答案如圖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嘍
- 在合約內實作
balanceOf以及ownerOf
答案如圖3–1
Chapter 4: Refactoring
這裡有個壞消息告訴各位,還記得我們之前有實作過一個modifier 叫做ownerOf 吧,我們在上一章節也引用了ERC721裡的ownerOf function ,這樣當你編譯之後就會產生錯誤,那你會想說,我們更改ERC721裡面的function 名字就好啦,這樣就不符合ERC721的規範,別人也無法以ERC721規範來使用這個合約,所以我們要更改ownerOf modifier 的名字.
Putting it to the Test
- 將
zombiefeeding.sol中的ownerOf modifier改為onlyOwnerOf. - 將有使用到這
modifier都更改為正確名稱.
答案如圖4–1
Chapter 5: ERC721: Transfer Logic
ERC721中有兩種交易Token的方式.
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
第一種方式為想賣Token的人會傳入自己的地址,對方的地址,TokenID
function approve(address _approved, uint256 _tokenId) external payable;function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
第二種方式為賣家先傳自己的地址,對方的地址,TokenID到一個名為approve 的function ,之後用mapping (uint256 => address)儲存被承認的買家地址,買家以及賣家可以去呼叫第二個transferFrom ,而transferFrom 會先驗證你是否在mapping 裡面,如果在mapping 裡面才能取得Token.
第一種通常為Token的擁有者呼叫,而第二種通常為Token的接收者呼叫
Putting it to the Test
讓我們來定義一個 _transfer 吧
- 定義ㄧ
_transfer function帶有三個參數address _from,address _to, anduint256 _tokenId並且將可見度設為private function首先要將對方的殭屍數量增加並且減少擁有方的數量- 再來要將殭屍的主人名字改成買方.
- 最後因為在ERC721文件中,
transfer為一event,所以我們可以使用emit將他廣播出來.
答案如圖5–1
Chapter 6: ERC721: Transfer Cont’d
Putting it to the Test
- 新增一個
mapping(uint => address) zombieApprovals來儲存可呼叫transferFrom的地址,如果有人呼叫了這個transferFrom function就可以快速檢查他是否在名單上了 - 在
transferFrom新增require檢查住址是否為擁有者或是買家地址. - 最後,別忘了呼叫
_transfer
答案如圖6–1,6–2
Published at Sun, 24 Feb 2019 13:56:23 +0000