張展鵬,張 亮,彭凌祺,闞海斌
(1.復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,上海 200433;2.上海市區(qū)塊鏈工程技術(shù)研究中心,上海 200433;3.上海市智能信息處理重點(diǎn)實(shí)驗(yàn)室,上海 200433;4.上海華虹計(jì)通智能系統(tǒng)股份有限公司,上海 201206)
隨著云計(jì)算技術(shù)的快速發(fā)展,軟件銷售模式正在發(fā)生變化,軟件訂閱和支持(Subscription and Support,S&S)模式將逐漸取代軟件存儲介質(zhì)和產(chǎn)品密鑰封裝銷售模式。S&S 是軟件即服務(wù)(Software as a Service,SaaS)的應(yīng)用模式之一,用戶可以自行下載和安裝軟件,在購買授權(quán)開始使用并根據(jù)意愿選擇續(xù)訂,在軟件訂閱期限內(nèi)可以聯(lián)系銷售商獲得支持和幫助[1],改善了用戶體驗(yàn),提高了用戶自由度。然而,S&S 一般使用中心化形式授權(quán),限制了授權(quán)效率并降低了安全性。如果授權(quán)服務(wù)器被攻擊,則授權(quán)信息會被篡改[2],用戶很可能不能正常使用購買和訂閱的軟件,未經(jīng)授權(quán)的用戶則可以惡意使用和傳播軟件,從而存在盜版隱患。
區(qū)塊鏈?zhǔn)且粋€去中心化數(shù)據(jù)庫,通過分布式同步協(xié)議解決了信任問題,區(qū)塊鏈數(shù)據(jù)具有公開性和不可篡改性[3]。以太坊[4]是一種被廣泛應(yīng)用的區(qū)塊鏈技術(shù),支持可編程節(jié)點(diǎn),開發(fā)者通過編寫和部署智能合約[5]可以使節(jié)點(diǎn)完成指定功能[4]。目前,區(qū)塊鏈不限于作為點(diǎn)對點(diǎn)的電子現(xiàn)金系統(tǒng)提供支付服務(wù)[3],已經(jīng)成為無權(quán)威第三方的可信服務(wù)提供者[6]。以太坊改進(jìn)建議(Ethereum Improvement Proposals,EIP)由以太坊開源社區(qū)提出,改進(jìn)了以太坊的方案并被并入以太坊的官方標(biāo)準(zhǔn)。EIP-721 通過了新代幣標(biāo)準(zhǔn)——非同質(zhì)化代幣(Non-Fungible Token,NFT)。NFT 代表獨(dú)特、不可替換的資產(chǎn),具有唯一且不可分割性,能較好地映射真實(shí)世界的個人財(cái)產(chǎn)、虛擬藏品、資產(chǎn)負(fù)債等[7]。本文將區(qū)塊鏈技術(shù)應(yīng)用到軟件購買和訂閱場景中,基于NFT 的軟件訂閱模型,使真實(shí)世界的軟件購買和訂閱證書映射為NFT,通過NFT 的鑄造、授權(quán)、鑒權(quán)和銷毀實(shí)現(xiàn)軟件使用權(quán)限管理。
在市場經(jīng)濟(jì)背景下,軟件銷售模式從“賣產(chǎn)品”轉(zhuǎn)向“賣服務(wù)”。20 世紀(jì)90 年代,IBM 提出服務(wù)科學(xué)、管理與工程(Service Science,Management and Engineering,SSME)學(xué)科體系。Amazon、Google、Yahoo 等公司紛紛轉(zhuǎn)型成為軟件服務(wù)公司[8],SaaS 快速發(fā)展。SaaS 將應(yīng)用程序當(dāng)成Web 服務(wù)交付,并根據(jù)用戶使用計(jì)劃收費(fèi),該模式推動了軟件銷售中永久許可向訂閱許可的轉(zhuǎn)變。
S&S 是SaaS 的典型代表,用戶可以自行下載和安裝軟件,在完成購買或續(xù)訂后連接服務(wù)器獲得使用授權(quán);用戶向授權(quán)服務(wù)器提交登錄信息,授權(quán)服務(wù)器完成用戶認(rèn)證后向用戶頒發(fā)數(shù)字憑證。在訂閱有效期內(nèi),客戶端使用該數(shù)字憑證請求服務(wù)端資源。軟件訂閱降低了用戶的擁有成本,用戶能自由地使用軟件并始終保持軟件為最新版本。以S&S 模式銷售軟件使銷售商的資金流更平穩(wěn)[9],降低了經(jīng)營管理風(fēng)險[1]。這一方面決定了S&S 容易成為創(chuàng)業(yè)團(tuán)隊(duì)的選擇;另一方面,創(chuàng)業(yè)團(tuán)隊(duì)的安全方案也容易受到客觀條件限制。S&S 依賴中心化的認(rèn)證和授權(quán),假如中心化服務(wù)器被攻擊,用戶認(rèn)證和訂閱信息將可能被篡改,造成軟件資源被盜用[10]。
S&S 模式已在軟件銷售中取得了很大進(jìn)展,然而針對授權(quán)服務(wù)器的攻擊是中心化場景的固有隱患,盜版問題也長期威脅軟件服務(wù)業(yè)。在軟件購買和訂閱的授權(quán)環(huán)節(jié)探索和應(yīng)用去中心化方案將對解決上述問題具有積極作用。
經(jīng)過十余年的發(fā)展,區(qū)塊鏈應(yīng)用領(lǐng)域從可編程貨幣拓展到了可編程金融和可編程社會,已在數(shù)字世界中形成了可信賴、可溯源[11]的生態(tài)系統(tǒng)[12]。區(qū)塊鏈?zhǔn)谴鎯灰讱v史的分布式數(shù)據(jù)庫,全體節(jié)點(diǎn)運(yùn)行共識算法[13-15],根據(jù)結(jié)果將交易歷史儲存在區(qū)塊上。2008 年,中本聰設(shè)計(jì)了一種點(diǎn)對點(diǎn)的電子現(xiàn)金系統(tǒng),首次出現(xiàn)了對區(qū)塊鏈的描述和應(yīng)用。在比特幣網(wǎng)絡(luò)中,區(qū)塊以單鏈表數(shù)據(jù)結(jié)構(gòu)存儲在節(jié)點(diǎn)上。節(jié)點(diǎn)可以參與通過暴力枚舉尋找下一個合法區(qū)塊頭的競爭,俗稱“挖礦”,優(yōu)勝者將獲得比特幣作為獎勵;當(dāng)下一個區(qū)塊被找到時,這個新區(qū)塊會記錄本區(qū)塊全體交易和上一個區(qū)塊的哈希。比特幣的交易歷史是不可篡改的[16],原因是哈希逆運(yùn)算極為困難,即使比特幣網(wǎng)絡(luò)超過50%的計(jì)算能力被作惡者控制,作惡者篡改交易歷史也將付出指數(shù)爆炸的計(jì)算能力,作惡獲利將小于參與“挖礦”的收益[3]。
2013 年,以太坊初創(chuàng)白皮書[4]發(fā)布,被普遍認(rèn)為開啟了區(qū)塊鏈2.0 時代。以太坊是一個公開無需許可的區(qū)塊鏈,實(shí)現(xiàn)了節(jié)點(diǎn)可編程??删幊坦?jié)點(diǎn)的本質(zhì)是一個在以太坊上自動運(yùn)行的去中心化應(yīng)用程序(Decentralized Application,DApp),由Solidity[17]等圖靈完備的高級編程語言實(shí)現(xiàn)[18]。DApp 繼承了以太坊的去中心化、不可篡改、可驗(yàn)證、公開透明[19]等關(guān)鍵特征。智能合約拓展了區(qū)塊鏈的功能,允許開發(fā)者在繼承以太坊關(guān)鍵特征的同時實(shí)現(xiàn)諸多新應(yīng)用。以太坊的應(yīng)用熱點(diǎn)集中于去中心化金融(Decentralized Finance,DeFi)、NFT 等新領(lǐng)域。一些優(yōu)秀的應(yīng)用項(xiàng)目贏得了研究者、開發(fā)者和投資者的青睞,例如去中心化交易所Uniswap、服務(wù)于鏈下數(shù)據(jù)獲取的預(yù)言機(jī)Chainlink、基于NFT 的養(yǎng)貓游戲《以太貓》(CryptoKitties)等。
1.2.1 去中心化金融
DeFi 是指建立在以太坊上的點(diǎn)對點(diǎn)金融基礎(chǔ)設(shè)施[20],主要包括去中心化借貸、區(qū)塊鏈預(yù)言機(jī)(Blockchain Oracle)和去中心化交易所。DeFi 是在以太坊上開發(fā)的成功DApp 之一,處于爆發(fā)式增長期,繼承了以太坊的安全性和透明性,允許任何人或機(jī)構(gòu)隨時隨地開展金融活動。去中心化借貸在理論上不需要身份認(rèn)證,用戶可以借出閑置資金,也可以有抵押或無抵押地借入數(shù)字資產(chǎn),上述數(shù)字資產(chǎn)買賣均須通過合約交互完成。區(qū)塊鏈預(yù)言機(jī)提供了將鏈下數(shù)據(jù)可信地映射到鏈上的機(jī)制[21],已被用來為鏈上金融活動服務(wù),為去中心化借貸提供基準(zhǔn)價格,防止抵押、兌換等價格偏離市場[22]。去中心化交易所是完全匿名的,基礎(chǔ)功能是去中心化借貸,通過引入穩(wěn)定幣、預(yù)言機(jī)等機(jī)制保證交易公平性。
DeFi 的技術(shù)進(jìn)步不僅體現(xiàn)在金融領(lǐng)域,而且證明了一種無權(quán)威第三方、可公開審計(jì)、完全開放的金融架構(gòu)在技術(shù)上是可行的。同時,研究者和學(xué)習(xí)者也應(yīng)該注意到去中心化金融活動是難以被監(jiān)管的,合約安全漏洞、詐騙、非法金融活動等均會威脅DeFi生態(tài)。
1.2.2 非同質(zhì)化代幣
NFT 是在EIP-721 上被提出并通過的以太坊代幣標(biāo)準(zhǔn),也被稱為ERC721 代幣[7]。與ERC721 代幣相對的概念是ERC20 代幣[23],即同質(zhì)化代幣。以太幣(Ether,ETH)是典型的ERC20 代幣。與同質(zhì)化代幣不同,同種NFT 之間不等同也不可互換,每個NFT不可再分也不可合并。NFT 最初的思想是WANG等[24]在2017 年提出的染色代幣設(shè)想,該設(shè)想用染色代幣在比特幣網(wǎng)絡(luò)上表示真實(shí)世界資產(chǎn)。以太坊社區(qū)通過NFT 實(shí)現(xiàn)了在以太坊上映射大量(至少2128個[7])同類資產(chǎn)。為了清晰地展示非同質(zhì)化代幣的特征,本文對ERC721 代幣與ERC20 代幣進(jìn)行了比較,如表1 所示。
表1 ERC721 代幣與ERC20 代幣的比較Table 1 Comparison between ERC721 and ERC20 tokens
第一個被熟知的基于NFT 實(shí)現(xiàn)的以太坊DApp是于2017 年被推出的《以太貓》。以太貓的本質(zhì)是以太坊上的NFT,通過遞增的ID 保證每一只以太貓都是獨(dú)一無二的,即NFT 的tokenId[7],ID 越小的以太貓價值越高。從2017 年起,NFT 促進(jìn)了藝術(shù)品、奢侈品等真實(shí)世界資產(chǎn)的通證化。另外,借助NFT,在以太坊上公開、不可篡改地標(biāo)記票據(jù)、許可證等票證也變得容易實(shí)現(xiàn)。NFT 雖然被廣泛地應(yīng)用于真實(shí)世界資產(chǎn)標(biāo)記上鏈,但是相關(guān)基礎(chǔ)研究及理論體系仍然處于欠缺狀態(tài)[19]。
NFT 從設(shè)計(jì)之初[24]就適合在以太坊上表示真實(shí)世界資產(chǎn),在軟件訂閱場景中銷售商需要大量認(rèn)證和分發(fā)激活令牌。本文設(shè)計(jì)一種基于NFT 的軟件訂閱認(rèn)證系統(tǒng)Smart-Subsc,通過NFT 支持的原生操作[7]對應(yīng)實(shí)現(xiàn)軟件激活和服務(wù)端資源訪問權(quán)限的管理。與傳統(tǒng)的中心化認(rèn)證方案不同,基于NFT 的訂閱認(rèn)證信息存儲在以太坊,具有公開透明性和不可篡改性,這將有助于提升訂閱者與銷售商之間的信任。
針對傳統(tǒng)客戶端-服務(wù)端模式的訂閱和授權(quán)場景中,服務(wù)端在受到攻擊后用戶的授權(quán)信息可能被篡改的問題,Smart-Subsc 將提供解決方案,實(shí)現(xiàn)下列功能:
1)訂閱信息不能被惡意篡改,訂閱者已經(jīng)購買的訂閱不能被攻擊者轉(zhuǎn)讓,也不能被惡意銷毀;被訂閱者取消和到期的訂閱將永久失效,不能被恢復(fù)。
2)訂閱者和銷售商的操作應(yīng)該足夠簡單,訂閱者可以自由地購買,也可以自由地提前取消并獲得退款;銷售商能夠查詢訂閱狀態(tài),激活即將生效的訂閱,在訂閱到期后使訂閱永久失效。
3)軟件訂閱會定期生效,在生效前,訂閱者可以取消訂閱并獲得退款;一旦開始生效,訂閱者將無權(quán)限對訂閱執(zhí)行操作。在訂閱有效期內(nèi),有且僅有銷售商能對訂閱執(zhí)行操作。當(dāng)訂閱到期后,它會永久失效,任何人都不能操作它。在用戶不主動轉(zhuǎn)讓訂閱的前提下,除訂閱者和銷售商外,其他人不能對訂閱執(zhí)行任何操作。另外,訂閱者可以自由地提前訂閱,銷售商只需要定期驗(yàn)證并激活即可。
本文在傳統(tǒng)客戶端-授權(quán)銷售商的基礎(chǔ)上應(yīng)用基于NFT 的智能合約對軟件訂閱進(jìn)行管理。訂閱者可以調(diào)用合約方法完成購買和提前取消,也可以查詢訂閱價格等必要信息;銷售商可以通過合約調(diào)用查詢和按期確認(rèn)訂閱,以及使過期的訂閱永久失效。
圖1 給出了Smart-Subsc 主要功能時序圖。訂閱購買者需要擁有鏈下身份(例如用戶名、電子郵箱)和鏈上身份(即以太坊地址)。在步驟1~步驟3 中,訂閱購買者向軟件銷售商提交自己的鏈上身份,軟件銷售商通過驗(yàn)證訂閱購買者對消息的簽名來確認(rèn)鏈上身份真實(shí)性[25]。在步驟4 和步驟5 中,訂閱者通過與Smart-Subsc 合約交互,在以太坊發(fā)起轉(zhuǎn)賬來購買訂閱,Smart-Subsc 合約會在購買成功后返回訂閱對應(yīng)NFT 的ID。在步驟6 中,訂閱者在鏈下向銷售商發(fā)送消息,提供自己已經(jīng)成功購買的訂閱及其對應(yīng)的tokenId。在步驟7 和步驟8 中,銷售商可以通過與Smart-Subsc 合約交互來驗(yàn)證訂閱者的購買,即驗(yàn)證對應(yīng)NFT 的存在性和擁有者。在步驟9~步驟11中,銷售商可以按期再次驗(yàn)證和激活訂閱者的訂閱,在激活成功后,銷售商向訂閱者頒發(fā)該期軟件訂閱的激活數(shù)字憑證,授權(quán)訂閱者在對應(yīng)期限內(nèi)正常使用軟件。文獻(xiàn)[25]指出通過分發(fā)激活令牌作為使用訂閱軟件的數(shù)字憑證屬于單點(diǎn)登錄(Single Sign On,SSO)場景。在步驟12 和步驟13 中,當(dāng)該期訂閱到期時,銷售商再次與合約交互,銷毀對應(yīng)的NFT,訂閱者也不能再使用過期的令牌訪問軟件資源。
圖1 Smart-Subsc 主要功能時序圖Fig.1 Sequence diagram of the main functions of Smart-Subsc
相比文獻(xiàn)[25]給出的模型中只能通過NFT 余額驗(yàn)證訂閱者是否完成購買最近一期訂閱,本文模型允許訂閱者提前購買任意多期訂閱,也允許訂閱者在任意時候提前取消。另外,本文模型基于NFT 原生支持的操作權(quán)限管理充分實(shí)現(xiàn)了訂閱的按期激活和失效,客觀和完整地將軟件訂閱流程映射到鏈上。本節(jié)的功能設(shè)計(jì)要求訂閱者在鏈上支付以太幣購買訂閱,針對以太幣支付受到以太幣對法定貨幣匯率波動的影響[26],將在下文中討論對應(yīng)的解決方案。
在傳統(tǒng)客戶端-授權(quán)服務(wù)端的基礎(chǔ)上設(shè)計(jì)與實(shí)現(xiàn)了基于NFT 的智能合約,支持訂閱者通過與合約交互完成購買和取消訂閱,銷售商也能通過與合約交互查詢、確認(rèn)、激活訂閱者的有效訂閱,以及使過期訂閱永久失效。Smart-Subsc 智能合約去中心化地管理了全體訂閱的狀態(tài),充分利用了NFT 的特性。
Smart-Subsc 合約存儲了銷售商的服務(wù)端地址server、當(dāng)前訂閱價格 price、取款服務(wù)費(fèi)率serviceFeeRate、下一個NFT 的ID tokenIdMax 和訂閱者余額deposit,具體功能如下:
1)server。在合約構(gòu)造時初始化為合約構(gòu)造者,之后保持不變。
2)price。在合約構(gòu)造時初始化,只能由銷售商更新。
3)serviceFeeRate。在合約構(gòu)造時初始化,只能由銷售商更新;訂閱者在提取余額時會扣除服務(wù)費(fèi)來補(bǔ)償合約支付的轉(zhuǎn)賬手續(xù)費(fèi)。
4)tokenIdMax。初始化為0,每鑄造一個新NFT時遞增;tokenId 是NFT 的唯一標(biāo)識,與訂閱一一對應(yīng)。
5)deposit。構(gòu)造成訂閱者地址到余額的映射,訂閱者支付訂閱的余額會存在合約,訂閱者余額表給出了每個訂閱者的余額;訂閱者可以隨時提取自己的余額。
當(dāng)購買訂閱時,訂閱者可以調(diào)用合約的purchaseSubscription 函數(shù)。購買訂閱實(shí)際上會鑄造(mint)[7]新NFT,tokenId 由遞增的tokenIdMax 指定。另外,新NFT 只會批準(zhǔn)(approve)[7]銷售商的以太坊地址執(zhí)行轉(zhuǎn)賬操作。在購買過程中,訂閱者的余額可以部分或完全抵扣支付金額。算法1 給出了purchaseSubscription 函數(shù)的調(diào)用流程。
算法1purchaseSubscription 函數(shù)調(diào)用
訂閱者只被允許在訂閱生效前取消訂閱,通過調(diào)用合約的cancelSubscription 函數(shù)實(shí)現(xiàn)。取消訂閱實(shí)際上會直接由訂閱者銷毀(burn)[7]對應(yīng)的NFT。在訂閱生效前,訂閱者可以在任何時候銷毀它。
在新的訂閱周期開始時,銷售商將根據(jù)訂閱者的以太坊地址和NFT 的ID 來確認(rèn)訂閱者的訂閱并充當(dāng)NFT 的消費(fèi)者,將對應(yīng)的NFT 轉(zhuǎn)賬給自己。銷售商將通過調(diào)用合約的activateSubscription 函數(shù)激活新的訂閱,activateSubscription 在運(yùn)行前須確認(rèn)NFT 的擁有者是即將訂閱生效的訂閱者,批準(zhǔn)者是銷售商的以太坊賬戶。在訂閱生效且NFT 從訂閱者到銷售商的轉(zhuǎn)賬完成后,訂閱者將無權(quán)再對NFT 做任何操作,即訂閱者不能對已經(jīng)生效的訂閱進(jìn)行取消操作。在訂閱周期結(jié)束時,銷售商會將到期訂閱對應(yīng)的NFT 銷毀,通過調(diào)用合約的expireSubscription 函數(shù)實(shí)現(xiàn)。這樣任何人不能通過惡意篡改使已經(jīng)過期的訂閱重新生效。
在activateSubscription 和expireSubscription 執(zhí)行前,合約會分別檢查訂閱對應(yīng)的NFT是否滿足被激活和被失效的條件,即校驗(yàn)函數(shù)subscriptionNotActivated和subscriptionNotExpired 是否返回真。這樣的校驗(yàn)是通過確認(rèn)NFT 的擁有者(owner)[7]和批準(zhǔn)者(approver)[7]實(shí)現(xiàn)的。算 法2 和算法3 分別給出了subscriptionNotActivated 和subscriptionNotExpired 函數(shù)的調(diào)用流程。
算法2subscriptionNotActivated 函數(shù)調(diào)用
算法3subscriptionNotExpired 函數(shù)調(diào)用
Smart-Subsc 合約為訂閱者提供了余額賬戶,這樣做可以允許訂閱者更加靈活地選擇支付時機(jī)。在購買訂閱時,訂閱者的余額可以用來支付;在取消訂閱時,退款會自動轉(zhuǎn)到訂閱者的余額。訂閱者可以在任意時候通過調(diào)用合約的withdraw 函數(shù)提現(xiàn)余額,從余額賬戶取款到自己的賬戶,退款將被扣除服務(wù)費(fèi)。
另外,Smart-Subsc 合約也提供了基本的查詢函數(shù),支持訂閱者查詢服務(wù)端地址、訂閱價格、服務(wù)費(fèi)率和訂閱者余額。針對合約的管理者,即軟件銷售商,Smart-Subsc 合約提供了updatePrice 和updateServiceFeeRate 函數(shù)分別更新價格和服務(wù)費(fèi)率。
圖2 給出了Smart-Subsc 合約的軟件架構(gòu)。Smart-Subsc 合約通過調(diào)用EIP-721[7]合約實(shí)現(xiàn)了各項(xiàng)功能;訂閱者和銷售商分別與合約交互完成各自的操作,更新價格、服務(wù)費(fèi)率以及激活和使訂閱過期的功能只允許銷售商的以太坊賬戶操作。通過合約提供的余額賬戶deposit,為訂閱付款與訂閱生效之間充分解耦,訂閱者在購買和提前取消操作上具有更高的自由度。由于NFT 的鑄造、轉(zhuǎn)賬和銷毀都通過向以太坊發(fā)送交易完成,訂閱的狀態(tài)改變會被永久且不可篡改地記錄在鏈上,這些訂閱歷史也是可追溯且公開的。
圖2 Smart-Subsc 合約的軟件架構(gòu)Fig.2 Software architecture of Smart-Subsc contract
本文實(shí)現(xiàn)的合約支持以太幣支付。文獻(xiàn)[26]指出:以太幣對真實(shí)世界中貨幣的匯率存在波動性。為了更好地將真實(shí)世界中軟件銷售映射到鏈上,一種可供考慮的方案是支持使用匯率波動更小的數(shù)字貨幣支付。事實(shí)上,Smart-Subsc 可以支持任意ERC20 代幣[23],例如穩(wěn)定幣USDT、DAI 等。穩(wěn)定幣可以更好地將訂閱的真實(shí)世界價值映射到鏈上。雖然穩(wěn)定幣錨定了真實(shí)世界中法定貨幣的價值,但是它并非像以太幣一樣是以太坊賬戶在鏈上發(fā)起交易所必需的。為了使用穩(wěn)定幣支付訂閱,訂閱者通常需要在交易所將以太幣兌換成穩(wěn)定幣,但這會導(dǎo)致額外的手續(xù)費(fèi)開銷。
為了使Smart-Subsc 更好地在鏈上映射鏈下的軟件訂閱銷售,將從系統(tǒng)設(shè)計(jì)的角度討論數(shù)字貨幣與真實(shí)世界中法定貨幣之間的價值映射問題。在2.3 節(jié)中提及直接在合約支持穩(wěn)定幣支付會給訂閱者帶來額外的手續(xù)費(fèi)開銷,這可能從經(jīng)濟(jì)角度限制了其應(yīng)用。
穩(wěn)定幣本身是受信任的機(jī)構(gòu)發(fā)行的代幣,類似地,提供以太幣與法定貨幣之間匯率的區(qū)塊鏈預(yù)言機(jī)也是受信任的第三方服務(wù),它以合約形式被部署在鏈上,充當(dāng)了鏈上數(shù)據(jù)與鏈下信息的中間層。相比支持穩(wěn)定幣支付,應(yīng)用匯率報價預(yù)言機(jī)的方案會根據(jù)以太幣與指定貨幣之間的匯率更新以以太幣為單位的價格,訂閱者在支付交易手續(xù)費(fèi)的同時無須兌換其他數(shù)字貨幣,減輕了經(jīng)濟(jì)負(fù)擔(dān)。文獻(xiàn)[27]對區(qū)塊鏈預(yù)言機(jī)的工作機(jī)制做了總結(jié),一般地,區(qū)塊鏈預(yù)言機(jī)的設(shè)計(jì)模式包括即時讀、發(fā)布-訂閱和請求-響應(yīng)3 種,具體如下:
1)即時讀。實(shí)現(xiàn)方法為數(shù)據(jù)被靜態(tài)存儲在預(yù)言機(jī),通過合約函數(shù)調(diào)用讀取。優(yōu)勢為實(shí)現(xiàn)簡單,用戶幾乎不需要支付手續(xù)費(fèi)。劣勢為以太坊存儲成本高,難以適應(yīng)大規(guī)模數(shù)據(jù),且不適合存儲高頻變化的數(shù)據(jù)。
2)發(fā)布-訂閱。實(shí)現(xiàn)方法為預(yù)言機(jī)以發(fā)送交易的形式廣播數(shù)據(jù),用戶同步以太坊狀態(tài)即接收數(shù)據(jù)。優(yōu)勢為適合高頻變化數(shù)據(jù),用戶沒有額外的網(wǎng)絡(luò)資源開銷。劣勢為發(fā)布者將為每一次數(shù)據(jù)更新發(fā)送的交易支付手續(xù)費(fèi)。
3)請求-響應(yīng)。實(shí)現(xiàn)方法為用戶主動請求預(yù)言機(jī),在與鏈下資源交互獲得結(jié)果后,預(yù)言機(jī)發(fā)送交易,異步返回結(jié)果。優(yōu)勢為充分地發(fā)揮了鏈下資源,例如服務(wù)器磁盤和CPU 在存儲和運(yùn)算時成本較低。劣勢為相比發(fā)布-訂閱,請求-響應(yīng)是有狀態(tài)的,預(yù)言機(jī)需要記錄用戶與請求之間的對應(yīng)關(guān)系,開銷更高。
Smart-Subsc 銷售的軟件訂閱以美元標(biāo)價,需要獲得以太幣(ETH)對美元穩(wěn)定幣(USDT)之間的匯率ETH/USDT,更新以以太幣為單位的價格。由于很多數(shù)字資產(chǎn)交易所會提供受到相關(guān)投資者認(rèn)可的匯率報價,因此假設(shè)Smart-Subsc 找到了一個受信任的匯率報價預(yù)言機(jī),可以從交易所的資金池等渠道獲得相關(guān)投資者共識的ETH/USDT 報價。
ETH/USDT 報價處于實(shí)時變化[26],不適合應(yīng)用即時讀設(shè)計(jì)模式,否則預(yù)言機(jī)會被頻繁更新,導(dǎo)致預(yù)言機(jī)擁有者支付大量手續(xù)費(fèi)。關(guān)于請求-響應(yīng)設(shè)計(jì)模式,客戶端合約獲得ETH/USDT 報價的過程對預(yù)言機(jī)而言無須實(shí)現(xiàn)成有狀態(tài)的,也不涉及鏈下大規(guī)模運(yùn)算,因此請求-響應(yīng)設(shè)計(jì)模式也是不必要的。發(fā)布-訂閱設(shè)計(jì)模式適合用來獲得ETH/USDT 報價:一方面,用戶訂閱的匯率報價完全以交易形式在全網(wǎng)廣播,不存在額外的網(wǎng)絡(luò)資源開銷;另一方面,匯率報價更新是合約在相關(guān)函數(shù)被調(diào)用時主動完成的,軟件銷售商可以根據(jù)匯率變化控制更新時機(jī),主動控制匯率報價更新帶來的手續(xù)費(fèi)開銷。另外,價格更新過程發(fā)生在鏈上,對軟件訂閱者是公開透明的。
Smart-Subsc 合約使用Solidity[17]基 于Truffle 框架[28]開發(fā),由Ganache[28]提供以太坊測試網(wǎng),測試文件遵循Mocha 測試庫[28]標(biāo) 準(zhǔn)。Smart-Subsc 調(diào)用了OpenZeppelin 庫[29]對EIP-721[7]的實(shí)現(xiàn),使用兩兩互異的NFT 表示已購買的軟件訂閱,應(yīng)用NFT 支持的轉(zhuǎn)賬、批準(zhǔn)和銷毀操作實(shí)現(xiàn)訂閱權(quán)限管理,并且開放了Smart-Subsc 的源代碼,參 見https://github.com/KofClubs/Smart-Subsc。針對最近以太幣價格處于高位,以太坊主網(wǎng)中交易手續(xù)費(fèi)價格較高的問題,本文給出解決方案。
與比特幣網(wǎng)絡(luò)[3]類似,以太坊的狀態(tài)轉(zhuǎn)移也是交易驅(qū)動的[4]。對Smart-Subsc 合約,更新價格和服務(wù)費(fèi)率,NFT 的鑄造、轉(zhuǎn)移和銷毀本質(zhì)上均會使以太坊發(fā)生狀態(tài)轉(zhuǎn)移,需要合約函數(shù)的調(diào)用者發(fā)送交易來實(shí)現(xiàn),并支付交易手續(xù)費(fèi)。以太坊的交易手續(xù)費(fèi)以gas 為單位,根據(jù)交易對應(yīng)的以太坊虛擬機(jī)匯編指令計(jì)算得到[6]。全網(wǎng)gas 價格(gasPrice)[4]在不斷變化。一般地,在全網(wǎng)待處理交易(pending transaction)較多時,為了使自己的交易被更快確認(rèn),交易發(fā)起者需要提供更高的gas 價格。
在本地以太坊網(wǎng)絡(luò)測試Smart-Subsc 構(gòu)造函數(shù)(constructor)、updatePrice、updateServiceFeeRate、activate Subscription、expireSubscription、purchaseSubscription、cancelSubscription 和withdraw 對應(yīng)的交易手續(xù)費(fèi)開銷,以gas 為單位。表2 給出了上述合約函數(shù)調(diào)用者為交易支付的手續(xù)費(fèi)開銷范圍。值得注意的是,調(diào)用purchaseSubscription 支付的交易手續(xù)費(fèi)與NFT 鑄造量和訂閱者余額均有關(guān)。
表2 Smart-Subsc 合約函數(shù)調(diào)用開銷Table 2 Call overhead of Smart-Subsc contract function
對Smart-Subsc 合約的部分函數(shù),在不同情形下調(diào)用它們需要的交易手續(xù)費(fèi)是不同的。造成這種差異的主要原因是以太坊的存儲資源珍貴,把零值寫成非零值將帶來更多手續(xù)費(fèi)開銷,把非零值歸零將被退還部分手續(xù)費(fèi)作為激勵[6]。分析造成不同情形下交易手續(xù)費(fèi)差異的原因,參考OpenZeppelin 庫的實(shí)現(xiàn),無論是ERC20 代幣[23]還是ERC721 代幣[7],它們記錄每個以太坊地址對應(yīng)的代幣余額都會使用映射(mapping(address=>uint 256))數(shù)據(jù)類型。當(dāng)代幣合約被構(gòu)造時,余額是初始零值。當(dāng)某個地址被轉(zhuǎn)入第一筆金額時,它的賬戶余額會從零值變成非零值,相比賬戶余額從非零值變成另一個非零值,前者會消耗更多的交易手續(xù)費(fèi)。當(dāng)某次交易后,某個地址的余額被清零時,這筆交易被退還手續(xù)費(fèi),導(dǎo)致實(shí)際的手續(xù)費(fèi)開銷更少[6]。
以太坊虛擬機(jī)在更新映射數(shù)據(jù)類型的值時,會執(zhí)行sstore 指令。當(dāng)32 Byte 的以太坊虛擬機(jī)存儲空間被從零值設(shè)置成非零值時,這步操作(sset)被收取的手續(xù)費(fèi)是20 000 gas;當(dāng)相等長度的存儲空間發(fā)生其他更新,即從非零值到零值或從非零值到另一個非零值時,這步操作(sreset)被收取的手續(xù)費(fèi)是5 000 gas。值得注意的是,當(dāng)32 Byte 的存儲空間被清零時,這步操作(sclear)將被退還15 000 gas,但是每次交易最多被退還一半手續(xù)費(fèi)[6]。
表3 給出了不同情形下調(diào)用purchaseSubscription函數(shù)的交易手續(xù)費(fèi)??梢钥闯觯旱谝淮舞T造NFT 會帶來更多的手續(xù)費(fèi)開銷,因?yàn)镹FT 的ID 是從0 遞增的;在購買過程中,超額支付的部分會被存入余額賬戶,向余額為0 的余額賬戶存款會帶來更多的手續(xù)費(fèi)開銷;如果直接使用余額抵扣購買,那么將余額賬戶清零所需要的交易手續(xù)費(fèi)更少。另外,當(dāng)tokenId不為0 且訂閱者未超額支付時,交易手續(xù)費(fèi)與購買前余額是否為0 無關(guān)。
表3 不同情形下的purchaseSubscription 函數(shù)調(diào)用開銷Table 3 PurchaseSubscription function call overhead under different situations
對其他涉及以太幣和NFT 轉(zhuǎn)賬的合約函數(shù)進(jìn)行類似分析,總結(jié)影響交易手續(xù)費(fèi)的主要因素:
1)訂閱者余額賬戶deposit 是否從0 開始被更新或歸零,更新零值的手續(xù)費(fèi)開銷更高,歸零將節(jié)省手續(xù)費(fèi)。
2)被操作的tokenId 是否為0,鑄造首個NFT 時,總發(fā)行量會由零值變成非零值,會產(chǎn)生更高的手續(xù)費(fèi)開銷。
3)代幣轉(zhuǎn)賬的發(fā)起者在轉(zhuǎn)賬后余額是否為0,接收者在接收前余額是否為0。向余額為0 的賬戶轉(zhuǎn)入代幣將消耗更高的手續(xù)費(fèi);代幣余額歸零將被退還手續(xù)費(fèi)作為獎勵。值得注意的是,銷毀NFT 的本質(zhì)是向零地址轉(zhuǎn)賬[7],是否被首個銷毀也會影響手續(xù)費(fèi)開銷。
4)訂閱者以太幣余額在支付后或退款前是否為0,原理與因素3 類似。
圖3 給出了訂閱者大量購買訂閱且其中一部分被提前取消的場景下,訂閱者和銷售商為每次購買訂閱平均支付的手續(xù)費(fèi)。假設(shè)訂閱者購買了1 000 次訂閱并以不同退訂率提前取消,對于每次購買訂閱,訂閱者平均支付的手續(xù)費(fèi)是87 681~113 345 gas,銷售商平均支付的手續(xù)費(fèi)是0~71 520 gas。當(dāng)購買退訂率變高時,訂閱者將為cancelSubscription 函數(shù)調(diào)用支付額外的手續(xù)費(fèi),這導(dǎo)致平均手續(xù)費(fèi)開銷變高,銷售商需要激活和使過期的訂閱相對變少,合約調(diào)用手續(xù)費(fèi)變低。結(jié)合退訂率分析平均手續(xù)費(fèi)開銷有助于銷售商更好地確定用戶取款的服務(wù)費(fèi)率。在理想狀態(tài)下,訂閱者從合約取款支付的服務(wù)費(fèi)將被銷售商用來支付合約調(diào)用產(chǎn)生的手續(xù)費(fèi)。
圖3 訂閱者和銷售商每次購買訂閱平均支付的手續(xù)費(fèi)與退訂率之間的關(guān)系Fig.3 Relationship between the average transaction fee paid by subscribers and sellers for each subscription purchase and the cancellation rate
本文實(shí)現(xiàn)與測試的Smart-Subsc 合約需要支付以太幣購買訂閱。近期,以太坊主網(wǎng)gas 價格約為50 Gwei,ETH/USDT 匯率也處在歷史高位,這會帶來高昂的手續(xù)費(fèi)開銷。例如,訂閱者購買訂閱將至少支付72 651 gas,折合約75 元。若以2019 年11 月以太坊市場行情來計(jì)算[30],訂閱者購買訂閱支付的手續(xù)費(fèi)為0.13~0.23 元。針對目前市場行情導(dǎo)致的高手續(xù)費(fèi)問題,本文實(shí)現(xiàn)了在鏈下完成訂閱購買并在鏈上存證的方案。相比Smart-Subsc 鏈上實(shí)現(xiàn)和測試的方案,鏈下支付方案有如下改變:1)訂閱者不再使用以太幣來購買軟件訂閱,即鏈下支付方案中訂閱者不再向智能合約轉(zhuǎn)賬;2)訂閱者可以自行在鏈上生成訂閱對應(yīng)的NFT,實(shí)際支付過程在鏈下完成,軟件銷售商需要確認(rèn)訂閱者是否實(shí)際購買了軟件訂閱并確認(rèn)鏈上NFT 的合法性;3)Smart-Subsc 將被部署在以太坊測試網(wǎng)或者私網(wǎng)上,因?yàn)槟壳爸挥幸蕴恢骶W(wǎng)的以太幣具有公認(rèn)的價值,所以在測試網(wǎng)上部署合約并發(fā)起交易消耗的以太幣并不會帶來實(shí)際的經(jīng)濟(jì)負(fù)擔(dān),同時以太坊測試網(wǎng)也是公開透明、不可篡改的。
圖4 給出了Smart-Subsc 鏈上存證和鏈下支付時序圖。該方案不要求訂閱者支付以太幣來購買軟件訂閱,相應(yīng)地,軟件銷售商需要確認(rèn)訂閱者鑄造的NFT 的合法性,即它們是否是軟件訂閱的有效存證。合法性包含兩方面:訂閱者是否已經(jīng)成功地購買了訂閱;訂閱者鑄造的NFT 是否有效。軟件銷售商將有權(quán)直接銷毀無效的NFT。另外,在圖1 的基礎(chǔ)上,圖4 簡化了合約交互的表達(dá)。以太坊測試網(wǎng)與主網(wǎng)不存在功能性差異,Smart-Subsc 能夠在以太坊測試網(wǎng)正常工作,不過這將增加軟件銷售商的管理負(fù)擔(dān),軟件銷售商必須逐一確認(rèn)NFT 作為鏈下交易存證的合法性。
圖4 Smart-Subsc 鏈上存證和鏈下支付時序圖Fig.4 Sequence diagram of Smart-Subsc with on-chain depository and off-chain payment
本文分別為訂閱者和軟件銷售商實(shí)現(xiàn)了與合約交互的Node.js 客戶端,具有文本訂閱者交互界面,使用者可以根據(jù)提示方便地完成鏈上操作。圖5 和圖6 以截屏形式分別給出了訂閱者和軟件銷售商使用Smart-Subsc 提供的客戶端與合約交互的實(shí)例。Smart-Subsc 遵循Mocha 測試庫撰寫了測試文件以測試在不同的使用場景下合約是否工作正常。圖7是測試文件輸出截屏,Smart-Subsc 對每個合約函數(shù)在不同場景下的工作狀態(tài)進(jìn)行驗(yàn)證。Smart-Subsc將NFT 的關(guān)鍵特性,即鑄造、轉(zhuǎn)賬、銷毀和操作權(quán)限管理完整地應(yīng)用在軟件訂閱的特定場景中,提供了對應(yīng)的文本交互界面并通過場景測試。
圖5 訂閱者與Smart-Subsc 的合約交互與購買訂閱截圖Fig.5 Screenshot of contract interaction and subscription purchase of subscriber and Smart-Subsc
圖6 銷售商與Smart-Subsc 的合約交互與確認(rèn)并激活訂閱截圖Fig.6 Screenshot of contract interaction to confirm and activate the subscription of sellers and Smart-Subsc
圖7 Smart-Subsc 通過多種使用場景測試的截圖Fig.7 Screenshot of Smart-Subsc has passed a variety of usage scenarios test
本文基于NFT 的關(guān)鍵特性設(shè)計(jì)與實(shí)現(xiàn)軟件訂閱模型,計(jì)算與討論訂閱者和銷售商的合約調(diào)用開銷。針對當(dāng)前行情下交易手續(xù)費(fèi)相對昂貴的問題,提出鏈上存證和鏈下支付的解決方案,并對現(xiàn)有DeFi 和NFT 研究和應(yīng)用進(jìn)行相關(guān)補(bǔ)充。實(shí)驗(yàn)結(jié)果表明,該模型解決了中心化軟件授權(quán)場景中訂閱信息被篡改造成的盜版問題,實(shí)現(xiàn)了NFT 與軟件訂閱和支持模式的有效結(jié)合。NFT 非常適合表示真實(shí)世界資產(chǎn),后續(xù)可對其在更多資產(chǎn)管理場景中的應(yīng)用進(jìn)行研究。區(qū)塊鏈預(yù)言機(jī)作為服務(wù)于區(qū)塊鏈的可信信息提供者,也將成為未來可編程社會發(fā)展中的熱門研究方向。