物數(shù)鏈,是融合物聯(lián)網(wǎng)萬(wàn)物互聯(lián)理論與區(qū)塊鏈技術(shù),致力于打造一個(gè)萬(wàn)物互聯(lián)的大數(shù)據(jù)區(qū)塊鏈。傳統(tǒng)物聯(lián)網(wǎng)運(yùn)行平臺(tái)采用中心化技術(shù),不管在數(shù)據(jù)采集或運(yùn)行上都基于物聯(lián)網(wǎng)參與的任何一方都是盡職盡責(zé)的前提,由于信任機(jī)制發(fā)展緩慢,嚴(yán)重阻礙了物聯(lián)網(wǎng)市場(chǎng)的發(fā)展。。針對(duì)物聯(lián)網(wǎng)過程中出現(xiàn)的問題,物數(shù)鏈重點(diǎn)圍繞區(qū)塊鏈技術(shù)應(yīng)用于物聯(lián)網(wǎng)行業(yè)所面臨的數(shù)據(jù)獲取、數(shù)據(jù)并發(fā)、數(shù)據(jù)并存問題,結(jié)合區(qū)塊鏈—物聯(lián)網(wǎng)—大數(shù)據(jù),構(gòu)建新一代物聯(lián)網(wǎng)體系架構(gòu)。
物數(shù)鏈將物聯(lián)網(wǎng)參與方在每一個(gè)環(huán)節(jié)的數(shù)據(jù)加以儲(chǔ)存,實(shí)現(xiàn)資產(chǎn)化轉(zhuǎn)化。同時(shí),物數(shù)鏈借助區(qū)塊鏈的特點(diǎn),為基礎(chǔ)數(shù)據(jù)建立了一個(gè)基于技術(shù)的信任體系。在物數(shù)鏈中,由于具有不可篡改性和可追溯性,參與者對(duì)于交易公平機(jī)制有絕對(duì)的信任,保障了交易的正常運(yùn)行。
物數(shù)鏈與區(qū)塊鏈技術(shù)高度耦合
1 物數(shù)鏈
物數(shù)鏈的目的是基于鏈上元協(xié)議(on-chain meta-protocol)、腳本、智能合約、跨鏈協(xié)同、分布式儲(chǔ)存概念進(jìn)行整合和提高,使得開發(fā)者能夠創(chuàng)建任意的基于共識(shí)的、可擴(kuò)展的、標(biāo)準(zhǔn)化的、特性完備的、易于開發(fā)的和協(xié)同的數(shù)據(jù)展現(xiàn)及數(shù)據(jù)儲(chǔ)存平臺(tái)。通過建立終極的抽象的基礎(chǔ)層-內(nèi)置有圖靈完備編程語(yǔ)言的區(qū)塊鏈-使得任何人都能夠創(chuàng)建合約和去中心化應(yīng)用,并在其中設(shè)立他們自由定義的所有權(quán)規(guī)則、交易方式和狀態(tài)轉(zhuǎn)換函數(shù)。
2 物數(shù)鏈賬戶
在賬戶系統(tǒng)中,狀態(tài)是由被稱為“賬戶”(每個(gè)賬戶由一個(gè) 20 字節(jié)的地址)的對(duì)象和在兩個(gè)賬戶之間轉(zhuǎn)移價(jià)值和信息的狀態(tài)轉(zhuǎn)換構(gòu)成的。LDBC 的賬戶包含四個(gè)部分:
? 隨機(jī)數(shù),用于確定每筆交易只能被處理一次的計(jì)數(shù)器
? 賬戶目前的余額
? 賬戶的合約代碼
? 賬戶的存儲(chǔ)(默認(rèn)為空)
LDBC 是物數(shù)鏈內(nèi)部的主要加密燃料,用于支付交易費(fèi)用。一般而言,有兩種類型的賬戶:外部所有的賬戶(由私鑰控制的)和合約賬戶(由合約代碼控制)。
外部所有的賬戶沒有代碼,人們可以通過創(chuàng)建和簽名一筆交易從一個(gè)外部賬戶發(fā)送消息。每當(dāng)合約賬戶收到一條消息,合約內(nèi)部的代碼就會(huì)被激活,允許它對(duì)內(nèi)部存儲(chǔ)進(jìn)行讀取和寫入,和發(fā)送其它消息或者創(chuàng)建合約。
3 消息和交易
第一,消息可以由外部實(shí)體或者合約創(chuàng)建,然而比特幣的交易只能從外部創(chuàng)建。第二,消息可以選擇包含數(shù)據(jù)。第三,如果消息的接受者是合約賬戶,可以選擇進(jìn)行回應(yīng),這意味著物數(shù)鏈消息也包含函數(shù)概念。
物數(shù)鏈中“交易”是指存儲(chǔ)從外部賬戶發(fā)出的消息的簽名數(shù)據(jù)包。交易包含消息的接收者、用于確認(rèn)發(fā)送者的簽名、幣賬戶余額、要發(fā)送的數(shù)據(jù)和兩個(gè)被稱為STARTGAS 和 GASPRICE 的數(shù)值。為了防止代碼的指數(shù)型爆炸和無(wú)限循環(huán),每筆交易需要對(duì)執(zhí)行代碼所引發(fā)的計(jì)算步驟-包括初始消息和所有執(zhí)行中引發(fā)的消息-做出限制。STARTGAS 就是限制,GASPRICE 是每一計(jì)算步驟需要支付礦工的費(fèi)用。如果執(zhí)行交易的過程中,“用完了燃料”,所有的狀態(tài)改變恢復(fù)原狀態(tài),但是已經(jīng)支付的交易費(fèi)用不可收回了。如果執(zhí)行交易中止時(shí)還剩余燃料,那么這些燃料將退還給發(fā)送者。創(chuàng)建合約有單獨(dú)的交易類型和相應(yīng)的消息類型;合約的地址是基于賬號(hào)隨機(jī)數(shù)和交易數(shù)據(jù)的哈希計(jì)算出來(lái)的。
消息機(jī)制的一個(gè)重要后果是物數(shù)鏈的“頭等公民”財(cái)產(chǎn)-合約與外部賬戶擁有同樣權(quán)利,包括發(fā)送消息和創(chuàng)建其它合約的權(quán)利。這使得合約可以同時(shí)充當(dāng)多個(gè)不同的角色,例如,用戶可以使去中心化組織(一個(gè)合約)的一個(gè)成員成為一個(gè)中介賬戶(另一個(gè)合約),為一個(gè)偏執(zhí)的使用定制的基于量子證明的蘭波特簽名(第三個(gè)合約)的個(gè)人和一個(gè)自身使用由五個(gè)私鑰保證安全的賬戶(第四個(gè)合約)的共同簽名實(shí)體提供居間服務(wù)。物數(shù)鏈不需要關(guān)心合約的每一參與方是什么類型的賬戶。
4 物數(shù)鏈狀態(tài)轉(zhuǎn)換函數(shù)
物數(shù)鏈狀態(tài)轉(zhuǎn)換函數(shù):APPLY(S,TX) -》 S’,可以定義如下:
1 檢查交易的格式是否正確(即有正確數(shù)值)、簽名是否有效和隨機(jī)數(shù)是否與發(fā)送者賬戶的隨機(jī)數(shù)匹配。如否,返回錯(cuò)誤。
2 計(jì)算交易費(fèi)用:fee=STARTGAS * GASPRICE,并從簽名中確定發(fā)送者的地址。從發(fā)送者的賬戶中減去交易費(fèi)用和增加發(fā)送者的隨機(jī)數(shù)。如果賬戶余額不足,返回錯(cuò)誤。
3 設(shè)定初值 GAS = STARTGAS,并根據(jù)交易中的字節(jié)數(shù)減去一定量的燃料值。
4 從發(fā)送者的賬戶轉(zhuǎn)移價(jià)值到接收者賬戶。如果接收賬戶還不存在,創(chuàng)建此賬戶。如果接收賬戶是一個(gè)合約,運(yùn)行合約的代碼,直到代碼運(yùn)行結(jié)束或者燃料用完。
5 如果因?yàn)榘l(fā)送者賬戶沒有足夠的錢或者代碼執(zhí)行耗盡燃料導(dǎo)致價(jià)值轉(zhuǎn)移失敗,恢復(fù)原來(lái)的狀態(tài),但是還需要支付交易費(fèi)用,交易費(fèi)用加至礦工賬戶。
6 否則,將所有剩余的燃料歸還給發(fā)送者,消耗掉的燃料作為交易費(fèi)用發(fā)送給礦工。
例如,假設(shè)合約的代碼如下:
if !contract.storage[msg.data[0]]:
contract.storage[msg.data[0]] = msg.data[1]
需要注意的是,在現(xiàn)實(shí)中合約代碼是用底層虛擬機(jī)代碼寫成的。假設(shè)合約存儲(chǔ)器開始時(shí)是空的,一個(gè)值為 10 個(gè)幣,燃料為 2000,燃料價(jià)格為 0.001 個(gè)幣并且兩個(gè)數(shù)據(jù)字段值為[ 2, ‘CHARLIE’ ] [3]的交易發(fā)送后,狀態(tài)轉(zhuǎn)換函數(shù)的處理過程如下:
1 檢查交易是否有效、格式是否正確。
2 檢查交易發(fā)送者至少有 2000*0.001=2 個(gè)幣。如果有,從發(fā)送者賬戶中減去 2個(gè)幣。
3 初始設(shè)定 gas=2000,假設(shè)交易長(zhǎng)為 170 字節(jié),每字節(jié)的費(fèi)用是 5,減去 850,所以還剩 1150。
4 從發(fā)送者賬戶減去 10 個(gè)幣,為合約賬戶增加 10 個(gè)幣。
5 運(yùn)行代碼。在這個(gè)合約中,運(yùn)行代碼很簡(jiǎn)單:它檢查合約存儲(chǔ)器索引為 2 處是否已使用,注意到它未被使用,然后將其值置為 CHARLIE。假設(shè)這消耗了 187 單位的燃料,于是剩余的燃料為 1150 – 187 = 963。
6. 向發(fā)送者的賬戶增加 963*0.001=0.963 個(gè)幣,返回最終狀態(tài)。
如果沒有合約接收交易,那么所有的交易費(fèi)用就等于 GASPRICE 乘以交易的字節(jié)長(zhǎng)度,交易的數(shù)據(jù)就與交易費(fèi)用無(wú)關(guān)了。另外,需要注意的是,合約發(fā)起的消息可以對(duì)它們產(chǎn)生的計(jì)算分配燃料限額,如果子計(jì)算的燃料用完了,它只恢復(fù)到消息發(fā)出時(shí)的狀態(tài)。因此,就像交易一樣,合約也可以通過對(duì)它產(chǎn)生的子計(jì)算設(shè)置嚴(yán)格的限制,保護(hù)它們的計(jì)算資源。
5 代碼執(zhí)行
物數(shù)鏈合約的代碼使用低級(jí)的基于堆棧的字節(jié)碼的語(yǔ)言寫成的,被稱為“物數(shù)鏈虛擬機(jī)代碼”。代碼由一系列字節(jié)構(gòu)成,每一個(gè)字節(jié)代表一種操作。一般而言,代碼執(zhí)行是無(wú)限循環(huán),程序計(jì)數(shù)器每增加一(初始值為零)就執(zhí)行一次操作,直到代碼執(zhí)行完畢或者遇到錯(cuò)誤,STOP 或者 RETURN 指令。操作可以訪問三種存儲(chǔ)數(shù)據(jù)的空間:
●堆棧,一種后進(jìn)先出的數(shù)據(jù)存儲(chǔ),32 字節(jié)的數(shù)值可以入棧,出棧。
●內(nèi)存,可無(wú)限擴(kuò)展的字節(jié)隊(duì)列。
●合約的長(zhǎng)期存儲(chǔ),一個(gè)秘鑰/數(shù)值的存儲(chǔ),其中秘鑰和數(shù)值都是 32 字節(jié)大小,與計(jì)算結(jié)束即重置的堆棧和內(nèi)存不同,存儲(chǔ)內(nèi)容將長(zhǎng)期保持。
代碼可以象訪問區(qū)塊頭數(shù)據(jù)一樣訪問數(shù)值,發(fā)送者和接受到的消息中的數(shù)據(jù),代碼還可以返回?cái)?shù)據(jù)的字節(jié)隊(duì)列作為輸出。
虛擬機(jī)代碼的正式執(zhí)行模型令人驚訝地簡(jiǎn)單。當(dāng)物數(shù)鏈虛擬機(jī)運(yùn)行時(shí),它的完整的計(jì)算狀態(tài)可以由元組(block_state, transaction, message, code, memory, stack, pc, gas)來(lái)定義,這里 block_state 是包含所有賬戶余額和存儲(chǔ)的全局狀態(tài)。每輪執(zhí)行時(shí),通過調(diào)出代碼的第 pc(程序計(jì)數(shù)器)個(gè)字節(jié),當(dāng)前指令被找到,每個(gè)指令都有定義自己如何影響元組。例如,ADD 將兩個(gè)元素出棧并將它們的和入棧,將 gas(燃料)減一并將 pc 加一,SSTORE 將頂部的兩個(gè)元素出棧并將第二個(gè)元素插入到由第一個(gè)元素定義的合約存儲(chǔ)位置,同樣減少最多 200 的 gas 值并將 pc 加一,雖然有許多方法通過即時(shí)編譯去優(yōu)化,但物數(shù)鏈的基礎(chǔ)性的實(shí)施可以用幾百行代碼實(shí)現(xiàn)。
6 區(qū)塊鏈和挖礦
雖然有一些不同,但物數(shù)鏈的區(qū)塊鏈在很多方面類似于比特幣區(qū)塊鏈。它們的區(qū)塊鏈架構(gòu)的不同在于,物數(shù)鏈區(qū)塊不僅包含交易記錄和最近的狀態(tài),還包含區(qū)塊序號(hào)和難度值。物數(shù)鏈中的區(qū)塊確認(rèn)算法如下:
1 檢查區(qū)塊引用的上一個(gè)區(qū)塊是否存在和有效。
2 檢查區(qū)塊的時(shí)間戳是否比引用的上一個(gè)區(qū)塊大,而且小于 2 分鐘。
3 檢查區(qū)塊序號(hào)、難度值、 交易根,叔根和燃料限額(許多以太坊特有的底層概念)是否有效。
4 檢查區(qū)塊的工作量證明是否有效。
5 將 S[0]賦值為上一個(gè)區(qū)塊的 STATE_ROOT。
6 將 TX 賦值為區(qū)塊的交易列表,一共有 n 筆交易。對(duì)于屬于 0……n-1 的 i,進(jìn)行狀態(tài)轉(zhuǎn)換 S[i+1] = APPLY(S[i],TX[i])。如果任何一個(gè)轉(zhuǎn)換發(fā)生錯(cuò)誤,或者程序執(zhí)行到此處所花費(fèi)的燃料(gas)超過了 GASLIMIT,返回錯(cuò)誤。
7 用 S[n]給 S_FINAL 賦值, 向礦工支付區(qū)塊獎(jiǎng)勵(lì)。
8 檢查 S-FINAL 是否與 STATE_ROOT 相同。如果相同,區(qū)塊是有效的。否則,區(qū)塊是無(wú)效的。
物數(shù)鏈確認(rèn)效率遠(yuǎn)超比特幣相提并論。原因是狀態(tài)存儲(chǔ)在樹結(jié)構(gòu)中(tree structure),每增加一個(gè)區(qū)塊只需要改變樹結(jié)構(gòu)的一小部分。因此,一般而言,兩個(gè)相鄰的區(qū)塊的樹結(jié)構(gòu)的大部分應(yīng)該是相同的,因此存儲(chǔ)一次數(shù)據(jù),可以利用指針(即子樹哈希)引用兩次。一種被稱為“帕特里夏樹”(“Patricia Tree”)的樹結(jié)構(gòu)可以實(shí)現(xiàn)這一點(diǎn),其中包括了對(duì)默克爾樹概念的修改,不僅允許改變節(jié)點(diǎn),而且還可以插入和刪除節(jié)點(diǎn)。
應(yīng)用一般來(lái)講,物數(shù)鏈之上一個(gè)完美的例子是為解決物流信息共享問題而設(shè)的自我強(qiáng)制懸賞。通過獨(dú)創(chuàng)的環(huán)形計(jì)算(annular calculate)將數(shù)據(jù)分享做成一個(gè)標(biāo)準(zhǔn)化共識(shí),改進(jìn)區(qū)塊鏈的識(shí)別和共識(shí)獎(jiǎng)勵(lì)。
7 改進(jìn)版幽靈協(xié)議
幽靈協(xié)議提出的動(dòng)機(jī)是當(dāng)前快速確認(rèn)的塊鏈因?yàn)閰^(qū)塊的高作廢率而受到低安全性困擾;因?yàn)閰^(qū)塊需要花一定時(shí)間(設(shè)為 t)擴(kuò)散至全網(wǎng),如果礦工 A 挖出了一個(gè)區(qū)塊然后礦工 B 碰巧在 A 的區(qū)塊擴(kuò)散至 B 之前挖出了另外一個(gè)區(qū)塊,礦工 B 的區(qū)塊就會(huì)作廢并且沒有對(duì)網(wǎng)絡(luò)安全作出貢獻(xiàn)。此外,這里還有中心化問題:如果 A 是一個(gè)擁有全網(wǎng) 30%算力的礦池而 B 擁有 10%的算力,A 將面臨 70%的時(shí)間都在產(chǎn)生作廢區(qū)塊的風(fēng)險(xiǎn)而 B 在 90%的時(shí)間里都在產(chǎn)生作廢區(qū)塊。因此,如果作廢率高,A 將簡(jiǎn)單地因?yàn)楦叩乃懔Ψ蓊~而更有效率,綜合這兩個(gè)因素,區(qū)塊產(chǎn)生速度快的塊鏈很可能導(dǎo)致一個(gè)礦池?fù)碛袑?shí)際上能夠控制挖礦過程的算力份額。通過在計(jì)算哪條鏈“最長(zhǎng)”的時(shí)候把廢區(qū)塊也包含進(jìn)來(lái),幽靈協(xié)議解決了降低網(wǎng)絡(luò)安全性的第一個(gè)問題;這就是說(shuō),不僅一個(gè)區(qū)塊的父區(qū)塊和更早的祖先塊,祖先塊的作廢的后代區(qū)塊也被加進(jìn)來(lái)以計(jì)算哪一個(gè)區(qū)塊擁有支持其的最大工作量證明。物數(shù)鏈付給以“叔區(qū)塊”身份為新塊確認(rèn)作出貢獻(xiàn)的廢區(qū)塊 87.5%的獎(jiǎng)勵(lì),把它們納入計(jì)算的“侄子區(qū)塊” 將獲得獎(jiǎng)勵(lì)的 12.5%,不過,交易費(fèi)用不獎(jiǎng)勵(lì)給叔區(qū)塊。
物數(shù)鏈實(shí)施了一個(gè)只下探到第五層的簡(jiǎn)化版本的幽靈協(xié)議。其特點(diǎn)是,廢區(qū)塊只能以叔區(qū)塊的身份被其父母的第二代至第五代后輩區(qū)塊,而不是更遠(yuǎn)關(guān)系的后輩區(qū)塊(例如父母區(qū)塊的第六代后輩區(qū)塊,或祖父區(qū)塊的第三代后輩區(qū)塊)納入計(jì)算。這樣做有幾個(gè)原因。首先,無(wú)條件的幽靈協(xié)議將給計(jì)算給定區(qū)塊的哪一個(gè)叔區(qū)塊合法帶來(lái)過多的復(fù)雜性。其次,帶有物數(shù)鏈所使用的補(bǔ)償?shù)臒o(wú)條件的幽靈協(xié)議剝奪了礦工在主鏈而不是一個(gè)公開攻擊者的鏈上挖礦的激勵(lì)。最后,計(jì)算表明帶有激勵(lì)的五層幽靈協(xié)議即使在出塊時(shí)間為 15s 的情況下也實(shí)現(xiàn)了了 95%以上的效率,而擁有 25%算力的礦工從中心化得到的益處小于 3%。
費(fèi)用因?yàn)槊總€(gè)發(fā)布到區(qū)塊鏈的交易都占用了下載和驗(yàn)證的成本,需要有一個(gè)包括交易費(fèi)的規(guī)范機(jī)制來(lái)防范濫發(fā)交易。比特幣使用的默認(rèn)方法是純自愿的交易費(fèi)用,依靠礦工擔(dān)當(dāng)守門人并設(shè)定動(dòng)態(tài)的最低費(fèi)用。因?yàn)檫@種方法是“基于市場(chǎng)的”,使得礦工和交易發(fā)送者能夠按供需來(lái)決定價(jià)格,所以這種方法在比特幣社區(qū)被很順利地接受了。然而,這個(gè)邏輯的問題在于,交易處理并非一個(gè)市場(chǎng);雖然根據(jù)直覺把交易處理解釋成礦工給發(fā)送者提供的服務(wù)是很有吸引力的,但事實(shí)上一個(gè)礦工收錄的交易是需要網(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)處理的,所以交易處理中最大部分的成本是由第三方而不是決定是否收錄交易的礦工承擔(dān)的。于是,非常有可能發(fā)生公地悲劇。
然而,當(dāng)給出一個(gè)特殊的不夠精確的簡(jiǎn)化假設(shè)時(shí),這個(gè)基于市場(chǎng)的機(jī)制的漏洞很神奇地消除了自己的影響。論證如下。假設(shè):
1 一個(gè)交易帶來(lái) k 步操作, 提供獎(jiǎng)勵(lì) kR 給任何收錄該交易的礦工,這里 R 由交易發(fā)布者設(shè)定, k 和 R 對(duì)于礦工都是事先(大致上)可見的。
2 每個(gè)節(jié)點(diǎn)處理每步操作的成本都是 C (即所有節(jié)點(diǎn)的效率一致)。
3 有 N 個(gè)挖礦節(jié)點(diǎn),每個(gè)算力一致(即全網(wǎng)算力的 1/N)。
4 沒有不挖礦的全節(jié)點(diǎn)。
當(dāng)預(yù)期獎(jiǎng)勵(lì)大于成本時(shí),礦工愿意挖礦。這樣,因?yàn)榈V工有 1/N 的機(jī)會(huì)處理下一個(gè)區(qū)塊,所以預(yù)期的收益是 kR/N , 礦工的處理成本簡(jiǎn)單為 kC. 這樣當(dāng) kR/N 》kC,即 R 》 NC 時(shí)。礦工愿意收錄交易。注意 R 是由交易發(fā)送者提供的每步費(fèi)用,是礦工從處理交易中獲益的下限。 NC 是全網(wǎng)處理一個(gè)操作的成本。所以,礦工僅有動(dòng)機(jī)去收錄那些收益大于成本的交易。
然而,這些假設(shè)與實(shí)際情況有幾點(diǎn)重要的偏離:
1.因?yàn)轭~外的驗(yàn)證時(shí)間延遲了塊的廣播因而增加了塊成為廢塊的機(jī)會(huì),處理交易的礦工比其它的驗(yàn)證節(jié)點(diǎn)付出了更高的成本。
2.不挖礦的全節(jié)點(diǎn)是存在的。
3.實(shí)踐中算力分布可能最后是極端不平均的。
4.以破壞網(wǎng)絡(luò)為己任的投機(jī)者,政敵和瘋子確實(shí)存在,并且他們能夠聰明地設(shè)置合同使得他們的成本比其它驗(yàn)證節(jié)點(diǎn)低得多。
上面第 1 點(diǎn)驅(qū)使礦工收錄更少的交易,第 2 點(diǎn)增加了 NC; 因此這兩點(diǎn)的影響至少部分互相抵消了。 第 3 點(diǎn)和第 4 點(diǎn)是主要問題;作為解決方案我們簡(jiǎn)單地建立了一個(gè)浮動(dòng)的上限:沒有區(qū)塊能夠包含比 BLK_LIMIT_FACTOR 倍長(zhǎng)期指數(shù)移動(dòng)平均值更多的操作數(shù)。具體地:
blk.oplimit = floor((blk.parent.oplimit * (EMAFACTOR – 1) + floor(parent.opcount* BLK_LIMIT_FACTOR)) /EMA_FACTOR) BLK_LIMIT_FACTOR 和 EMA_FACTOR 是暫且被設(shè)為 65536 和 1.5 的常數(shù),但可能會(huì)在更深入的分析后調(diào)整。
8 計(jì)算和圖靈完備
需要強(qiáng)調(diào)的是物數(shù)鏈虛擬機(jī)是圖靈完備的; 這意味著虛擬機(jī)代碼可以實(shí)現(xiàn)任何可以想象的計(jì)算,包括無(wú)限循環(huán)。物數(shù)鏈虛擬機(jī)代碼有兩種方式實(shí)現(xiàn)循環(huán)。首先,JUMP 指令可以讓程序跳回至代碼前面某處,還有允許如 while x 《 27: x = x * 2 一樣的條件語(yǔ)句的 JUMPI 指令實(shí)現(xiàn)條件跳轉(zhuǎn)。其次,合約可以調(diào)用其它合約,有通過遞歸實(shí)現(xiàn)循環(huán)的潛力。這很自然地導(dǎo)致了一個(gè)問題:惡意用戶能夠通過迫使礦工和全節(jié)點(diǎn)進(jìn)入無(wú)限循環(huán)而不得不關(guān)機(jī)嗎? 這問題出現(xiàn)是因?yàn)橛?jì)算機(jī)科學(xué)中一個(gè)叫停機(jī)問題的問題:一般意義上沒有辦法知道,一個(gè)給定的程序是否能在有限的時(shí)間內(nèi)結(jié)束運(yùn)行。
我們的方案通過為每一個(gè)交易設(shè)定運(yùn)行執(zhí)行的最大計(jì)算步數(shù)來(lái)解決問題,如果超過則計(jì)算被恢復(fù)原狀但依然要支付費(fèi)用。消息以同樣的方式工作。為顯示這一方案背后的動(dòng)機(jī),請(qǐng)考慮下面的例子:
一個(gè)攻擊者創(chuàng)建了一個(gè)運(yùn)行無(wú)限循環(huán)的合約,然后發(fā)送了一個(gè)激活循環(huán)的交易給礦工,礦工將處理交易,運(yùn)行無(wú)限循環(huán)直到燃料耗盡。即使燃料耗盡交易半途停止,交易依然正確(回到原處)并且礦工依然從攻擊者哪里掙到了每一步計(jì)算的費(fèi)用。
一個(gè)攻擊者創(chuàng)建一個(gè)非常長(zhǎng)的無(wú)限循環(huán)意圖迫使礦工長(zhǎng)時(shí)間內(nèi)一直計(jì)算致使在計(jì)算結(jié)束前若干區(qū)塊已經(jīng)產(chǎn)生于是礦工無(wú)法收錄交易以賺取費(fèi)用。然而,攻擊者需要發(fā)布一個(gè) STARTGAS 值以限制可執(zhí)行步數(shù),因而礦工將提前知道計(jì)算將耗費(fèi)過多的步數(shù)。
一個(gè)攻擊者看到一個(gè)包含諸如 send(A,contract.storage[A]); contract.storage[A] = 0格式的合約然后發(fā)送帶有只夠執(zhí)行第一步的費(fèi)用的而不夠執(zhí)行第二步的交易(即提現(xiàn)但不減少賬戶余額)。合約作者無(wú)需擔(dān)心防衛(wèi)類似攻擊,因?yàn)槿绻麍?zhí)行中途停止則所有變更都被回復(fù)。
一個(gè)金融合約靠提取九個(gè)專用數(shù)據(jù)發(fā)布器的中值來(lái)工作以最小化風(fēng)險(xiǎn),一個(gè)攻擊者接管了其中一個(gè)數(shù)據(jù)提供器,然后把這個(gè)可變地址調(diào)用機(jī)制設(shè)計(jì)成可更改的數(shù)據(jù)提供器轉(zhuǎn)為運(yùn)行一個(gè)無(wú)限循環(huán),以求嘗試逼迫任何從此合約索要資金的嘗試都會(huì)因燃料耗盡而中止。然而,該合約可以在消息里設(shè)置燃料限制以防范此類問題。
圖靈完備的替代是圖靈不完備,這里 JUMP 和 JUMPI 指令不存在并且在某個(gè)給定時(shí)間每個(gè)合約只允許有一個(gè)拷貝存在于調(diào)用堆棧內(nèi)。在這樣的系統(tǒng)里,上述的費(fèi)用系統(tǒng)和圍繞我們的方案的效率的不確定性可能都是不需要的,因?yàn)閳?zhí)行一個(gè)合約的成本將被它的大小決定。此外,圖靈不完備甚至不是一個(gè)大的限制,在我們內(nèi)部設(shè)想的所有合約例子中,至今只有一個(gè)需要循環(huán),而且即使這循環(huán)也可以被 26 個(gè)單行代碼段的重復(fù)所代替??紤]到圖靈完備帶來(lái)的嚴(yán)重的麻煩和有限的益處,為什么不簡(jiǎn)單地使用一種圖靈不完備語(yǔ)言呢?事實(shí)上圖靈不完備遠(yuǎn)非一個(gè)簡(jiǎn)潔的解決方
案。為什么?請(qǐng)考慮下面的合約:
C0: call(C1); call(C1);
C1: call(C2); call(C2);
C2: call(C3); call(C3); …
C49: call(C50); call(C50);
C50: (run one step of a program and record the change in storage)
現(xiàn)在,發(fā)送一個(gè)這樣的交易給 A,這樣,在 51 個(gè)交易中,我們有了一個(gè)需要花費(fèi) 250 步計(jì)算的合約,礦工可能嘗試通過為每一個(gè)合約維護(hù)一個(gè)最高可執(zhí)行步數(shù)并且對(duì)于遞歸調(diào)用其它合約的合約計(jì)算可能執(zhí)行步數(shù)從而預(yù)先檢測(cè)這樣的邏輯炸彈,但是這會(huì)使礦工禁止創(chuàng)建其它合約的合約(因?yàn)樯厦?26 個(gè)合約的創(chuàng)建和執(zhí)行可以很容易地放入一個(gè)單獨(dú)合約內(nèi))。另外一個(gè)問題點(diǎn)是一個(gè)消息的地址字段是一個(gè)變量,所以通常來(lái)講可能甚至無(wú)法預(yù)先知道一個(gè)合約將要調(diào)用的另外一個(gè)合約是哪一個(gè)。于是,最終我們有了一個(gè)驚人的結(jié)論:圖靈完備的管理驚人地容易,而在缺乏同樣的控制時(shí)圖靈不完備的管理驚人地困難- 那為什么不讓協(xié)議圖靈完備呢?
9 挖礦的去中心化
物數(shù)鏈現(xiàn)在的目的是使用一個(gè)基于為每 1000 個(gè)隨機(jī)數(shù)隨機(jī)產(chǎn)生唯一哈希的函數(shù)的挖礦算法,用足夠?qū)挼挠?jì)算域,去除專用硬件的優(yōu)勢(shì)。注意每單個(gè)用戶使用他們的私人筆記本電腦或臺(tái)式機(jī)就可以幾乎免費(fèi)地完成一定量的挖礦活動(dòng),但當(dāng)?shù)搅?00%的 CPU 使用率之后更多地挖礦就會(huì)需要他們支付電力和硬件成本。ASIC 挖礦公司需要從第一個(gè)哈希開始就為電力和硬件支付成本。所以,如果中心化收益能夠保持在(E + H) /E 以下,那么即使 ASICs 被制造出來(lái)普通礦工依然有生存空間。另外,我們計(jì)劃將挖礦算法設(shè)計(jì)成挖礦需要訪問整個(gè)區(qū)塊鏈,迫使礦工存儲(chǔ)完成的區(qū)塊鏈或者至少能夠驗(yàn)證每筆交易。這去除了對(duì)中心化礦池的需要;雖然礦池依然可以扮演平滑收益分配的隨機(jī)性的角色,但這功能可以被沒有中心化控制的 P2P 礦池完成地同樣好。這樣即使大部分普通用戶依然傾向選擇輕客戶端,通過增加網(wǎng)絡(luò)中的全節(jié)點(diǎn)數(shù)量也有助于抵御中心化。
10 擴(kuò)展性
擴(kuò)展性問題是常被關(guān)注的地方,與比特幣一樣,物數(shù)鏈也遭受著每個(gè)交易都需要網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)處理這一困境的折磨。比特幣的當(dāng)前區(qū)塊鏈大小約為 20GB,以每小時(shí) 1MB 的速度增長(zhǎng)。如果比特幣網(wǎng)絡(luò)處理 Visa 級(jí)的 2000tps 的交易,它將以每三秒 1MB 的速度增長(zhǎng)(1GB 每小時(shí),8TB 每年)。物數(shù)鏈可能也會(huì)經(jīng)歷相似的甚至更糟的增長(zhǎng)模式,因?yàn)樵谖飻?shù)鏈之上還會(huì)有很多應(yīng)用,而不是像比特幣只是簡(jiǎn)單的貨幣,但物數(shù)鏈全節(jié)點(diǎn)只需存儲(chǔ)狀態(tài)而不是完整的區(qū)塊鏈歷史這一事實(shí)讓情況得到了改善。
大區(qū)塊鏈的問題是中心化風(fēng)險(xiǎn)。如果塊鏈大小增加至比如 100TB,可能的場(chǎng)景將是只有非常小數(shù)目的大商家會(huì)運(yùn)行全節(jié)點(diǎn),而常規(guī)用戶使用輕的 SPV 節(jié)點(diǎn)。這會(huì)增加對(duì)全節(jié)點(diǎn)合伙欺詐牟利(例如更改區(qū)塊獎(jiǎng)勵(lì),給他們自己 BTC)的風(fēng)險(xiǎn)的擔(dān)憂。輕節(jié)點(diǎn)將沒有辦法立刻檢測(cè)到這種欺詐。當(dāng)然,至少可能存在一個(gè)誠(chéng)實(shí)的全節(jié)點(diǎn),并且?guī)讉€(gè)小時(shí)之后有關(guān)詐騙的信息會(huì)通過 Reddit 這樣的渠道泄露,但這時(shí)已經(jīng)太晚:任憑普通用戶做出怎樣的努力去廢除已經(jīng)產(chǎn)生的區(qū)塊,他們都會(huì)遇到與發(fā)動(dòng)一次成功的 51%攻擊同等規(guī)模的巨大的不可行的協(xié)調(diào)問題。物數(shù)鏈會(huì)使用兩個(gè)附加的策略以應(yīng)對(duì)此問題。首先,因?yàn)榛趨^(qū)塊鏈的挖礦算法,至少每個(gè)礦工會(huì)被迫成為一個(gè)全節(jié)點(diǎn),這保證了一定數(shù)量的全節(jié)點(diǎn)。其次,更重要的是,處理完每筆交易后,我們會(huì)把一個(gè)中間狀態(tài)樹的根包含進(jìn)區(qū)塊鏈。即使區(qū)塊驗(yàn)證是中心化的,只要有一個(gè)誠(chéng)實(shí)的驗(yàn)證節(jié)點(diǎn)存在,中心化的問題就可以通過一個(gè)驗(yàn)證協(xié)議避免。如果一個(gè)礦工發(fā)布了一個(gè)不正確的區(qū)塊,這區(qū)塊要么是格式錯(cuò),要么狀態(tài) S[n]是錯(cuò)的。因?yàn)?S[0]是正確的,必然有第一個(gè)錯(cuò)誤狀態(tài) S[i]但 S[i-1]是正確的,驗(yàn)證節(jié)點(diǎn)將提供索引 i,一起提供的還有處理 APPLY(S[i-1],TX[i]) -》 S[i]所需的帕特里夏樹節(jié)點(diǎn)的子集。這些節(jié)點(diǎn)將受命進(jìn)行這部分計(jì)算,看產(chǎn)生的 S[i]與先前提供的值是否一致。另外,更復(fù)雜的是惡意礦工發(fā)布不完整區(qū)塊進(jìn)行攻擊,造成沒有足夠的信息去確定區(qū)塊是否正確。解決方案是質(zhì)疑-回應(yīng)協(xié)議:驗(yàn)證節(jié)點(diǎn)對(duì)目標(biāo)交易索引發(fā)起質(zhì)疑,接受到質(zhì)疑信息的輕節(jié)點(diǎn)會(huì)對(duì)相應(yīng)的區(qū)塊取消信任,直到另外一個(gè)礦工或者驗(yàn)證者提供一個(gè)帕特里夏節(jié)點(diǎn)子集作為正確的證據(jù)。
11 綜述
去中心化應(yīng)用上述合約機(jī)制使得任何一個(gè)人能夠在一個(gè)虛擬機(jī)上建立通過全網(wǎng)共識(shí)來(lái)運(yùn)行命令行應(yīng)用(從根本上來(lái)說(shuō)是),它能夠更改一個(gè)全網(wǎng)可訪問的狀態(tài)作為它的“硬盤”。然而,對(duì)于多數(shù)人來(lái)說(shuō),用作交易發(fā)送機(jī)制的命令行接口缺乏足夠的用戶友好使得去中心化成為有吸引力的替代方案。最后,一個(gè)完整的“去中心化應(yīng)用”應(yīng)該包括底層的商業(yè)邏輯組件和上層的圖形用戶接口組件。物數(shù)鏈客戶端被設(shè)計(jì)成一個(gè)網(wǎng)絡(luò)瀏覽器,但包括對(duì)“LDBC” Javascript API 對(duì)象的支持,可被客戶端里看到的特定的網(wǎng)頁(yè)用來(lái)與物數(shù)鏈交互。從“傳統(tǒng)”網(wǎng)頁(yè)的角度看來(lái),這些網(wǎng)頁(yè)是完全靜態(tài)的內(nèi)容,因?yàn)閰^(qū)塊鏈和其它去中心化協(xié)議將完全代替服務(wù)器來(lái)處理用戶發(fā)起的請(qǐng)求。最后,去中心化協(xié)議有希望自己利用某種方式使用 LDBC 來(lái)存儲(chǔ)網(wǎng)頁(yè)。
12 結(jié)論
物數(shù)鏈協(xié)議圍繞去物流數(shù)據(jù)分享去中心化存儲(chǔ),去中心化計(jì)算以及數(shù)十個(gè)類似概念建立的協(xié)議和去中心化應(yīng)用,有潛力從根本上提升物流行業(yè)的效率,并通過首次添加經(jīng)濟(jì)層為其它的 P2P 協(xié)議提供有力支撐,最終,同樣會(huì)有大批與金錢毫無(wú)關(guān)系的應(yīng)用出現(xiàn)。
物數(shù)鏈協(xié)議實(shí)現(xiàn)的任意狀態(tài)轉(zhuǎn)換概念提供了一個(gè)具有獨(dú)特潛力的平臺(tái);與封閉式的,為諸如數(shù)據(jù)存儲(chǔ),或金融等單一目的設(shè)計(jì)的協(xié)議不同,從設(shè)計(jì)上是開放式的,并且我們相信它極其適合作為基礎(chǔ)層服務(wù)于在將來(lái)的年份里出現(xiàn)的極其大量的物流行業(yè)和非行業(yè)協(xié)議。
評(píng)論
查看更多