本文由【區(qū)塊鏈研習(xí)社】?jī)?yōu)質(zhì)內(nèi)容計(jì)劃支持,更多關(guān)于區(qū)塊鏈的深度好文,請(qǐng)點(diǎn)擊區(qū)塊鏈研習(xí)社傳送門
太專業(yè)的技術(shù)貼,大家留言交流。

本白皮書中內(nèi)容無需授權(quán),任何人都可以復(fù)制或分發(fā)用于非商業(yè)或教育用途,只需注明原始來源和應(yīng)用版權(quán)聲明即可,但不可用于收費(fèi)或者商業(yè)用途。
免責(zé)聲明: 本 EOS.IO 技術(shù)白皮書 2.0 版本僅作信息提供之用。block.one 不保證白皮書中內(nèi)容或結(jié)論的準(zhǔn)確性,僅供參考。block.one 不會(huì)作出、并且明確否認(rèn)所有明示的或隱含的、法定的或其他形式的聲明和保證條款,包括但不限于:(i)適銷性、針對(duì)特定用途的適用性、適宜性、用途、所有權(quán)和非侵權(quán)的保證;(ii)本白皮書中的內(nèi)容不存在錯(cuò)誤的保證;(iii)本白皮書內(nèi)容不會(huì)侵害第三方權(quán)利的保證。block.one 及其分公司不承擔(dān)因?qū)Ρ景灼氨韭暶髦兴瑑?nèi)容的使用、參考或信任而造成的任何損失,即便已告誡過可能造成的損害。任何個(gè)人或?qū)嶓w由于對(duì)本白皮書及本聲明所包含內(nèi)容的使用、參考、或信任而造成的各種形式的任何損害、損失、負(fù)債、成本或花費(fèi),不論是直接的、間接的、作為結(jié)果的、賠償?shù)?、偶發(fā)的、實(shí)際的、懲戒的、懲罰的,或是特殊性的,包括但不限于任何業(yè)務(wù)、收入、利潤(rùn)、數(shù)據(jù)、效用、商譽(yù)或其他無形損失,block.one 或其分公司在任何情況下均不為此承擔(dān)責(zé)任。
背景
伴隨著比特幣的誕生,區(qū)塊鏈技術(shù)在 2008 年問世,從那之后,企業(yè)家和開發(fā)者不斷地試圖將區(qū)塊鏈技術(shù)通用化,以期在單一區(qū)塊鏈平臺(tái)上實(shí)現(xiàn)對(duì)去中心化應(yīng)用更廣泛的支持。
在眾多爭(zhēng)相實(shí)現(xiàn)支持可實(shí)用的去中心化應(yīng)用的區(qū)塊鏈平臺(tái)當(dāng)中,一些針對(duì)特定應(yīng)用場(chǎng)景的區(qū)塊鏈脫穎而出并被廣泛使用,吸引了成千上萬的用戶。例如去中心化交易所 BitShares(2014)和社交媒體平臺(tái) Steem(2016)。類似的項(xiàng)目之所以能被眾多用戶接納,是因?yàn)樗麄儾粌H提高了性能使得每秒可處理的交易量達(dá)到數(shù)千次,還將確認(rèn)時(shí)間縮短至 1.5s 并且消除了交易費(fèi)用,同時(shí)他們還能提供可與現(xiàn)有的中心化服務(wù)相媲美的用戶體驗(yàn)。
然而更多現(xiàn)有的區(qū)塊鏈平臺(tái)(的使用)則需要高昂的交易費(fèi)用,并且計(jì)算能力也有限,這些都是阻礙區(qū)塊鏈技術(shù)被更廣泛地接受與使用的因素。
對(duì)區(qū)塊鏈應(yīng)用的要求
要實(shí)現(xiàn)更廣泛的應(yīng)用,區(qū)塊鏈上的應(yīng)用程序需要一個(gè)足夠靈活的平臺(tái),該平臺(tái)要滿足以下需求:
支持百萬級(jí)用戶
與 Ebay、Uber、AirBnB 和 Facebook 這樣的企業(yè)競(jìng)爭(zhēng),區(qū)塊鏈技術(shù)要能處理百萬級(jí)的日活躍用戶。 在某些場(chǎng)景中,除非用戶量達(dá)到一個(gè)極其龐大的數(shù)量級(jí),否則應(yīng)用并無用武之地。因此,一個(gè)可以支持相當(dāng)龐大的用戶量的平臺(tái)是至關(guān)重要的。
免費(fèi)使用
應(yīng)用開發(fā)者需要足夠的靈活性來為用戶提供免費(fèi)的服務(wù),用戶不應(yīng)該因?yàn)槭褂闷脚_(tái)或從平臺(tái)上的服務(wù)中獲益而支付費(fèi)用??擅赓M(fèi)使用的區(qū)塊鏈平臺(tái)會(huì)更受歡迎,開發(fā)者和商家也可以從中創(chuàng)造更多有效的盈利策略。
易于升級(jí)和 Bug 修復(fù)
基于商用區(qū)塊鏈之上的應(yīng)用需要有一定的靈活性來支持新特性的增加,因此平臺(tái)本身必須支持軟件和智能合約的升級(jí)。
軟件只要達(dá)到一定規(guī)模,就必定會(huì)出現(xiàn) bug,即便是通過了再嚴(yán)格的驗(yàn)證也不例外。因此平臺(tái)必須足夠魯棒(Robust)并支持修復(fù)不可避免的 bug。
低延時(shí)
好的用戶體驗(yàn)要求在數(shù)秒內(nèi)就能收到可靠的反饋。高延時(shí)不僅會(huì)讓用戶心煩,還會(huì)導(dǎo)致建立在區(qū)塊鏈之上的應(yīng)用競(jìng)爭(zhēng)力不如現(xiàn)有的中心化應(yīng)用。因此,平臺(tái)需要支持低延時(shí)交易。
時(shí)序性能
由于執(zhí)行步驟的順序依賴關(guān)系,一些應(yīng)用不能使用并發(fā)算法來實(shí)現(xiàn)。例如,交易所就需要足夠的時(shí)序性能來處理高交易量。因此,平臺(tái)需要具備高時(shí)序性能。
并發(fā)性能
大規(guī)模的應(yīng)用需要將工作量分配到多臺(tái) CPU 和計(jì)算機(jī)之上,因此,平臺(tái)需要內(nèi)建對(duì)并發(fā)的支持。
共識(shí)算法(BFT-DPOS)
EOS.IO 軟件采用授權(quán)委托證明(DPOS)的算法,在目前已知的去中心化共識(shí)算法中,只有該算法經(jīng)證明可以滿足區(qū)塊鏈上應(yīng)用程序的性能要求。根據(jù)這種算法, EOS 區(qū)塊鏈上所有代幣持有者可以都通過一個(gè)持續(xù)的投票系統(tǒng)選擇區(qū)塊生產(chǎn)者。想?yún)⑴c區(qū)塊生產(chǎn),只要能說服代幣持有人給自己投票,最終(得票最高的那些節(jié)點(diǎn))被選為區(qū)塊生產(chǎn)者。
EOS.IO 軟件能夠精確地每 0.5 秒產(chǎn)生一個(gè)區(qū)塊,并且在任一時(shí)間僅有一個(gè)生產(chǎn)者獲權(quán)生產(chǎn)區(qū)塊。如果在預(yù)定時(shí)間內(nèi)沒有區(qū)塊生成,則跳過該塊。相應(yīng)的,當(dāng)跳過一個(gè)或多個(gè)塊時(shí),區(qū)塊鏈中會(huì)存在一個(gè)大于等于 0.5 秒的時(shí)間間隔。
使用 EOS.IO 軟件,每一輪產(chǎn)生 126 個(gè)區(qū)塊(共 21 個(gè)區(qū)塊生產(chǎn)者,每一輪都有一個(gè)特定的生產(chǎn)者負(fù)責(zé)產(chǎn)生 6 個(gè)塊,即一輪的時(shí)間為 63 秒)。在每輪開始時(shí),根據(jù)代幣持有者的投票選出 21 個(gè)不同的區(qū)塊生產(chǎn)者。獲選的生產(chǎn)者的生產(chǎn)順序由 15 個(gè)或更多生產(chǎn)者一致同意決定。
如果一個(gè)生產(chǎn)者錯(cuò)過了一個(gè)塊,并且在過去 24 小時(shí)均未產(chǎn)生任何塊,則會(huì)被從生產(chǎn)者的名單中剔除,直至他通知區(qū)塊鏈表明他打算再次開始生產(chǎn)區(qū)塊。這種方式可以排除不可靠的生產(chǎn)者來最小化錯(cuò)過的區(qū)塊數(shù)量,從而確保網(wǎng)絡(luò)的順暢運(yùn)行。
正常情況下, DPOS 區(qū)塊鏈不會(huì)產(chǎn)生任何分叉,因?yàn)樯a(chǎn)者生產(chǎn)區(qū)塊的方式是合作而非競(jìng)爭(zhēng)。如果出現(xiàn)分叉,那么共識(shí)的處理方式是自動(dòng)切換到最長(zhǎng)的鏈上。其工作原理是,一個(gè)區(qū)塊鏈的分叉上新區(qū)塊的添加速度與在這個(gè)分叉上達(dá)成共識(shí)的生產(chǎn)者的多寡直接相關(guān)。換言之,生產(chǎn)者數(shù)量多的分叉,其增長(zhǎng)速度要比生產(chǎn)者較少的分叉的增長(zhǎng)速度更快,這是因?yàn)樯a(chǎn)者數(shù)量多的分叉錯(cuò)過的區(qū)塊數(shù)往往會(huì)更少。
此外,任何區(qū)塊生產(chǎn)者都不應(yīng)該在同一時(shí)刻在兩個(gè)分叉上競(jìng)爭(zhēng)出塊。如果有塊生產(chǎn)者被發(fā)現(xiàn)這么做,可能會(huì)被投票出局。這種雙重生產(chǎn)會(huì)留下密碼學(xué)證據(jù),因此識(shí)別并自動(dòng)清除這類區(qū)塊生產(chǎn)者是可行的。
添加了拜占庭容錯(cuò)機(jī)制的 DPOS 算法需要所有生產(chǎn)者簽名所有區(qū)塊,但禁止同一個(gè)生產(chǎn)者簽名兩個(gè)時(shí)間戳或高度相同的區(qū)塊。一個(gè)區(qū)塊一旦被 15 個(gè)生產(chǎn)者簽名,那么這個(gè)區(qū)塊就可以被視為不可逆了。 任何生產(chǎn)者一旦簽名兩個(gè)相同時(shí)間戳或相同區(qū)塊高度的區(qū)塊,這種不誠(chéng)信行為就會(huì)留下密碼學(xué)證據(jù)。在這一模型下,不可逆的共識(shí)將在 1 秒內(nèi)達(dá)成。
交易確認(rèn)
典型的基于 DPOS 共識(shí)算法的區(qū)塊鏈中,區(qū)塊生產(chǎn)者會(huì)有 100% 的參與度。一筆交易在廣播后的平均 0.25 秒之后,就可以 99.9% 確定這筆交易不可逆了。
而 EOS.IO 軟件除了 DPOS 共識(shí)算法,還引入了了異步拜占庭容錯(cuò)(aBFT),可讓交易的更快達(dá)到不可逆轉(zhuǎn)狀態(tài),可在 1 秒內(nèi) 100% 確定交易達(dá)到了不可逆狀態(tài)。
交易作為權(quán)益證明(TaPoS)
EOS.IO軟件要求每一筆交易必須包括最近的一個(gè)區(qū)塊頭的部分哈希值。這個(gè)哈希值有兩個(gè)目的:
1.防止一個(gè)交易在另一個(gè)未包含該交易的分叉上被重新廣播。
2.通知整個(gè)網(wǎng)絡(luò),某個(gè)特定用戶和他的權(quán)益存在于某個(gè)特定的分叉上。
如此一來,偽造假冒鏈將變得非常困難,因?yàn)閭卧煺邿o法將合法鏈中的交易遷移到假冒鏈上。
賬戶系統(tǒng)
EOS.IO 軟件規(guī)定所有的賬戶都由一個(gè)唯一名稱來標(biāo)識(shí),名稱的最大長(zhǎng)度為 12 個(gè)字符。該名稱由帳戶的創(chuàng)建者指定。帳戶創(chuàng)建者必須使用 EOS 代幣預(yù)留 RAM 用來存儲(chǔ)新帳戶,直至新帳戶質(zhì)押自己的代幣來預(yù)留自己的 RAM。
在去中心化的背景下,應(yīng)用程序開發(fā)人員在新用戶注冊(cè)時(shí),會(huì)象征性地支付賬戶創(chuàng)建費(fèi)用。傳統(tǒng)企業(yè)為獲取客戶,已經(jīng)以廣告、免費(fèi)服務(wù)等形式為每個(gè)用戶花費(fèi)了大量資金。相比之下,創(chuàng)建新的區(qū)塊鏈賬戶所需的資金成本微不足道。不過好在如果用戶在注冊(cè)另一個(gè)應(yīng)用程序時(shí)已經(jīng)創(chuàng)建了帳戶,那就沒有必要再次創(chuàng)建了。
操作(Actions)和處理程序
每個(gè)帳戶可以發(fā)送結(jié)構(gòu)化的操作(Actions)到其他帳戶,并且可以定義程序代碼來處理收到后的操作。EOS.IO軟件為每個(gè)帳戶提供自己的私有數(shù)據(jù)庫,只能由該賬戶的操作處理程序(Action Handler)訪問。操作處理程序還可以發(fā)送操作到其他賬戶。操作和自動(dòng)化的操作處理程序的結(jié)合合是EOS.IO定義智能合約的方式。
為支持并發(fā)執(zhí)行操作,每個(gè)賬戶可以在其數(shù)據(jù)庫內(nèi)定義任意多個(gè)作用域。區(qū)塊生產(chǎn)者通過這種方式安排事務(wù),使得事務(wù)執(zhí)行時(shí)對(duì)作用域的內(nèi)存訪問沒有沖突,因此事務(wù)可以并發(fā)執(zhí)行。
基于角色的權(quán)限管理
權(quán)限管理包括確認(rèn)某項(xiàng)操作是否被正確授權(quán)。最簡(jiǎn)單的權(quán)限管理是檢查交易是否具有所需的簽名,這也意味著所需的簽名是已知的。一般而言,授權(quán)涉及個(gè)人或群體,并且往往是分類的。EOS.IO 軟件提供了一個(gè)聲明式權(quán)限管理系統(tǒng),可以對(duì)帳戶進(jìn)行細(xì)粒度、高級(jí)別的控制,以確定誰在何時(shí)可以做什么。
身份驗(yàn)證和權(quán)限管理必須標(biāo)準(zhǔn)化,并與應(yīng)用程序的業(yè)務(wù)邏輯分開,這是至關(guān)重要的。這樣使得開發(fā)工具能夠以通用方式管理權(quán)限,并為優(yōu)化性能提供巨大空間。
每個(gè)帳戶都可以通過其他帳戶和私鑰的組合來控制。這就創(chuàng)建了一個(gè)分層的權(quán)限結(jié)構(gòu),真實(shí)反映了現(xiàn)實(shí)中權(quán)限的組織方式,并使得多用戶的賬戶控制比以往更容易。多用戶控制對(duì)提升安全性的作用是最大的。如果使用得當(dāng),會(huì)極大降低黑客攻擊而造成的盜竊風(fēng)險(xiǎn)。
EOS.IO 軟件允許帳戶定義什么樣的賬戶和密鑰的組合可以把特定的操作發(fā)送到另一個(gè)賬戶。例如,可以使用一個(gè)密鑰訪問用戶的社交媒體帳戶,另一個(gè)密鑰用于訪問交易所。甚至可以授權(quán)其他帳戶來代表本賬戶進(jìn)行操作,而無需為其他賬戶分配密鑰。
命名的權(quán)限級(jí)別
帳戶通過使用 EOS.IO 軟件,可以定義命名的權(quán)限的級(jí)別,每個(gè)權(quán)限級(jí)別可以從更高級(jí)別的命名權(quán)限中派生。每個(gè)命名權(quán)限級(jí)別定義一個(gè)權(quán)限。權(quán)限是一個(gè)多簽名的閾值檢查,由其他帳戶的密鑰和/或命名權(quán)限級(jí)別組成。例如,可以為一個(gè)帳戶的某個(gè)操作設(shè)置"朋友"權(quán)限級(jí)別,該帳戶的朋友對(duì)該操作具有相同等級(jí)的控制權(quán)限。
另一個(gè)例子是 Steem 區(qū)域鏈,它具有三個(gè)硬編碼的命名的權(quán)限級(jí)別:owner, active和posting。posting 權(quán)限只能執(zhí)行諸如投票和發(fā)布等社交操作,而 active 權(quán)限可以執(zhí)行除更改所有者的所有操作。owner 權(quán)限應(yīng)該被冷存儲(chǔ)起來,它可以執(zhí)行一切操作。EOS.IO 推廣了這一理念,允許每個(gè)賬戶所有者自定義權(quán)限級(jí)別以及操作的分組。
權(quán)限映射
EOS.IO 軟件允許每個(gè)帳戶定義從合約/操作或其他賬戶的合約到其自己的命名的權(quán)限級(jí)別之間的映射。例如,賬戶持有人可將其社交媒體應(yīng)用程序映射到賬戶所有者的"朋友"權(quán)限組。通過此映射,該賬戶的任何朋友都可以作為賬戶所有者在社交媒體發(fā)布信息。盡管這些朋友可以作為帳戶所有者發(fā)布信息,但他們?nèi)匀粫?huì)使用自己的密鑰來簽名。這就意味著,哪些朋友以何種方式使用了該帳戶,始終是可以確定的。
權(quán)限評(píng)估
當(dāng)從賬戶 @alice 發(fā)送類型為" Action " 的操作到 @bob 時(shí),EOS.IO 軟件將首先檢查 @alice 是否為 @bob.groupa.subgroup.Action 定義了權(quán)限映射。如果沒有發(fā)現(xiàn)任何結(jié)果,那么將會(huì)檢查 @bob.groupa.subgroup,然后檢查 @bob.groupa,最后檢查 @bob。如果沒有找到進(jìn)一步的匹配,則假定映射的命名權(quán)限組是 @alice.active。
一旦確定了映射的命名權(quán)限,則使用多簽名閾值來驗(yàn)證簽名,并獲取命名權(quán)限相關(guān)聯(lián)的權(quán)限。如果失敗,那么它會(huì)遍歷父類權(quán)限,最后遍歷 owner 的權(quán)限,即@alice.owner。
默認(rèn)權(quán)限組
EOS.IO 軟件給所有賬戶指定了兩個(gè)默認(rèn)權(quán)限組。一個(gè)是"owner"權(quán)限組,可以執(zhí)行任何操作。還有一個(gè)“active”權(quán)限組,除了更改“owner” 權(quán)限組之外,可以執(zhí)行所有操作。所有其他權(quán)限組均由“active”組派生。
并發(fā)評(píng)估權(quán)限
權(quán)限評(píng)估過程是"只讀"的,并且,對(duì)權(quán)限的更新交易直到被打包進(jìn)區(qū)塊后才會(huì)生效。這意味著一切交易的所有密鑰和權(quán)限評(píng)估都可以并發(fā)執(zhí)行。此外,這還說明快速權(quán)限驗(yàn)證是可行的,而且不需要啟動(dòng)昂貴的應(yīng)用程序邏輯(并且在驗(yàn)證失敗時(shí)會(huì)回滾應(yīng)用邏輯)。最后,這意味著交易權(quán)限可以在接收到待處理的交易時(shí)進(jìn)行評(píng)估,而在待處理的交易被處理時(shí)無需重新評(píng)估。
從整體來看,權(quán)限驗(yàn)證占交易驗(yàn)證中所需計(jì)算的很大一部分。讓權(quán)限驗(yàn)證過程只讀,并且可并發(fā)執(zhí)行,可以顯著提升性能。
當(dāng)我們重放區(qū)塊鏈的歷史,試圖從操作日志重新生成確定性狀態(tài)時(shí),不需要再次評(píng)估權(quán)限。交易包含在一個(gè)已知的不可逆的區(qū)塊中這一客觀事實(shí),足以讓其跳過權(quán)限評(píng)估的不周步驟。這極大減少了重放不斷增長(zhǎng)的區(qū)塊鏈時(shí)消耗的計(jì)算量。
帶強(qiáng)制延遲的操作
時(shí)間是關(guān)乎安全的關(guān)鍵因素。通常情況下,只有在私鑰被盜竊者使用了之后,私鑰的所有者才能知道它被盜了。當(dāng)人們的應(yīng)用軟件需要在連網(wǎng)的計(jì)算機(jī)上保存密鑰以供日常使用時(shí),基于時(shí)間的安全性就顯得更為重要了。EOS.IO 軟件使得開發(fā)者可以指定某些操作 (Actions) 在記錄到一個(gè)區(qū)塊后必須至少等待一小段時(shí)間后才被應(yīng)用。在此期間,操作可以取消。
當(dāng)一個(gè)操作廣播后,用戶可以通過電子郵件或短信來接收其通知。如果他們沒有給這個(gè)操作授權(quán),那就可以使用賬戶恢復(fù)流程來恢復(fù)賬戶并撤銷操作。
上述所需的操作確認(rèn)延遲取決于操作的敏感程度。支付咖啡錢時(shí)可以沒有任何延遲,在幾秒鐘內(nèi)就達(dá)到不可逆,而購(gòu)房時(shí)可能就需要 72 小時(shí)的結(jié)算期。轉(zhuǎn)讓整個(gè)帳戶到新的控制權(quán)可能需要長(zhǎng)達(dá)30天的時(shí)間。確切的延遲時(shí)間是由應(yīng)用開發(fā)者和用戶共同決定的。
密鑰被盜后的恢復(fù)
EOS.IO 軟件為用戶提供了一種在密鑰被盜后恢復(fù)帳戶控制權(quán)的方法。帳戶所有者 (owner) 可以通過過去 30 天內(nèi)處于活躍狀態(tài)的任何 owner 密鑰,以及來自其指定的帳戶恢復(fù)合作伙伴的批準(zhǔn)來重置其帳戶的 owner 密鑰。沒有帳戶所有者的幫助,帳戶恢復(fù)合作伙伴無法單獨(dú)重置帳戶的控制權(quán)。
黑客嘗試完成恢復(fù)流程是沒有意義的,因?yàn)樗麄円呀?jīng)"控制"了帳戶。此外,如果他們?nèi)f一真要走這個(gè)流程,恢復(fù)伙伴也會(huì)要求身份識(shí)別和多重認(rèn)證(電話和電子郵件)。這會(huì)讓黑客的身份受到懷疑,或讓他在該流程中一無所獲。
該流程與簡(jiǎn)單的多重簽名協(xié)議很不一樣。多重簽名交易中,另一方會(huì)成為每筆交易的參與者。相比之下,在恢復(fù)流程中,合作伙伴只是參與了恢復(fù)流程,無權(quán)干預(yù)日常交易。這大大降低了所有相關(guān)人員的操作成本和法律責(zé)任。
應(yīng)用的確定性并行執(zhí)行
區(qū)塊鏈共識(shí)取決于確定性 (可重復(fù)) 行為,這意味著所有并行執(zhí)行必須避免使用互斥鎖或者其他鎖原語。如果沒有鎖,那么必須要有方法來保證可能被并行執(zhí)行的交易不會(huì)產(chǎn)生非確定性結(jié)果。
EOS.IO 軟件在 2018 年 6 月的發(fā)行版將會(huì)是單線程的,但是它會(huì)包含將來多線程、并行執(zhí)行所需的數(shù)據(jù)結(jié)構(gòu)。
在基于 EOS.IO 軟件的區(qū)塊鏈中,一旦啟用并行操作,區(qū)塊生產(chǎn)者的工作就是將操作 (Action) 投遞到獨(dú)立的分片 (shard) 中,以便可以進(jìn)行并行評(píng)估。區(qū)塊生產(chǎn)者的產(chǎn)出是將被確定性地執(zhí)行的計(jì)劃表,但是生成計(jì)劃表的過程不需要是確定性的。這意味著區(qū)塊生產(chǎn)者可以利用并行算法來調(diào)度交易。
部分的并行執(zhí)行是說,當(dāng)一個(gè)腳本生成一個(gè)新的操作時(shí),它可能不會(huì)被立即投遞,而是被安排在下一個(gè)循環(huán)中投遞。無法立即分配的原因是接收者可能正在活躍地修改自己在其他分片中的狀態(tài)。
最小化通信延遲
延遲時(shí)間是指一個(gè)帳戶向另一個(gè)帳戶發(fā)送操作并接收響應(yīng)所需的時(shí)間。我們的目標(biāo)是使兩個(gè)賬戶能夠在一個(gè)區(qū)塊內(nèi)來回交換操作,而不必為每次操作都等待 0.5 秒。為了實(shí)現(xiàn)這一點(diǎn),EOS.IO 軟件將每個(gè)區(qū)塊分成多個(gè)循環(huán) (Cycle),每個(gè)循環(huán)又被分成多個(gè)分片,每個(gè)分片包含一組交易。每筆交易都包含一組要投遞的操作。這個(gè)結(jié)構(gòu)可以被可視化為一棵樹,其中不同層交替地按順序及并行地處理。
區(qū)塊 區(qū)域 循環(huán) (順序) 分片 (并行) 交易 (順序) 操作 (順序) 接收者和被通知賬戶 (并行)
在一個(gè)循環(huán)內(nèi)生成的交易可以在任意后續(xù)的循環(huán)或區(qū)塊中被投遞。區(qū)塊生產(chǎn)者會(huì)持續(xù)給區(qū)塊增加循環(huán),直到超過最大運(yùn)行時(shí)間,或者沒有新生成的交易要投遞。
對(duì)一個(gè)區(qū)塊使用靜態(tài)分析來驗(yàn)證給定循環(huán)內(nèi)沒有兩個(gè)分片包含修改同一帳戶的交易,這種方式是可行的。只要這一點(diǎn)是確定的,那么一個(gè)區(qū)塊就可以通過并行運(yùn)行所有的分片的方式進(jìn)行處理。
只讀的操作處理程序
有些帳戶可能可以用"通過/未通過”的方式來處理操作,而不必修改其內(nèi)部狀態(tài)。如果是這種情況,只要對(duì)于特定的賬戶只有只讀的操作處理程序被包含在某一循環(huán)內(nèi)的一個(gè)或多個(gè)分片中,那么這些處理程序可以被并行執(zhí)行。
多帳戶的原子交易
有時(shí)候我們希望保證操作投遞給多個(gè)賬戶并被接收是原子的。在這種情況下,兩個(gè)操作會(huì)被放置在同一筆交易里,這兩個(gè)帳戶還會(huì)被分配到相同的分片里并按順序處理操作。
區(qū)塊鏈狀態(tài)的部分評(píng)估
區(qū)塊鏈擴(kuò)容技術(shù)要求組件是模塊化的。任何人都不應(yīng)該處理所有事情,特別是在他們只需要使用一小部分鏈上數(shù)據(jù)的情況下。
交易所應(yīng)用的開發(fā)者會(huì)運(yùn)行全節(jié)點(diǎn)以便給用戶顯示交易狀態(tài)。這個(gè)交易所應(yīng)用不需要其他社交媒體應(yīng)用相關(guān)的狀態(tài)。EOS.IO 軟件允許任意全節(jié)點(diǎn)選擇要運(yùn)行的任意應(yīng)用的子集。如果你的應(yīng)用不依賴于其他合約的狀態(tài),那么你可以安全地忽略投遞給其他應(yīng)用的操作。
自主最優(yōu)調(diào)度
EOS.IO 軟件不能強(qiáng)迫區(qū)塊生產(chǎn)者投遞任何操作給任何其他帳戶。每個(gè)區(qū)塊生產(chǎn)者都需要對(duì)處理交易所需的計(jì)算復(fù)雜度和時(shí)間做出主觀測(cè)量。無論是用戶生成的還是智能合約自動(dòng)生成的交易,這一點(diǎn)都適用。
在一個(gè)基于 EOS.IO 軟件的區(qū)塊鏈里,在網(wǎng)絡(luò)層面上,所有交易會(huì)根據(jù)執(zhí)行的 WASM 指令數(shù)來計(jì)算帶寬成本。但是使用 EOS.IO 軟件的每個(gè)區(qū)塊生產(chǎn)者都可能會(huì)使用自己的算法和標(biāo)準(zhǔn)來計(jì)算資源的使用情況。當(dāng)區(qū)塊生產(chǎn)者判定某個(gè)交易或賬戶會(huì)消耗過多的計(jì)算能力時(shí),在生產(chǎn)自己的區(qū)塊時(shí)他們會(huì)直接拒絕這個(gè)交易;但是如果其他區(qū)塊生產(chǎn)者都認(rèn)為這個(gè)交易有效,他們還是會(huì)處理該交易。
一般而言,只要有 1 個(gè)區(qū)塊生產(chǎn)者認(rèn)為某個(gè)交易有效且在資源使用限制內(nèi),那么其他所有區(qū)塊生產(chǎn)者也會(huì)接受這個(gè)交易;但是這個(gè)交易可能需要多達(dá) 1 分鐘才能找到生產(chǎn)者。
在某些情況下,生產(chǎn)者創(chuàng)建的區(qū)塊可能包含可接受范圍之外的數(shù)量級(jí)的交易。遇到這種情況,下一個(gè)區(qū)塊生產(chǎn)者可以選擇拒絕該區(qū)塊,這個(gè)僵局將會(huì)被第三個(gè)生產(chǎn)者打破。這和過大區(qū)塊導(dǎo)致網(wǎng)絡(luò)傳播延遲沒什么區(qū)別。EOS.IO 社區(qū)會(huì)注意到這種濫用模式,并最終移除惡意生產(chǎn)者的投票。
這種對(duì)計(jì)算成本的主觀評(píng)估使得區(qū)塊鏈不必精確和確定地測(cè)量交易需要運(yùn)行多長(zhǎng)時(shí)間。有了這個(gè)設(shè)計(jì)就沒必要精確地計(jì)算指令數(shù),這可以在不違反共識(shí)的情況下顯著增加優(yōu)化性能的機(jī)會(huì)。
延遲交易
EOS.IO 軟件支持延遲交易,這是一種被調(diào)度到將來執(zhí)行的交易。這使得計(jì)算能夠被分配到不同的分片中,并且能夠創(chuàng)建持續(xù)調(diào)度執(zhí)行連續(xù)交易并長(zhǎng)時(shí)間運(yùn)行的進(jìn)程。
上下文無關(guān)的操作
上下文無關(guān)的操作是指包含僅依賴交易數(shù)據(jù),而不依賴區(qū)塊鏈狀態(tài)的計(jì)算。比如說,簽名驗(yàn)證這種計(jì)算,只需要交易數(shù)據(jù)和簽名以確定簽署交易公鑰。在區(qū)塊鏈必須執(zhí)行的單個(gè)計(jì)算中,這是最昂貴的一種,然而由于這種計(jì)算是上下文無關(guān)的,所以它可以被并行執(zhí)行。
上下文無關(guān)的操作和用戶的其他操作類似,只是它們無需訪問區(qū)塊鏈狀態(tài)來執(zhí)行驗(yàn)證。這不僅使得 EOS.IO 軟件能夠并行地處理所有上下文無關(guān)的操作,比如簽名驗(yàn)證;更重要的是,還可以實(shí)現(xiàn)通用簽名驗(yàn)證。
通過支持上下文無關(guān)的操作,Sharding,Raiden,Plasma,State Channels 等擴(kuò)容技術(shù)變得更加可并行和實(shí)用。這項(xiàng)技術(shù)的開發(fā)可以實(shí)現(xiàn)高效的區(qū)塊鏈間通信和潛在的無限可擴(kuò)展性。
治理(Governance)
治理是指人們?cè)谏鐓^(qū)中的一系列管理流程,借此人們可以:
就那些軟件算法無法完全捕獲的集體行動(dòng)的主觀問題達(dá)成共識(shí)
執(zhí)行他們做好的決定
通過章程修正案來修改治理規(guī)則
基于 EOS.IO 程序的區(qū)塊鏈實(shí)現(xiàn)的治理過程,可以有效指導(dǎo)區(qū)塊生產(chǎn)者的現(xiàn)有影響。先前的區(qū)塊鏈由于缺少明確的治理過程,而依賴于臨時(shí)的、不正式的治理過程,常引起爭(zhēng)議,最終導(dǎo)致結(jié)果不可預(yù)測(cè)。
基于 EOS.IO 程序的區(qū)塊鏈所認(rèn)可的是權(quán)利來源于將那些權(quán)利委托給區(qū)塊生產(chǎn)者的代幣持有者。區(qū)塊生產(chǎn)者被賦予了受限且經(jīng)過驗(yàn)證的權(quán)限,他們可以利用這些權(quán)限,完成賬戶凍結(jié),更新有缺陷的程序,或者提議對(duì)基本協(xié)議的硬分叉更改。
區(qū)塊生產(chǎn)者選舉是集成于 EOS.IO 程序之中的。在對(duì)區(qū)塊鏈做任何更改之前,這些改動(dòng)都必須經(jīng)過這些區(qū)塊生產(chǎn)者的批準(zhǔn)。如果塊生產(chǎn)者拒絕執(zhí)行代幣持有者所希望的改變,那么塊生產(chǎn)者可能會(huì)被投票出局。如果區(qū)塊生產(chǎn)者在未經(jīng)代幣持有者允許的情況下做了更改,那么所有的其他非生產(chǎn)性全節(jié)點(diǎn)驗(yàn)證器(交易所等)則能夠拒絕掉這些更改。
凍結(jié)賬戶
有時(shí),智能合約的行為會(huì)發(fā)生異?;蛘咦兊貌豢深A(yù)測(cè),不再按預(yù)期執(zhí)行;或有時(shí),應(yīng)用程序或賬戶會(huì)發(fā)現(xiàn)某個(gè)行為會(huì)導(dǎo)致其過度消耗資源,當(dāng)這些問題不可避免地發(fā)生時(shí),區(qū)塊生產(chǎn)者有權(quán)去糾正這些問題。
區(qū)塊鏈上的所有區(qū)塊生產(chǎn)者都有權(quán)去確定哪些交易會(huì)被包含進(jìn)塊中,這使得他們有能力凍結(jié)賬戶。只要 EOS.IO 軟件中 21 個(gè)活躍生產(chǎn)者中的 15 個(gè)投票達(dá)成一致,即可授權(quán)凍結(jié)賬戶。如果生產(chǎn)者濫用該權(quán)力,那么他們則會(huì)被投票出局,被凍結(jié)的賬戶也將得以解凍。
更改賬戶代碼
當(dāng)所有其他辦法都失效且有一個(gè)"無法停止的程序"以不可預(yù)知的方式在運(yùn)行時(shí),使用 EOS.IO 軟件允許區(qū)塊生產(chǎn)者在不使用硬分叉的情況下替換這些賬戶的代碼。這種替換代碼的的請(qǐng)求類似于凍結(jié)賬戶的過程,需要至少 15 個(gè)區(qū)塊生產(chǎn)者投票通過。
章程(Constitution)
EOS.IO 程序允許區(qū)塊鏈建立點(diǎn)對(duì)點(diǎn)的服務(wù)條款,或是在簽署該協(xié)議的用戶之間綁定合約,我們稱之為"章程"。該章程規(guī)定,用戶之間不能完全由代碼來規(guī)定執(zhí)行的義務(wù),而是應(yīng)該通過建立管轄權(quán)和法律法規(guī)以及其他相互接受的規(guī)則來幫助解決出現(xiàn)的爭(zhēng)議。網(wǎng)絡(luò)上每筆交易的廣播都必須包含章程的哈希來作為簽名的一部分,從而明確地將簽署人綁定到合約中。
該章程還規(guī)定應(yīng)考慮源代碼協(xié)議的可讀性。該功能用于明確區(qū)分漏洞和功能,同時(shí)引導(dǎo)社區(qū)界定哪些修復(fù)是合適的,哪些是不合適的。
升級(jí)協(xié)議和章程
協(xié)議的正規(guī)源代碼以及章程規(guī)定,協(xié)議可以進(jìn)行更新。EOS.IO 程序規(guī)定更新過程如下:
區(qū)塊生產(chǎn)者提議對(duì)章程作出修改,并獲取到 15/21 的認(rèn)可。
區(qū)塊生產(chǎn)者在連續(xù)的 30 天保持并擁有對(duì)新章程的 15/21 的認(rèn)可。
所有用戶都必須表明接受新章程,并以此作為對(duì)未來交易處理的條件。
區(qū)塊生產(chǎn)者根據(jù)章程所發(fā)生的變化對(duì)源代碼進(jìn)行修改,并使用新章程的哈希將其提交至區(qū)塊鏈。
區(qū)塊生產(chǎn)者在連續(xù)的 30 天保持并擁有對(duì)新代碼的 15/21 的認(rèn)可。
對(duì)代碼所做的更改在 7 天后生效,當(dāng)源代碼得到正式批準(zhǔn)后,給予所有非生產(chǎn)完整節(jié)點(diǎn) 1 周的時(shí)間進(jìn)行升級(jí)。
所有未升級(jí)到新代碼的節(jié)點(diǎn)會(huì)自動(dòng)關(guān)閉。
默認(rèn)情況下,針對(duì) EOS.IO 程序所做的配置,以及通過更新區(qū)塊鏈來添加新功能的過程需要 2 到 3 個(gè)月的時(shí)間,而針對(duì)不需要對(duì)章程做更改的非關(guān)鍵性漏洞的修復(fù)更新可能需要 1 到 2 個(gè)月的時(shí)間。
緊急變更
如果軟件出現(xiàn)了會(huì)對(duì)用戶產(chǎn)生影響的漏洞或是安全問題,急需作出修復(fù),則區(qū)塊生產(chǎn)者可能會(huì)因此加快此過程。但是需要加速升級(jí)的方式,來引入新功能或者修復(fù)無害漏洞可能會(huì)與章程的規(guī)定相違背。
腳本和虛擬機(jī)
EOS.IO 軟件將會(huì)是賬戶間傳遞可信消息(稱之為"操作")的最重要的平臺(tái)。腳本語言和虛擬機(jī)屬于具體實(shí)現(xiàn),與 EOS.IO 的技術(shù)設(shè)計(jì)幾乎是相互獨(dú)立的。任何確定性的語言或者虛擬機(jī),只要性能足夠好,并支持沙盒運(yùn)行機(jī)制,都可以和 EOS.IO 的 API 整合起來。
范式定義的操作(Actions)
任何賬戶間的操作都滿足一定的范式,該范式也是區(qū)塊鏈共識(shí)狀態(tài)的組成部分。這一范式支持二進(jìn)制格式和 JSON 格式間的無縫轉(zhuǎn)換。
范式定義的數(shù)據(jù)庫
數(shù)據(jù)庫狀態(tài)也由類似的范式定義。這一范式使得所有應(yīng)用儲(chǔ)存的數(shù)據(jù)都遵循特定的格式,既能轉(zhuǎn)換為可讀性很強(qiáng)的 JSON 格式,又能以高效的二進(jìn)制格式存儲(chǔ)與操作。
通用多索引數(shù)據(jù)庫 API
開發(fā)智能合約需要一個(gè)事先定義好的數(shù)據(jù)庫來追蹤、存儲(chǔ)和查詢數(shù)據(jù)。開發(fā)者們普遍需要支持?jǐn)?shù)據(jù)排序或多字段索引的數(shù)據(jù)庫,來保證數(shù)據(jù)的一致性。
將認(rèn)證從從應(yīng)用中抽離
為了最大化并行運(yùn)算能力和最小化算力債(計(jì)算應(yīng)用狀態(tài)需要在交易日志中從頭運(yùn)算),EOS.IO 軟件將驗(yàn)證邏輯分成了三部分:
驗(yàn)證一個(gè)操作在內(nèi)部是一致的。
驗(yàn)證所有的前置條件是有效的。
修改應(yīng)用狀態(tài)。
驗(yàn)證操作的內(nèi)部一致性是只讀操作,且不需要區(qū)塊鏈狀態(tài)信息。這意味著這一操作可以最大程度地并行進(jìn)行。驗(yàn)證前置條件的有效性(比如必要的余額)也是只讀操作,因此也可以利用并行機(jī)制。只有修改應(yīng)用狀態(tài)這一步需要寫操作,并且對(duì)每個(gè)應(yīng)用必須嚴(yán)格按照順序執(zhí)行。
認(rèn)證是用來驗(yàn)證操作是否可以被執(zhí)行的一個(gè)只讀過程。而(操作涉及的)真正的業(yè)務(wù)則是應(yīng)用程序來完成的。當(dāng)一個(gè)操作發(fā)生的時(shí)候,這兩部分工作都需要實(shí)時(shí)計(jì)算。好消息是,一旦(包含該操作的)交易被打包進(jìn)了區(qū)塊鏈,認(rèn)證操作也就不再需要重復(fù)進(jìn)行了。
跨鏈通信
EOS.IO 的設(shè)計(jì)能促進(jìn)跨鏈通信,實(shí)現(xiàn)方式是簡(jiǎn)化生成操作存在證明和順序證明。這些證明和圍繞操作傳遞設(shè)計(jì)的應(yīng)用架構(gòu)一起,使得跨鏈通信的細(xì)節(jié)和驗(yàn)證工作對(duì)應(yīng)用開發(fā)者不可見,開發(fā)者看到的只是更高層次的抽象。
用于輕客戶端驗(yàn)證的默克爾證明
如果客戶端不需要處理全部交易的話,和其他區(qū)塊鏈的結(jié)合將變得非常容易。畢竟類似交易所這樣的客戶端,它只關(guān)心資產(chǎn)的轉(zhuǎn)入和轉(zhuǎn)出。理想情況下,交易所的鏈可以用轉(zhuǎn)賬交易的輕量默克爾證明(來完成交易所業(yè)務(wù)),而不是完全信任某個(gè)區(qū)塊生產(chǎn)者。每條鏈的區(qū)塊生產(chǎn)者都希望和其他鏈同步的開銷盡可能地小。
輕量客戶端驗(yàn)證(LCV)的目標(biāo)是生成相對(duì)輕量的存在證明,這些證明可以被任何關(guān)心一個(gè)輕量的數(shù)據(jù)集的客戶端用來驗(yàn)證。在上述例子中,LCV 的目的就是為了用來證明某筆交易已經(jīng)被包含進(jìn)某一特定區(qū)塊,而這一區(qū)塊已經(jīng)被某條特定的鏈所收錄。
比特幣支持交易驗(yàn)證的功能,這一功能基于一個(gè)假設(shè),那就是所有的節(jié)點(diǎn)都可以訪問到全部的區(qū)塊頭歷史數(shù)據(jù)(區(qū)塊頭數(shù)據(jù)每年增加 4MB)。在每秒 10 筆交易的吞吐下,一個(gè)驗(yàn)證用到的存儲(chǔ)空間約為 512 個(gè)字節(jié)。對(duì)于 10 分鐘一個(gè)區(qū)塊的比特幣來說,這是可行的。但對(duì)于擁有 0.5 秒的出塊速度的 EOS.IO 軟件來說,這個(gè)機(jī)制顯然不夠輕量。
任何有不可逆區(qū)塊頭數(shù)據(jù)的用戶在交易被區(qū)塊記錄后,都可以使用 EOS.IO 提供的輕量證明。輕量證明的哈希連接(hash-linked)結(jié)構(gòu)表明,最多只要 1024 個(gè)字節(jié),即可驗(yàn)證任何一筆交易的存在與否。
考慮到區(qū)塊鏈中的區(qū)塊的 id 和區(qū)塊頭都是可信的且不可逆的,因此證明某個(gè)區(qū)塊被包含在某個(gè)區(qū)塊鏈中也是可行的。這類證明最多只需 ceil(log2(N)) 次摘要計(jì)算即可完成,其中 N 為區(qū)塊鏈中的區(qū)塊個(gè)數(shù)。就 SHA256 這種摘要算法來說,你只需要 864 個(gè)字節(jié)就可以在一個(gè)有著 1 億個(gè)區(qū)塊的鏈上驗(yàn)證某個(gè)區(qū)塊的存在。
使用合適的哈希連接(hash-linking)機(jī)制生產(chǎn)區(qū)塊以啟用上述證明,幾乎不會(huì)帶來什么額外開銷,所以這種方式十分可行。
若要在其他鏈上驗(yàn)證證明,時(shí)間、空間和帶寬上都有很多優(yōu)化空間。追蹤全部的區(qū)塊頭(每年 420MB 遞增)可以將證明維持在比較小的空間占用。僅追蹤最近的區(qū)塊頭會(huì)在最小長(zhǎng)期存儲(chǔ)和證明大小之間實(shí)現(xiàn)平衡。另外也可以采用惰性求值的方式,記錄過去的證明的中間哈希值。新證明只需要包含已知的稀疏樹的連接。具體選取何種方式,取決于默克爾證明引用的帶有交易的外部區(qū)塊的比例。
當(dāng)互聯(lián)和耦合程度達(dá)到一定的復(fù)雜度之后,將兩條鏈的數(shù)據(jù)合并將更簡(jiǎn)單高效,如此一來也就不再需要默克爾證明了。因?yàn)樾阅艿脑?,跨鏈證明的頻度當(dāng)然是越小越好。
跨鏈通信的延遲
當(dāng)和外部區(qū)塊鏈進(jìn)行通信的時(shí)候,區(qū)塊生產(chǎn)者必須要 100% 確認(rèn)一筆交易已經(jīng)被不可逆轉(zhuǎn)地寫入到外部區(qū)塊鏈之后,才可以將其當(dāng)作合法輸入。EOS.IO 的區(qū)塊鏈加上 DPOS 算法 0.5 秒的出塊速度,結(jié)合拜占庭容錯(cuò)機(jī)制,使得等待上述確認(rèn)的時(shí)間大約為 0.5 秒。任何區(qū)塊生產(chǎn)者若違背上述原則,不等待確認(rèn)即開始下一步操作,例如交易所在未確認(rèn)的情況下就將資產(chǎn)沖入用戶賬戶,隨后又將資產(chǎn)取消的行為,都將影響區(qū)塊鏈的共識(shí)機(jī)制。EOS.IO 軟件使用 DPOS 算法結(jié)合拜占庭容錯(cuò)機(jī)制快速實(shí)現(xiàn)交易的不可逆性。
完整性證明
當(dāng)外部的區(qū)塊鏈?zhǔn)褂媚藸栕C明的時(shí)候,去知曉處理的全部交易全部有效,迥異于去知曉沒有交易被跳過或省略。因?yàn)橄胍C明"最近全部的交易都已經(jīng)被知曉"是不可行的,而證明“交易歷史記錄里沒有被跳過的交易”則很容易。EOS.IO 軟件通過給發(fā)送到每個(gè)賬戶的每個(gè)操作一個(gè)順序編號(hào)來實(shí)現(xiàn)這一點(diǎn)。用戶可以使用這些順序編號(hào)來驗(yàn)證某個(gè)特定賬戶的所有操作都已經(jīng)被處理,并且是嚴(yán)格按照順序來處理的。
隔離見證(SegWit)
隔離見證(SegWit)是指一筆交易被打包進(jìn)不可變更的區(qū)塊鏈之后,這筆交易的簽名就與交易無關(guān)了。一旦交易變?yōu)椴豢勺兏鼱顟B(tài),簽名數(shù)據(jù)就可以被舍棄,其他人仍然能獲得區(qū)塊鏈當(dāng)前狀態(tài)??紤]到簽名數(shù)據(jù)容量占據(jù)了多數(shù)交易的很大部分,隔離見證將能大幅縮減磁盤占用和數(shù)據(jù)同步時(shí)間。
隔離見證的概念對(duì)用于跨鏈通信的默克爾證明同樣適用。一旦一個(gè)證明被接受并被不可逆地記錄進(jìn)區(qū)塊鏈,那么這個(gè)證明用到的 2KB 大小的 sha256 哈希值就可以在不影響區(qū)塊鏈狀態(tài)的前提下被舍棄。值得一提的是,將隔離見證用于跨鏈通信節(jié)省的存儲(chǔ)空間的是常規(guī)簽名場(chǎng)景下的 32 倍。
隔離見證應(yīng)用的另一個(gè)場(chǎng)景則是用于(存儲(chǔ)) Steem 的博客文章。利用隔離見證,存儲(chǔ)在區(qū)塊鏈上的將只是一篇篇博客內(nèi)容的 sha256 哈希值,真正的內(nèi)容則存儲(chǔ)于隔離見證數(shù)據(jù)中。區(qū)塊生產(chǎn)者只需要依靠?jī)?nèi)容的哈希值就可以驗(yàn)證文章的存在。要從交易日志中恢復(fù)區(qū)塊鏈當(dāng)前狀態(tài),生產(chǎn)者無需存儲(chǔ)全部的內(nèi)容。這樣一來,以下的證明方式變得可行:內(nèi)容只要曾經(jīng)有人看過即可,無需永久儲(chǔ)存。
結(jié)束語
EOS.IO 軟件的設(shè)計(jì)理念來源于已被證實(shí)的概念和最佳實(shí)踐,代表了區(qū)塊鏈技術(shù)的重大進(jìn)步。作為未來全球范圍區(qū)塊鏈社會(huì)的宏偉藍(lán)圖的組成部分,EOS.IO 使得去中心化應(yīng)用(dApp)的開發(fā)、部署和管理變得更加容易。