天才程式設計師: "開發 CryptoKitties 難不難? 只需掌握這3點..."

買賣虛擬貨幣

來源 | 《以太坊技術詳解與實戰》

作者 | 閆鶯、鄭凱、郭眾鑫

責編 | 喬治

出品 | 區塊鏈大本營(blockchain_camp)

什麼是以太坊上的數字資產?

你在 CryptoKitties 購買的貓咪就是一種數字資產;

那麼,如何發行一種數字資產

其實很簡單。

你只需瞭解以下 3 部分內容:

  • 數字資產的定義及其發行和流通;

  • ERC 20 代幣合約標準;

  • CryptoKitties 及 ERC 721 合約標準。

發行一款 CryptoKitties 簡直是 so easy!還等什麼?學起來吧!(文末有福利,免費送書)

◆ ◆ ◆  ◆ 

以太坊設計目標就是讓各種數字資產以智慧合約的形式執行在以太坊虛擬機器上。目前,在以太坊上的眾多智慧合約之中,應用最為廣泛的是代幣合約(Token Contract)。代幣合約是在以太坊上管理賬戶及其擁有的代幣的智慧合約,實質上可以理解為一張賬戶地址和對應賬戶代幣餘額的對映表。

從某種意義上講,以太坊上的代幣可以被稱為數字資產,記錄資產資料的代幣合約就是一份賬本。代幣既可以表示某一虛擬貨幣的價值,又可以象徵某些實際的物理量,甚至可用於記錄賬戶持有者的信譽值。但歸根結底,以太坊上的數字資產就是指以太坊上代幣合約中記錄的賬戶代幣餘額資料。

與以往搭建由區塊鏈直接記錄的加密貨幣(Cryptocurrency)不同,以太坊上的數字資產(Digital Asset on Ethereum)是記錄在以太坊之上的代幣合約中。一般意義上的加密貨幣,如比特幣、以太幣和萊特幣等,是記錄在賬戶狀態中,直接儲存在區塊內的資料,伴隨“挖礦”等機制發行,並透過交易的方式流通。而數字資產則是以以太坊區塊鏈為平臺,記錄在更高一層的代幣合約中,具體來講是儲存在以太坊交易訊息資料欄位的可執行程式碼中。

數字資產的發行無須經過複雜的“挖礦”程式,代幣合約的建立者可以透過智慧合約定義自己的代幣發行標準,直接在合約程式碼中實現“鑄幣”功能。並且,代幣的流通是透過在以太坊交易中呼叫智慧合約的函式介面進行轉賬,代幣合約建立者同樣可以在這一過程中新增一些自定義的操作。相比之下,以太坊上的數字資產較加密貨幣擁有更高的靈活性,並且其安全性也由以太坊區塊鏈機制和智慧合約程式碼保證。

數字資產的發行和流通

以太坊上的代幣作為一種數字資產,需要有它的發行和流通機制。相較於以太幣等加密貨幣基於 PoW 和 PoS 共識演算法的發行機制以及基於傳送交易進行轉賬的流通機制,以太坊上數字資產的發行和流通更加簡便靈活,相關的操作一般由代幣合約建立者在代幣合約中實現。常見的代幣合約在記錄賬戶及代幣餘額的基礎上,還包含一些基本的數字資產管理操作,如鑄造代幣、銷燬代幣以及代幣轉賬等。

代幣轉賬是代幣合約的一項基本功能,也是數字資產流通功能的具體實現。例如,賬戶 Alice 呼叫合約的轉賬功能函式,向賬戶 Bob 轉入 50 個代幣,此時合約中記錄的 Alice 賬戶餘額減少了 50,而 Bob 賬戶餘額增加了 50。代幣合約透過鑄造代幣和銷燬代幣來增加或減少代幣供應總量,這兩者是數字資產發行和回收功能的具體實現。

當其他賬戶透過向合約轉入以太幣或其他方式呼叫合約鑄造功能時,該代幣合約向賬戶對應的餘額值增加相應數量的代幣,代幣的總供應量也相應增加,完成鑄幣。例如,賬戶 Charlie 呼叫代幣合約的鑄幣功能函式,合約經驗證後在將其餘額增加 50 個代幣,同時代幣總供應量也增加 50 個代幣。

與之類似,賬戶透過呼叫合約的銷燬功能函式,銷燬其賬戶餘額中的代幣,代幣總供應量也相應地減少。但是,通常代幣合約的代幣銷燬功能是透過向特殊的零地址 0x000...0000 中轉入相應數量的代幣來完成,此時 代幣總供應量不會減少。

除了以上的轉賬、鑄幣、銷燬等基本功能,代幣合約還可以加入數字資產的查詢、許可權控制,甚至經濟學公式計算等功能。那麼,功能繁多的代幣智慧合約是否有共同點,或者對代幣合約的基本功能進行一些規範呢?以太坊開發人員在以太坊改進計劃(Ethereum Improvement Proposal,EIP)中提出了 ERC 20 代幣合約標準,為以太坊代幣合約制定了一套標準的介面。

ERC 20 代幣合約標準

ERC 20 代幣合約標準規定了一個以太坊代幣合約所需實現的函式功能和事件記錄。該標準滿足了代幣作為數字資產所必須具備的一些基本功能和要求,如註明代幣名稱、代幣轉賬、本賬戶中允許鏈上第三方使用的代幣限額等。ERC 20 的出現為以太坊上的代幣合約提供了一個標準化的方案,也對以太坊上數字資產的實現進行了一定的規範。ERC 20 標準使得種類繁多的代幣能夠被更多的去中心化應用(DApp)、交易所等相容。

1contract ERC20 {
2stringpublic constant name = "Token Name";
3stringpublic constant symbol = "SYM";
4    uint8 public constant decimals = 18;
5
6function totalSupply() constant returns (uint supply);
7function balanceOf( address who ) constant returns (uintvalue);
8function allowance( address owner, address spender ) constant returns (uint_allowance);
9function transfer( address to, uintvaluereturns (bool ok);
10function transferFrom( address from, address to, uintvaluereturns (bool ok);
11function approve( address spender, uintvaluereturns (bool ok);
12
13eventTransfer( address indexed from, address indexed to, uintvalue);
14eventApproval( address indexed owner, address indexed spender, uintvalue);
15}

ERC 20 標準介面

自 2015 年提出以來,ERC 20 代幣合約標準在以太坊開發社羣的協商下逐步確定。這一標準的出現為 2017 年以太坊合約代幣井噴式發展打下了基礎。

隨著智慧合約和代幣的興起,以及 ERC 20 代幣合約標準的提出,以太坊上湧現出了大量符合 ERC 20 標準的代幣,如 EOSBATREP 等。目前以太坊上市場份額較大的代幣主要是由 DApp 發行的代幣或者開發其他種類區塊鏈之前眾籌而發行的代幣,包括 EOS 代幣BAT 代幣 REP 代幣等。

EOS 代幣

EOS 代幣是由 Daniel Larime 等人開發的 EOS.IO 專案所發行的一種代幣。EOS.IO 是一款新一代的區塊鏈專案,針對以太坊現有的一些問題作出改進。EOS.IO 採用股權委託證明 (DPoS)的共識演算法,提高吞吐量和使用者數量,計劃可支援每秒百萬級別的交易量;將交易延遲降低至數秒,並且擁有凍結功能,更便於專案升級和問題修復。自 2017 年 6 月公佈白皮書並開放眾籌以來,EOS.IO 專案受到廣泛關注,人們將其視為以太坊有力的競爭者。

該專案於 2017 年 9 月釋出了 EOS.IO Dawn 1.0 版本,於 12 月釋出了 Dawn 2.0 版本,截至筆者撰稿時,已完成了 P2P 網路的搭建、匯入創世區塊的測試等開發步驟。此外,該專案透過在以太坊上發行 ERC 20 標準代幣 EOS,目前仍處於眾籌階段,眾籌將於 2018 年 6 月結 束。此後,在 EOS.IO 區塊鏈開發完成正式上線後,以太坊上的 EOS 代幣會透過創世區塊轉移至 EOS 鏈上,以太坊使用者的 EOS 代幣可由此轉換為 EOS 鏈上的數字貨幣。

BAT 代幣

BAT 代幣(Basic Attention Token)是以太坊上一款數字廣告平臺 DApp 在 2017 年 5 月 所發行的一種 ERC 20 代幣。該 DApp 將前端瀏覽器上統計的使用者網頁廣告停留時間換算成使用者的“注意力”(attention),依此轉換成 BAT 代幣的價值,並讓廣告主由此向廣告發行商支付相應的 BAT 代幣。目前該 DApp 支援在 Brave 瀏覽器上實現廣告統計功能,利用以太坊上的 ERC 20 代幣實現了廣告對使用者的吸引力和廣告價值之間的轉化以及廣告實際價值的流通,略去了廣告主、發行商和使用者之間的眾多中間商,以更加透明高效的方式實現數字廣告的升級。

REP 代幣

REP 代幣是由 Augur DApp 專案 2017 年 7 月發行的一種代幣。Augur 是一個用於預測未來事件的、基於以太坊區塊鏈的市場預測平臺,使用者可以透過該平臺對未來的事件進行預測並押注,若預測正確則可以獲得獎勵,否則會有一定的損失。Augur 平臺的智慧合約中包括了一套 ERC 20 標準代幣合約,其代幣 REP 可用於預測過程中的交易。相比於一般的市場預測平臺,Augur 將平臺搭建於以太坊區塊鏈之上,使用智慧合約進行管理,實現了去中心化,更加安全可靠,並且使用符合 ERC 20 標準的 REP 代幣,提高市場交易效率,增強了流通性。

ERC 721 代幣合約標準

除了最為通用的 ERC 20 標準,目前有許多人在此基礎上不斷提出功能更為全面、內容更為細緻的合約標準,如 ERC 721、ERC 223、ERC 644 以及 ERC 677 等。本文將主要介紹 ERC 721 合約標準。

1、標準定義

ERC 721 合約標準規定了一種不可替代的代幣(Non-fungible Token,NFT)的合約介面。此類代幣的最小單位為個,即在 ERC 20 標準中對應小數點位的 decimal 值為零。此類代幣最重要的特點為每一個代幣都是獨一無二的。每一個代幣擁有各自的 _tokenId 標號, 並且可以附上一些各不相同的特徵值,這樣使得每個代幣都是“不可替代”的。ERC 721 代幣合約標準的介面如下。

1contract ERC721 {
2// Required method
3functiontotalSupply()constantreturns(uint256 totalSupply);
4functionbalanceOf(address _owner)constantreturns(uint256 balance);
5functionownerOf(uint256 _tokenId)constantreturns(address owner);
6functionapprove(address _to, uint256 _tokenId);
7functiontakeOwnership(uint256 _tokenId);
8functiontransfer(address _to, uint256 _tokenId);
9
10// Optional method
11functionname()constantreturns(string name);
12functionsymbol()constantreturns(string symbol);
13functiontokenOfOwnerByIndex(address _owner, uint256 _index)constantreturns(uint tokenId);
14functiontokenMetadata(uint256 _tokenId)constantreturns(string infoUrl);
15
16// Events
17    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
18    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
19}

ERC 721 標準繼承了 ERC 20 標準的一些基本功能介面,如 name( )、symbol( )、 totalSupply( )、balanceOf(),以 及 事 件 Transfer( )、Approval( ) 等,並在一些函式,如 transfer( )、approve( ) 中加入了 _tokenId 用以指定特定的代幣。

除此之外,ERC 721 相比於 ERC 20 還新增了一些功能函式。其中,ownerOf( ) 和 tokenOfOwnerByIndex( ) 分別為根據代幣 ID 查詢該代幣的持有者,以及根據持有者及其索引查詢所持有的代幣 ID;ERC 20 中的 transferFrom( ) 方法被更改為 takeOwnership( ),在限額 approve 允許的條件下,交易發起方 msg.sender 呼叫該函式可以將指定 _tokenId 的代幣從他人處轉至自己的賬戶中;tokenMetadata( ) 函式用於檢視代幣的後設資料等,根據代幣的 ID 查詢到一個 URL 格式字串,其中包含這一代幣的名稱、影象和描述等相關資訊。

2、CryptoKitties DApp

近來一款養貓遊戲 CryptoKitties 的 DApp 在以太坊上引起一陣熱潮,上線僅兩週,這款 DApp 便吸引了超過 150 000 名使用者,買賣小貓的交易數額將近 15 000 000 美元,其中使用者所發出的交易數量佔到了以太坊網路中所有交易的 1/4,甚至一度造成了網路堵塞。

在這款 DApp 中,使用者可以飼養、交易一隻只可愛的小貓,每一隻小貓都擁有獨一無二的基因,並且外表也是各不相同。在遊戲中,使用者還可以讓小貓進行繁殖,由不同父母繁育出的後代會產生出全新的基因和外表,這一有趣的特徵吸引了許多以太坊使用者紛紛飼養繁育自己的小貓。實際上,每隻小貓形態各異的特點正是由 ERC 721 合約標準中的“不可替代的代幣”NFT 所實現。

CryptoKitties DApp 是一套以太坊上的智慧合約,其中一隻只各不相同的小貓正是合約中的一個個 NFT 代幣。CryptoKitties 合約應用了 ERC 721 標準定義了小貓代幣,每個小貓代幣擁有獨一無二的 _tokenId,並且包含基因 genes、出生時間 birthTime、父親 matronId、母親 sireId 等資訊。

合約根據 ERC 721 標準實現了 transfer( )、approve( )、ownerOf( ) 和 tokenOfOwner( ) 等函式功能。但該合約中仍保留了加上 _tokenId 後的 transferFrom( ) 函 數,相比 takeOwnership( ) 函式還能夠實現(如向第三方轉賬等)更多的功能。以下是 CryptoKitties 合約中 ERC 721 介面部分的程式碼。

1/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
2/// @author Dieter Shirley <[email protected]> (https://github.com/dete)
3
4contract ERC721 {
5    // Required methods
6functiontotalSupply() public view returns (uint256 total);
7functionbalanceOf(address _owner) public view returns (uint256 balance); functionownerOf(uint256 _tokenId) external view returns (address owner); functionapprove(address _to, uint256 _tokenId) external;
8functiontransfer(address _to, uint256 _tokenId) external;
9functiontransferFrom(address _from, address _to, uint256 _tokenId) external;
10
11    // Events
12    event Transfer(address from, address to, uint256 tokenId);
13    event Approval(address owner, address approved, uint256 tokenId);
14
15    // Optional
16    // functionname() public view returns (string name);
17    // functionsymbol() public view returns (string symbol);
18    // functiontokensOfOwner(address _owner) external view returns (uint256[] tokenIds);
19    // functiontokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);
20
21    // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)
22functionsupportsInterface(bytes4 _interfaceID) external view returns (bool);
23}

相比於普通的數字加密貨幣,以太坊上的數字資產利用了以太坊智慧合約的靈活性,既保持了去中心化和安全等特性,又具有輕量化以及更強的流通性等特點。

更多參考:

https://github.com/cryptocopycats/awesome-cryptokitties

https://github.com/ethereum/EIPs/issues/721

https://dwz.cn/7iPm83ZG

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;