作者: 冒志鴻(ArcBlock 執行長、首席架構師)、陳俊(ArcBlock 副總裁)
ArcBlock DevCon 2020[1] 的門票徽章引發了使用者的極大熱情、業界的極大關注,上面是 ArcBlock 社羣使用者用他們貴賓票領到的 NFT 徽章自制的影片。我們借花獻佛,為所有關注支援 ArcBlock 的朋友夥伴送上節日的祝福。與此同時,參加網上駭客馬拉松[2]的開發者朋友和我們團隊則加班加點、用自己參賽 DApps 創意為節日獻禮,為大會劃上圓滿的句號。
我們這次大會發行的門票徽章證書,以及即將頒發的駭客馬拉松徽章證書,都屬於 NFT(Non-Fungible Token,非同質通證)。那麼什麼是 NFT?通證是什麼?和大家耳熟能詳的比特幣、以太坊等加密貨幣有何聯絡和區別?由冒志鴻與陳俊撰寫的、中信出版集團出版、今天才印刷出廠的新書《區塊鏈實戰:從技術創新到商業模式》在第 2 部分《破除迷思,深入瞭解區塊鏈的能力與侷限》第 7 章《加密貨幣、加密資產和通證》專門做了概念介紹和辨析。
毋庸諱言,這幾年來以比特幣為主的各種加密資產及其帶來的財富效應,才是吸引全世界的普通大眾關注瞭解區塊鏈技術的最大動力,在此之前可能還從未有任何一種計算機技術讓如此多的行外人士如此著迷。
誤解一:區塊鏈就是比特幣或數字貨幣。這是一種對區塊鏈技術缺乏基本認識的典型誤解。比特幣、各種加密數字貨幣只是區塊鏈的一種應用,而區塊鏈支援很多種其他的應用。
誤解二:區塊鏈的作用就是用來“發幣”。與誤解一類似,區塊鏈除了用於“發幣”、發通證之外有很多種用途。“發幣”的說法常來自炒作加密貨幣時代的產物。
誤解三:“幣”或“通證”除了用於炒作沒有別的作用。“通證” 有相當多的用途,非常廣範的應用場景,絕大部分割槽塊鏈應用的設計都離不開使用某種形式的通證,即使這些應用不需要使用虛擬貨幣。加密貨幣交易雖然在過去可能是加密貨幣的主要用途,但已經有越來越多的實用專案採用區塊鏈和通證技術。
誤解四:政府要發國家數字貨幣就必須使用區塊鏈。這也是一種誤解,設計和實現一個 Token 並不是非需要區塊鏈不可,完全可以不採用區塊鏈技術。不過在技術發展的今天,採用區塊鏈是一個比較有利的選擇。
誤解五:企業政府必須使用“無幣區塊鏈”。“無幣區塊鏈” 是一種“名詞之爭”,是一些人用於把“區塊鏈技術” 和“幣”劃清界限而炮製的一種不科學的說法,誤導性較強。某種角度而言,幾乎不太存在無幣(通證)的區塊鏈應用場景。“無幣區塊鏈”就好比是“無資料的資料庫”一樣荒唐可笑。
區塊鏈和“幣”
比特幣是世界上第一個區塊鏈,因此毫無疑問,談到區塊鏈是無法迴避數字貨幣的。為了能更好地理解區塊鏈上的幣、通證、數字資產的關係,我們有必要首先深入理解區塊鏈的一些設計以及歷史成因。
在目前流行的區塊鏈設計裡,有兩類常見的設計:UTXO 模型和賬戶模型。無論加密貨幣、通證,還是加密資產等都離不開一個核心問題——在區塊鏈上它們歸屬於誰。而這兩種設計模型就是回答這個問題的基礎。
UTXO 模型
中本聰在比特幣白皮書一開始就引入了“電子硬幣( Electronic Coin)”概念,並把它定義為“一連串的數字簽名(a chain of digital signatures)”,這就是比特幣交易的基礎,可能也是比特幣之所以成為“幣”的原因。
比特幣裡採用了稱為 UTXO(未花費的交易輸出)的交易模型,你可能有所耳聞並在本書其他部分讀到。作為一本非技術的讀物我們不打算仔細講解這一交易模式,但是可將它類比成日常使用的硬幣、紙鈔等現金支付這樣的方式以幫助理解。
假設買一杯奶茶需要支付 32 元,如果用微信錢包、支付寶或銀聯等電子支付的話,那麼非常簡單直接扣除 32 元即可,完全不用擔心零頭的問題,但是拿出現金支付時,就有以下幾種付款找零的情形:
•32 枚 1 元的硬幣,這時候正好不用找零,但大部分時候我們沒帶這麼多硬幣在身上
•3 張 10 元鈔票,外加 2 枚 1 元硬幣,這樣也不需要找零
•4 張 10 元鈔票,店家會給我們 8 枚 1 元硬幣作為找零
•1 張 100 元鈔票,店家給我們 1 張 50 元鈔票,外加一張 10 元鈔票,外加 8 枚 1 元硬幣 ……
UTXO 就是類似於上述現金支付找零這樣的方式,只不過並不是硬幣本身,而是一個“找零”記錄,這個“找零”記錄就被稱為 UTXO。
比特幣這一設計思路是:只記錄交易,不記錄最終狀態,其一個最大的好處就是驗證比較容易,我們仍然用現金消費來理解一下:當我們要買上面那杯 32 元的奶茶的時候,我們看下錢包如果發現所有鈔票硬幣加起來也不足 32 元,我們馬上就知道自己錢不夠,而要知道一圈購買下來還剩多少錢,把錢包裡沒花掉的錢加一下即可。
因此比特幣裡的交易裡不是大家想象的轉賬方式,把 A 的賬戶餘額減少一點,對應把 B 的賬戶餘額增加一點。比特幣的系統裡面並沒有一個“賬戶餘額”的東西存在,你每次在比特幣錢包裡看到的餘額其實是數字錢包根據區塊鏈上的資料(UTXO)計算出來的。從某種角度上來說,在比特幣的系統裡並不真正存在“幣”本身,而只存在 UTXO,“幣”僅僅是計量上的概念。
UTXO 和賬戶餘額的體系相比更復雜,可以表達的狀態和附加資訊更少,擴充套件性不足。但對於比特幣這樣一個以點對點的電子現金為設計目標的系統來說已經足夠,而其高效率、靈活、防止雙花攻擊更容易等優點更為重要。大量基於比特幣程式碼分叉的區塊鏈都是採用了類似做法,而在更關注應用和擴充套件能力的區塊鏈,例如以太坊、Hyperledger Fabric、ArcBlock 等都無一例外還是採用了賬戶模型的設計方式。
賬戶模型
賬戶模型和我們常用的網際網路賬戶、銀行賬戶這些賬戶模型非常接近,因此比較容易理解。你可以把一個使用者的賬戶模型理解成為一組通用的“容器”,其中一種常見的 “容器”叫“計數器”, 這最容易被用來實現“賬戶餘額”。在這種“賬戶餘額”下的交易,就是我們常規理解中的轉賬——每次轉賬交易實際上就是多個參與賬戶之間的數額變化,當然區塊鏈需要保證這些數額是正確的,不會出現雙花攻擊等,以太坊裡的以太幣(ETH)就是這樣實現的。
賬戶就像一組通用容器,意味著賬戶模式非常靈活,一個賬戶可以包含多種不同的“容器”,用來儲存不同的資料,這就意味著一個賬戶裡完全可以有多種不同的“幣種”, 除了這種可以任意分拆按“賬戶餘額”計數的,還可以儲存那些不可分拆的,也可以組合地儲存多種不同的。這就不難理解在以太坊之上,一個賬戶除了有 ETH 餘額,還可以有各種各樣 ERC20 Token 的餘額,實際上還可以儲存各種各樣的資料形態。可程式設計的區塊鏈系統,如以太坊、Hyperledger Fabric、ArcBlock 等賬戶系統都可以支援幾乎可以被應用無限擴充套件的區塊鏈上的資料。
賬戶模型和 UTXO 模型並不矛盾,實際上完全可以直接在賬戶模型下實現和 UTXO 類似的機制,也有一些區塊鏈嘗試把兩者結合起來。不過在 UTXO 模型下想實現類似賬戶的機制也相當麻煩。
Token 命名考源
既然賬戶體系可以儲存如此眾多靈活的資料,開發者按照用途作出一些約定(稱為協議、資料規範、資料格式等)用來表述各種各樣的需求。最先出現的稱呼當然是沿用習慣的 Coin,但由於 Coin 本身在比特幣體系裡已有特定含義,而且在實現機制上又有所不同,因此早期開發者採用了 Token 這個詞。
早期還曾有人用 Asset(資產)來指稱過,比較著名的有染色幣時代的“開放資產協議”(Open Assets Protocol)中使用了 Asset 這個詞。但由於 Asset 這個詞本身表示的“資產”有特定含義,以太坊著名的 ERC20 標準出現時,其規範文件中使用了 Token 來描述這套標準定義。隨著以太坊和 ERC20 標準的流行,Token 成為最為主流的命名。
其實 Token 在英文語境下,尤其在計算機領域裡,是一個經常拿來指代“一團不知道究竟該如何命名的資料”的“萬精油”名詞,因此早期開發者用 Token 來命名一點不奇怪。
Token 這個詞彙在計算機領域常被用於不同的場合表達不同含義:上圖中所示是一個早期著名的網路架構--令牌環網(Token Ring)裡 Token 控制傳送資料的權力。很多計算機應用場合都還有被稱為 Token 的東西,比如 Session Token,Security Token,Access Token、JSON Web Token,CSRF Token 等等,注意他們其實都是不相關的概念,其共性就是一種表示“有特定用處的、獨特不重複的、一小塊的資料”。
Token 這個詞彙在中文世界首先被翻譯成了“代幣”,這基本抹殺了當初英文世界命名者稱其為 Token 的“良苦用心”,不過後來有人建議把它翻譯為“通證”,避免其和“幣”有直接的字面聯絡。
Token 翻譯的“代幣”、“通證”的之爭
區塊鏈語境中,這些權益的英語表達還是都用 Token。當中文要進行翻譯的時候,顯然,“令牌”一詞不能滿足更豐富的含義,加之區塊鏈專案投機蔚然成風,Token 被許多人翻譯成了“代幣”,但是顯然這個翻譯並沒有反映出 Token 一詞在區塊鏈專案裡所代表的準確含義。2018 年,經過國內區塊鏈行業的熱烈討論之後,Token 開始被更多的文章翻譯成“通證”。
2018 年,中關村區塊鏈聯盟理事長元道與 CSDN 副總孟巖認為,Token 應該翻譯成“通證”更為合適。他們認為 Token 就是一種“可流通的加密數字權益證明”。在一個可以執行 Token 的平臺上發行加密數字貨幣,是一件易如反掌的事情。但是直接把 Token 譯為代幣,肯定是錯誤的。因為 Token 所代表的,可以是一切權益證明,甚至是一切憑證,不僅僅是貨幣。但是無論是使用令牌也好,還是代幣也罷,都不能很好的體現出 ICO 之後 Token 處於新階段的角色轉換,因為其擁有了更多的作用,所以創造了一個新詞“通證”。Token 區塊鏈語境下的翻譯從“代幣”改成“通證” 也都是“名詞之爭”。從 Token 究竟翻譯成什麼,我們也可以看出人們根據自己立場觀察技術的心態,雖然 Token 還是那些作用,也仍然是那個英文單詞,但如何稱呼它,其實是根據每個人的看法而不同。喜歡以代幣來稱呼 Token 的,可能更認可更強調 Token 在數字貨幣的價值,而喜歡使用通證這個譯名的人,則認為“通證”才能更全面的反映 Token 實現的多樣化功能。
走出“名詞之爭”
在我看來,讀者完全可以認為區塊鏈領域裡的 Coin(幣)、Token(通證)、Asset(資產)、Cryptocurrency(加密貨幣)、Crypto Token(加密通證)、Crypto Asset(加密資產)是同一類東西,不必在這些名稱裡陷入“名詞之爭”。
比如,說比特幣是一種 Coin(幣)、Token(通證)、Asset(資產)、Cryptocurrency(加密貨幣)、Crypto token(加密通證)、Crypto Asset(加密資產),無論用哪個詞彙指稱它,都對。
在本文的後半部分,我們將用英文的 Token、中文譯名“通證”來表述上述任何一種概念。
絕大部分的區塊鏈應用的核心都圍繞通證
一個資料庫應用的核心是什麼?毫無疑問是“資料”,雖然在偶爾極個別應用場景下,資料庫會用在和資料本身不相關的地方,例如當年著名的網際網路專案 Flickr 曾介紹他們用資料庫來作為一個分散式序號計數器的經驗。一個電子表格應用,比如微軟的 Excel 的核心是什麼?毫無疑問是“電子表格”,雖然有人用 Excel 來作畫,並且在網上引起過小小的轟動。一個區塊鏈應用的核心是什麼,答案就是“通證”。
所有數字貨幣型別的區塊鏈應用,如比特幣等,毫無疑問作為幣的通證就是其全部。而在著名的企業聯盟鏈 Hyperledger Fabric 設計裡,排列其“資產-參與方-交易”模型之首的就是數字資產,一種通證的典型形態,或者另一種叫法。任何使用 DID、可驗證證書技術的應用,本質上都是在使用作為身份的通證和作為證書的通證。讀完本書,你可能會發現通證技術有非常廣範的應用場景,絕大部分割槽塊鏈應用設計都離不開使用某種形式的通證,即使這些應用不需要使用虛擬貨幣。
實際上,基於通證的各種應用是區塊鏈未來最令人激動的地方。正如我在序言裡展望的那樣,未來 10 年裡,區塊鏈技術可能將釋放其巨大的威力,區塊鏈網路將成為像今天的電信網和網際網路一樣的社會基礎架構,基於區塊鏈的各種數字通證會如同今天電子郵件一樣無處不在,以區塊鏈為基礎的應用會如今天的全球資訊網站點和移動應用一樣成為每個人生活中不可缺少的一部分。
為什麼設計實現 Token 需要使用區塊鏈?
首先設計和實現一個 Token 並不是非需要區塊鏈不可。
你沒有看錯,區塊鏈並不是必要的,在區塊鏈誕生和流行之前,人們已經用很多種方式實現了各種各樣類似的數字幣、數字通證的各種功能,被成千上萬人使用。看一看現在的網上銀行、各種航空公司、酒店或商家的里程積分系統、遊戲點卡等等,這些業務已經成熟使用了很多年,這就充分說明沒有區塊鏈不影響這些通證業務成功開展。
那麼,現在需要設計一個使用 Token 的應用需不需要使用區塊鏈技術呢?答案是:Yes!為什麼?因為用區塊鏈技術來定義 Token 是最新的技術進展,比用傳統資料庫的方式更安全、高效、架構成熟。
很多人因為比特幣而知道加密貨幣和通證。在比特幣之前,數字化的貨幣就是密碼學的一個研究分支。密碼學界一直有個夢想:手裡的實物現金能否數字化,透過數字加密技術像發一封電子郵件那樣,直接從某一個數字身份轉移到另外一個數字身份名下?讀者在第一部分第二章“區塊鏈誕生之前”部分了解到的各種密碼學的進步及其應用在 eCash、B-money、BitGold 等探索發明各種數字貨幣。這些創新突破分別透過簽名技術解決了數字貨幣發行者、持有者的身份問題,非對稱加密技術則部分解決了數字貨幣的流通問題,留下的核心難題“雙重花費”問題被 2009 年橫空出世的比特幣用點對點交易、全網記賬和 UTXO 賬戶設計加以解決。
過去使用中心化的系統來實現數字貨幣或通證的功能,需要為安全性、可靠性、可審計性付出巨大的代價。那些小規模移動遊戲裡的積分、虛擬幣系統之所以似乎並沒有花費巨大,只是因為其本身價值還不夠大。
區塊鏈必須有 Token 嗎?
雖然大部分割槽塊鏈系統都預設設計有 Token,但並不是必須的。區塊鏈系統完全可以不設計 Token。例如一些聯盟鏈系統,比如 Hyperledger Fabric、R3 Corda 等通常就沒有包含預設 Token。
我們已經知道 Token 其實只是用來表徵鏈上某種實體的資料而已,那麼區塊鏈作為一種資料庫,只要裡面有資料存在就一定是表徵某個實體,因此這個區塊鏈系統即使不設計 Token,應用如果需要的話也可以在此基礎上再建立出 Token 來。在數字貨幣概念比較受排斥的時候,有一些人提出了所謂“無幣區塊鏈”,可以認為這是另外一種名詞之爭。當你讀完本章或本書對區塊鏈及其應用有更多理解後,會發現絕大部分割槽塊鏈應用設計都離不開使用某種形式的通證,即使這些應用不需要使用虛擬貨幣,因此“無幣區塊鏈”純屬於無稽之談。
比特幣設計時採用了一個有趣的激勵機制,就是給每輪裡成功產生區塊的“礦工”一定數量的比特幣作為獎勵。後來的很多區塊鏈的激勵機制,也使用類似的“挖礦”獎勵 Token 的形式,因此有人認為 Token 和激勵機制是必然的對應關係。其實,這並非必然,只不過在一個區塊鏈上採用鏈上 Token 作為獎勵懲罰機制比較容易實現。區塊鏈上可以設計 Token 但不用於激勵機制,也完全可以設計或使用一個區塊鏈而沒有激勵機制,或者使用其他的方式來作為激勵機制而不使用通證。
同質通證(FT)和非同質通證(NFT)
還有一種劃分方式是按照 Token 是否同質、是否可拆分來區分出兩類不同的 Token:同質通證( Fungible Token,縮寫 FT)和非同質通證(Non-fungible Token,縮寫 NFT)。
同質通證
所謂同質通證就是可以切分,只要數額相等的就意義相同的這種通證。常見的加密貨幣,如比以太幣(ETH),或者各種 ERC20 Token 都屬於同質通證。
舉例而言,我的以太坊賬戶裡原來有 10 枚 ETH,無論經過多少次轉賬後,只要我賬戶裡仍然還有 10 枚 ETH,那麼對我而言這個賬戶餘額就沒有任何變化。也就是任何進進出出的 ETH 都是同質的,使用者在意的僅僅是數量。
非同質通證
非同質通證是獨一無二的,也是不可替代的。例如一張證書、一張門票等,即使他們有同類,甚至非常類似,但每一個都是獨一無二的,而且他們通常也無法被切割拆分。
比如著名的以太坊遊戲加密貓(Cryptokitty)就是使用了 ERC721 標準在以太坊上發行的非同質通證,每隻貓都對應著一個獨一無二的非同質通證。
非質通證有各種各樣的形態,從徽章、證書、會員卡、門票等等都是典型的非同質通證,有著非常豐富的場景
其實如果再細分非質通證的話,還可以有一些更有趣的分類。比如有些通證雖然獨一無二,但屬於同一型別,因此可以為這些通證定義出一個“類”或“模版”,免得每個通證都需要包含相同的資訊浪費區塊鏈資源。比如電影票,大部分票的樣子都差不多,因此可以定義一個電影票公用模版的通證,然後每張票只需要很少的獨特資訊(如場次、座位等)。以太坊上的 ERC1155 標準在 ERC721 上作出延伸,就是解決這樣的非同質但有類和模版的標準。
多個不同的非同質通證有時候也許有需求組合成另外一個通證,一個典型的例子,例如一個情人節的禮物促銷,一個禮包的通證裡包含了兩張電影票,一張停車券,還有一張餐廳消費卡。在以太坊上也有 ERC998 來提供這種組合型的非同質通證的標準。
上面提到的 ERC 標準都是以太坊上的通證標準,需要注意在不同的區塊鏈上通證的格式、協議等目前沒有統一標準。例如在 ArcBlock 的區塊鏈上和非同質通證相關的協議稱為 ABBA 協議(ArcBlock Blockchain Assets Protocol,ArcBlock 區塊鏈資產協議),而在 Algorand 區塊鏈上稱為 ASA(Algorand Standard Assets,Algorand 標準資產)標準。可以預見在未來 Token 協議標準方面的不同會是一個挑戰。
在這個定義下,細心和喜歡思考的讀者可能會想,那麼比特幣和那些使用 UTXO 的幣應該算哪一種呢?我覺得在概念上可以認為符合同質通證,但在其具體實現上又更接近非同質通證,因為每一個 UTXO 都是獨一無二的。這其實也不難理解,想象一下現實中的鈔票,其實每張鈔票都有獨一無二的編號,從鈔票個體而言是非同質的,而對大多數使用鈔票的人而言,大家關心的只是鈔票上的面值數字而已,因此又是同質的。
我們可以看到,很多概念並不是非黑即白,而是要看從哪一個角度去考慮,“中心化”還是“去中心化”、 “同質”還是“非同質”都是如此。