另一方面,Cartesi Machines執行的鏈下計算必須透過區塊鏈進行驗證。 因此,區塊鏈必須承載整個架構的參考和實施。 如果它永遠值得信任,那麼這種實施必須易於審計。為此,架構和實施都必須是開放的並且相對簡單。 這些要求共同指向RISC-V。 RISC-VISA基於最小的32位整數指令集,可以新增幾個擴充套件[Waterman和Asanovic'2017a]。 正交地,運算元和地址空間寬度可以擴充套件到64位(甚至128位)。 此外,該標準還定義了一種特權架構[Waterman和Asanovic'2017b],它具有現代作業系統常用的功能,例如基於分頁的多個許可權級別。
虛擬記憶體,定時器,中斷,異常和陷阱等。自由選擇更適合其需求的擴充套件組合得以實現。
RISC-VRISC-V於2010年始於加州大學伯克利分校,並於2015年成立基金會。包括谷歌,三星和特斯拉在內的大型企業最近也開始使用該項技術[Tilley 2018]。 該平臺由高活躍度的社羣開發者提供支援,他們耗費大量精力搭建了軟體的基礎底層,最著名的是Linux作業系統的埠和GNU工具鏈[RISC-V 2018d]。但關鍵的是,RISC-V並不是耍花槍的技術架構。它已在本地硬體之上執行,而且SiFive公司目前已將其商業化。這意味著,未來Cartesi將不僅限於模擬或二進位制鏈下翻譯。
Cartesi Machine可以分為處理器和“主機板B”,處理器執行計算,執行傳統的獲取 - 執行迴圈同時,保留了各種暫存器。該“主機板B”透過各種儲存器(ROM,RAM,快閃記憶體)和裝置定義周圍環境。 為了使驗證成為可能,Cartesi Machines以明確定義的方式將其整個狀態對映到實體記憶體。這包括處理器,主機板和所有連線裝置的內部狀態。幸運的是,此修改不會以任何重要方式限制作業系統或其承載的應用程式。
1. 處理器
遵循RISC-V術語,Cartesi Machines實施RV64IMASU ISA。 RV之後的字母指定擴充套件集。 此選擇對應於64位計算機,具有乘法和除法的整數算術,原子操作以及可選的Supervisor和使用者許可權級別。 此外,Cartesi Machines支援Sv48地址轉換和記憶體模式。
圖1:iflags暫存器提供當前許可權級別,並指定機器是暫時空閒等待中斷還是已永久停止。
保護。 Sv48提供48位受保護的虛擬地址空間,分為4KiB頁面,由四級頁表組成。 這組功能在區塊鏈實施所要求的簡單性和鏈下計算所期望的靈活性之間創造了平衡的折衷。
總共有99條指令,其中28條指令分別縮小或加寬,分別為64位或32位指令。 表1分解了每個擴充套件的指令計數。 這是一個RISC ISA,大多數指令非常簡單,可以在幾行高階程式碼中進行模擬。實際上,唯一複雜的操作是虛擬到實體地址轉換。由於格式數量減少(僅為4,佔用32位),指令解碼變得特別簡單。
整個處理器狀態適合512位元組,分為n至64個暫存器,每個暫存器保持64位。這些暫存器中的大多數由RISC-V ISA定義,由32個通用nteger暫存器和26個控制和狀態暫存器組成。 剩下的是Cartesi特有的。 處理器透過將各個暫存器對映到物理儲存器中的最低512位元組,使其整個狀態可用,外部和只讀。 相鄰的1.5KiB保留供將來使用。整個對映在表2中給出。
名稱以i開頭的暫存器是特定於Cartesi的,並具有以下語義。 暫存器iflags的佈局如圖1所示.PRV給出當前的許可權級別,當處理器空閒時(即,等待中斷),I設定為1,H設定為1,表示處理器已永久存在暫停。 暫存器ilrsc儲存LR / SC原子儲存器操作的保留地址預設初始化使用以下值填充狀態:
•iflags中的PRV設定為3(對於機器許可權級別);
•misa設定為RV64IMASU;
•mstatus中的SXL和UXL設定為2(64位);
•pc從0x1000開始(指向ROM);
•marchid設定為ASCII格式的cartesi␣。
mvendorid用於測試匹配的鏈上和鏈外實施。 每次更新匹配對時,mimplid都會遞增。剩餘的預設狀態設定為零。
2. 主機板
主機板和處理器之間的互動透過對映到處理器實體地址空間的裝置進行。 表3顯示了這種對映。 從地址0x1000開始有64KiB的ROM,執行開始。 這個ROM的核心作用是持有描述系統硬體的裝置[DTSpec 2017]。 此外,ROM-base的載入程式將x10暫存器設定為0(mhartid的值),x11指向裝置,然後跳轉到RAM-base為0x80000000。 這是啟動映像的入口點所在的位置。 最後,可以為快閃記憶體裝置留出一些額外的實體記憶體範圍。 這些通常會預先載入檔案系統映像。
2 x86 ISA定義了至少2000條(可能很複雜的)指令
圖2:實體記憶體屬性。每個範圍的istart和ilength與4KiB邊界對齊。 每個64位字的12個LSB給出了該範圍的屬性。
兩個非記憶體裝置對映到地址空間。 核心本地中斷器(或CLINT)控制定時器中斷。有效地址分別為0x0200bff8和0x02004000,對映到暫存器mtime和mtimecmp。 只要mtime等於mtimecmp,CLINT就會發出硬體中斷。 為了確保可重複性,處理器的時鐘和定時器標介面(HTIF)調解與外部世界的通訊。其活動地址為0x40000000(tohost)和0x40000008(fromhost)。它在寫入tohost時停止機器,位63-48設定為0,位0設定為1.(位47-1可以設定為任意退出程式碼。)它也可以作為互動式部分的基本通訊埠。
實體記憶體對映由實體記憶體屬性記錄(PMA)描述。每個PMA由2個64位字組成。 第一個單詞給出一個範圍的開頭,第二個單詞給出它的長度。 由於範圍必須與4KiB頁邊界對齊,因此每個字的最低12位可用於屬性。 圖2顯示了每個屬性欄位的含義。 M,IO和E位是互斥的,分別將範圍標記為記憶體,I / O對映或排除。 R,W和X位分別授予讀,寫和執行許可權。 最後,IR和IW位分別將讀取和寫入的範圍標記為冪等。
該主機板支援總共32個PMA,並使它們以只讀方式可用,從實體記憶體中的偏移量2KiB開始。 另外2KiB留作將來使用。 PMA 0描述RAM,PMA 16-23描述快閃記憶體裝置0-7。 這些PMA在初始化期間是使用者可配置的,之後是隻讀的。 (RAM istart欄位被硬編碼為
0x80000000。)這些記錄一起限制了計算期間可訪問的最大儲存量。
3. 狀態轉換函式
機器計算的序列是s0 , s1 , . . . , sh,由過渡函式管理,使得
回想一下,此狀態由Cartesi machine的64位地址空間中每個字的值組成。 實際上,表示一個狀態需要的花費少於2 個位元組。 只有表3中描述的區域必須明確定義。 所有剩餘值都可以隱含地用零填充。
RISC-V ISA手冊[Waterman和and Asanovic'2017a,b]指定了與每個結構執行相對應的狀態轉換。 這意味著在執行的指令之間很好地定義了狀態。 由於所有指令都可以在O(1)時間內實現,因此Cartesi將每個狀態轉換定義為恰好1個週期。 可以從相應的序列中讀取序列中給定狀態的索引。
表3:Cartesi machine的實體記憶體佈局。
mcycle的價值。 (請注意,由於機器偶爾會空閒,因此minstret不會跟蹤mcycle。)唯一顯著的是Cartesi特定修改涉及停止機器。當iflags中的欄位H設定為1時,不允許進一步的狀態轉換。 當指示HTIF停止機器時,將顯式設定條件。
4. Linux埠
從頭開始設定Linux系統涉及到的各個步驟。與獨立系統不同,嵌入式系統通常不是自託管。相反,元件構建在單獨的主機系統中,在該系統上安裝了目標體系結構的交叉編譯工具鏈。 關鍵元件是GNU編譯器集合和GNU C庫。 此基礎結構可在RISC-V GNU工具鏈儲存庫[RISC-V 2018a]中找到。第一步是要建立這種基礎項設定。
然後可以使用工具鏈交叉編譯Linux核心。 核心原始碼可以在RISC-V Linux儲存庫[RISC V 2018b]中找到。核心以管理模式執行,位於在機器模式填充程式提供的Supervisor二進位制介面(SBI):Berkeley引導載入程式(BBL)。 BBL可以在RISC-V代理核心庫[RISC-V 2018e]中找到。由此產生的引導映像被預載入到RAM中。 SBI提供了一個簡單的介面,核心透過該介面與CLINT和HTIF協同工作。除了實現SBI之外,BBL還安裝了捕獲無效指令異常的陷阱。此機制可用於模擬浮點指令。 安裝陷阱後,BBL切換到管理員模式並將控制權交給核心入口點。
最後一步是建立根檔案系統。 此過程從主機系統中的根目錄開始,該目錄包含一些子目錄(sbin,lib,var等)和文字檔案(sbin / init,etc / fstab,etc / passwd等)。 許多常見的UNIX實用程式(ls,cd,rm等)的微小版本可以組合成單個二進位制檔案[Vlasenko2018]。 目標可執行檔案通常依賴於工具鏈(lib / libm.so,lib / ld.so和lib / libc.so)提供的共享庫。當然,必須將這些庫複製到根檔案系統。一旦根目錄準備繼續,就將其複製到實際的檔案系統映像中(例如,使用gene2fs)。
這些步驟可以自動化。Cartesi的SDK以便捷的Docker容器形式為開發者提供了預配置的主機環境。複雜的Linux系統可以在Sifive的Buildroot [Petazzoni 2018]的分支,或Yocto專案的RISC-V埠[RISC-V 2018c]的幫助下構建。容器中的環境使開發者能夠根據應用程式的需要自定義啟動映像和根檔案系統。成千上萬的軟體包可供安裝。
圖3:使用128MiB RAM和64MiB快閃記憶體裝置進行簡單設定的部分裝置,作為根檔案系統安裝。
在完成自己的初始化後,核心最終將控制權交給/ sbin / init。 在Cartesi DApps中,這通常是一個shell指令碼,它呼叫適當的命令序列來執行以形成所需的計算。核心在bootargs中的分隔符␣-after之後將所有引數作為命令列引數傳遞給/ sbin / init。這些引數可用於為要執行的計算定義附加引數。完成後,/ sbin / init使用HTIF透過可選的退出程式碼暫停機器。 這可以用作計算輸出的一部分。 任意複雜的輸入,引數和輸出都可以作為快閃記憶體裝置傳遞。
cartesi機器的非鏈實現有兩個目的,它們的主要作用是執行計算本身。第二個作用是支援解決有關計算結果的爭議。為了提供這些服務,cartesi機器的非鏈實現必須公開可程式設計介面。
區塊鏈中的Cartesi Machine
回想一下,Cartesi是一個開發分散應用程式的平臺。Cartesi DApps使不相互信任的各方能夠在區塊鏈中籤訂一份取決於鏈下計算結果的約束性合同。使用”Alice”和”Bob”這些角色代表這些派對很方便。請注意,”Alice”和”Bob”是角色,而不是人。它們甚至可能代表相互競爭的集體利益。實際上,這兩個角色都將由Cartesi節點自動播放,以捍衛控制節點執行的鏈下計算機的人的利益。因此,Cartesi DApps是在區塊鏈中執行的一組智慧合約與在”Alice”和”Bob”的節點上執行的鏈下軟體之間的協作。作為一般規則,同一DApp開發者負責智慧合約和DApp特定的鏈下軟體。查理將扮演DApp開發者的角色。”Alice”和”“Bob””信任查理,否則他們不會與他的DApp交往。然而,查理既不信任”Alice”也不信任”“Bob””。當然,”Alice”和”“Bob””也不相互信任。
Cartesi的角色是支援查理的工作。為此,Cartesi提供了各種原語,Charlie用它來調解”Alice”和”Bob”之間潛在的對抗性互動。一些原語不需要互動,可以在區塊鏈中從輸入中自主地進行評估。然而,有趣的原語是那些雖然完全由它們的輸入定義但只能在鏈外進行評估的原語。透過構造,當使用Cartesi DApp時,”Alice”和”Bob”總是同意這些原語的輸入。在不失一般性的情況下,”Bob”評估原始的離線鏈並提交結果。然後”Alice”有機會接受或拒絕”“Bob””的結果。查理的DApp可以使用無可爭議的結果來達到他選擇的目的。如果被拒絕,Cartesi將與”Alice”和”Bob”一起參與爭議解決協議,該協議以正當理由對仲裁方進行仲裁。這種判斷總是在幾次互動中完成,並且對區塊鏈的計算成本可以忽略不計。
Cartesi以對查理極為方便的方式自動化大部分過程。
這些原語中最重要的是Cartesi機器。智慧合約無法在區塊鏈中儲存Cartesi機器的狀態,更不用說執行隱含的計算了。畢竟,處理能力和儲存容量方面的成本都是令人望而卻步的。為了解決這些問題,Cartesi使用加密雜湊來簡潔地表示區塊鏈中的機器狀態。從區塊鏈的角度來看,計算只是一對與機器的初始和最終狀態相對應的雜湊。由這種雜湊所對應的儲存器的內容僅在鏈外已知。 Cartesi定義了各種附加原語,允許智慧契約方便地操縱與這些雜湊相對應的狀態的內容。
未來的工作
本文件的重點是核心功能,以及DApps用於直接指定,控制和驗證鏈外計算的介面。Cartesi平臺將提供在核心上構建的幾個附加元件,或擴充套件其範圍。這些將在未來的出版物[Teixeira和Nehab 2019a,b]中更詳細地描述。
資料可用性 Cartesi透過保持僅鏈上Merkel樹的離線資料雜湊來彌補區塊鏈的嚴重儲存限制。如第5.2節所述,Cartesi假定參與驗證角色的所有各方都可以訪問這些資料。在某些應用中,這很難保證。特別是,必須減輕資料扣留攻擊的風險,其中一方向區塊鏈提交雜湊值,同時拒絕向其他人提供此資料。
資料可用性問題是區塊鏈共識演算法設計中的一個主要問題[Buterin 2012]。但是,在地方共識的背景下,這個問題變得更加簡單。 Teixeira和Nehab [2019a]提供了幾種設計模式,用於在驗證期間處理資料可用性。資料通道,裝置加密和資料分類帳可確保Cartesi DApps可能遇到的所有情況下的可用性。
可用性 廣泛採用塊鏈技術的主要障礙之一是DApp使用者遇到的不便。儘管關於集中式應用程式可用性的文獻仍然適用於分散式應用程式,但從使用者體驗的角度來看,區塊鏈特性還沒有得到充分解決。 Teixeira和Nehab [2019a]描述了開發簡單直觀的DApps的幾種設計模式。
例如,Cartesi將為交易代幣提供自動化基礎設施。這將使使用者免於擔心每個DApp內使用的不同令牌。還將提供外包延期行動的系統。這將使使用者即使在參與需要在嚴格期限內與區塊鏈互動的協議時也可以關閉他們的機器。在這種情況下,代理方將代表使用者行事以換取費用。 (與第6.2節中描述的爭議委託市場非常相似。)使用加密時間鎖[Rivest等.1996年]還將適應使用者必須在未來揭示不應立即傳遞給代理方的秘密的情況。將描述其他可用性構造以促進檔案傳輸並降低Gas成本。這些設施將使Cartesi DApps的使用者體驗更接近當前的集中式解決方案。
Cartesi SDK 隨著Cartesi SDK的釋出,可以使用各種更高階別的API來封裝核心的典型用例。這些將包括上述可用性和資料可用性解決方案,以及Cartesi節點的容器和CartesiMachine的開發。隨著時間的推移,SDK中可用的API將大大減少DApps區塊鏈元件的大小和複雜性。相反,這將顯著增加DApps對多條區塊鏈的跨鏈可移植性。Cartesi SDK將在開源中分發並廣泛記錄[Teixeira和Nehab 2019b]。
Cartesi Machine的擴充套件 Cartesi Machine可以透過兩個令人興奮的新裝置進行擴充套件。
Dehashing裝置為應用程式提供了遍歷雜湊指標資料結構的能力。在Cartesi Machine內執行的程式可以使用Dehashing裝置來讀取僅給定其雜湊的區塊的內容。雖然這種操作一般是不可能的,但是當所有各方事先知道允許區塊的範圍時,它變得可能。最直接的應用是區塊鏈本身。當Cartesi Machine執行時,Dehashing裝置查詢預載入在主機中的雜湊表,查詢與雜湊匹配的區塊。如果出現爭議,任何一方都可以提出該區塊作為與所需雜湊匹配的證據。透過這種方式,dehashing裝置可以實現區塊鏈內省。締約方可以簽訂合同,這些合同取決於合同本身定義的區塊鏈的整個狀態。這就有很多有價值的應用,特別是在期貨市場。
另一個計劃的裝置是及時的資料埠。該埠透過將進入或離開機器的資料包與事件中的mcycle值繫結,實現Cartesi Machine之間的可重複通訊。 DApps可以安排在給定的未來mcycle發生資料包傳送。 Cartesi Machine也可以回滾到mcycle進行交付。及時的資料埠在向Web 3.0的發展方面開闢了新天地。它將啟用涉及多個Cartesi Machine之間直接協作的DApps。
群體爭議 可以設想涉及許多獨立參與者的應用程式,每個參與者在鏈外計算的結果中都有一些利益。 在這種情況下,至關重要的是要防止一群不誠實的參與者使用連續的爭議而不是誠實的結果作為對合同的拒絕服務攻擊。 我們開發了一種驗證遊戲的變體,使任何誠實的參與者能夠以可忽略的成本為整個人群辯護他的結果。 當需求變得明顯時,Cartesi平臺將擴充套件為支援這種變體。
結論
本文為Cartesi平臺奠定了理論基礎。 Cartesi的使命是幫助DApp開發者為他們的使用者構建更加有競爭力的產品。伴隨任意正規化的轉變,區塊鏈為實際創新和風險帶來了機遇“車輪改造”。秉持著“簡約而簡單”的開發原則,Cartesi的核心目的是要使開發者更容易的上手,更簡便的提升開發效率。未來的文件[Teixeira和Nehab 2019a]中描述的Cartesi平臺的剩餘元件將幫助開發者在利用區塊鏈的獨特潛力時釋放他們的創造力。
關於更多Cartesi資訊:https://cartesi.io/
更多區塊鏈專案介紹:http://www.qukuaiwang.com.cn/news/xiangmu
風險提示:區塊鏈投資具有極大的風險,專案披露可能不完整或有欺騙。請在嘗試投資前確定自己承受以上風險的能力。區塊網只做專案介紹,專案真假和價值並未做任何稽覈!