Blockstack 去中心化計算網路

買賣虛擬貨幣
今天的網際網路,已經發展了四十多年,從一個小型的科研專案,成長為數字觸角伸向世界的龐然大物。儘管核心的底層網際網路協議自20世紀90年代以來基本保持一致,網際網路的應用層和服務架構卻發生了極大的變化,以支援網際網路應用的爆發式增長。建設網際網路應用的基本模型是上世紀90年代流行起來的客戶端/伺服器模型。該模型短期利好,但長期帶來很多負面後果。Web應用順勢而起,但是導致Web服務愈加依賴於遠端伺服器。雲端計算是基礎的客戶端/伺服器模型的一個演進。今天,在雲端儲存著私有的使用者資料,執行著應用業務邏輯和計算,管理著訪問許可權,等等。最近的十年裡,我們開始看到雲端計算帶來的負面後果,人們由此開始質疑基於客戶端/伺服器開發軟體的完整模型。大規模的資料洩露, 使用者隱私的喪失,資料缺乏可移植性,以及根植於客戶端/伺服器模型核心設計帶來的科技巨頭間廣泛的互不信任。鑑於計算在人類社會中的重要性與日俱增,我們不能讓過時的計算模型來定義我們現在的生活方式。雲端計算的下一步演進將利用更強勁的客戶端裝置、邊緣計算和全球連線以減少對這些中心化平臺的依賴。趨勢已經朝著去中心化計算演進,我們相信這是計算機工業自大型機轉向桌面電腦以來最重大的技術變遷。去中心化計算可以改變軟體如何構造和使用。其提供給開發者一系列新的工具,改變了使用者和軟體之間的關係:軟體的存在是保護使用者,軟體的最佳化是為使用者利益至上。Blockstack是一個開源軟體產品,在開源社羣中設計、開發、成長為一個去中心化計算網路,為傳統的雲端計算提供一個全棧的替代。Blockstack正在重新構想傳統網際網路的應用層,為去中心化應用提供一個全新網路;構建於Blockstack之上的應用將使使用者擁有和直接控制他們自己的資料。Blockstack使用現存的網際網路傳輸層協議以及底層的通訊協議,但是移除了應用層裡的中心點。我們遵循端到端的設計原則,以保持網路核心簡單,而將複雜性推送到客戶端。為了應用的可擴充套件性,我們將全域性狀態變化最小化,提供一個可靠的去中心化儲存系統,其相比雲端儲存效能相當。而且,我們的全棧方法為所有開發者構建去中心化應用必須的棧元件提供了預設的選項。Blockstack是模組化的,開發者可以輕易定製和整合其他替代技術。設計目標
Blockstack的設計最佳化源於下列屬性:1. 易使用。去中心化應用應該像現在的網際網路應用一樣容易被終端使用者所使用。此外,開發去中心化應用應該像在今天的雲上開發一樣容易。2. 可擴充套件。去中心化應用應該可以支援網際網路級別的使用者量,也就是數億到十億的使用者量。為了達到這點,網路(包括區塊鏈)必須可以隨使用者數和執行的應用數量進行擴充套件。3. 使用者控制。採用去中心化計算的應用應該預設由使用者控制。使用者應該可以提供自己的計算和儲存資源,而不是依賴於應用運營的伺服器。帶著這些設計目標,Blockstack做出了自己的設計選擇,將其與其他的“重”區塊鏈和“世界計算機”設計哲學的去中心化計算方案區別開來。最小化區塊鏈層的邏輯和狀態:為了取得可擴充套件性,Blockstack在我們的“輕”區塊鏈層最小化了應用的邏輯和資料。使用區塊鏈操作記錄應用邏輯和儲存,本質上要比“鏈下”方法要慢。需要在全網範圍和裝置間同步和驗證狀態,顯示出這種操作在吞吐量上極大的侷限性。限制因素在於底層的全域性連通頻寬和典型網路節點上可用的記憶體/儲存,也就是物理限制(而不是任何協議的限制)。
本地狀態變化 vs. 全域性狀態變化:Blockstack平臺使用全棧方法確保構建在Blockstack上的應用是可擴充套件的:與應用的互動儘可能改變本地的狀態,而不是全域性的狀態。正因為此,我們的儲存系統和認證協議是我們平臺的基礎元件——其使得應用不發起一個區塊鏈交易,就可以和使用者的私人資料儲存互動,並且完成使用者認證。Stacks區塊鏈僅用於在去中心化的環境中,以一種一致的方式協調全域性狀態的變換(例如:註冊一個全域性唯一的使用者名稱)。可靠的雲端儲存 vs. 對等儲存:在Blockstack上構建的應用,其資料儲存和使用者是一體的(使用使用者自己的私人資料鎖櫃),不需要在伺服器端儲存任何使用者訪問憑證。這種方式不僅將使用者資料交由使用者自己控制,而且為開發人員降低了複雜度:開發人員無需執行伺服器和資料庫,從而代替使用者支付雲服務的賬單。此外,我們避免了點對點儲存固有的可靠性和效能問題,在一個去中心化的廣域檔案系統中改變了現有云儲存提供商的位置——區塊鏈層只儲存指向使用者資料鎖櫃的指標。適用開發者的全棧SDK:Blockstack提供全棧方法,為開發去中心化應用所需的所有層提供了預設的選項。開發者SDK將區塊鏈的複雜性和其他開發技術抽離;應用開發者能夠使用Blockstack SDKs輕鬆構建他們的應用。技術棧的不同層次是模組化的,可以根據需要使用其他技術。與同期的去中心化計算方法除了這些不同外,我們的智慧合約語言也做了獨特的設計決策來最佳化智慧合約的安全和可預測性。新應用模型Blockstack為開發者構建應用提供了一個新的模型,確保應用是去中心化的,而且預設是由使用者控制的:
1. 無不透明資料庫:在客戶端/伺服器模型中,資料庫是所有應用的核心組成部分,因為服務端需要儲存和查詢大量的使用者資料。在去中心化計算中,開發者無需擔心資料庫的維護和安全問題,因為他們從一開始就不做資料託管。開發者更多聚焦在應用邏輯上,使用者下載應用後,接入他們的私人資料鎖櫃。如果使用資料庫的話,其功能等同於過去網際網路的“搜尋檢索器”——索引公共資料的服務。任何人都可以使用底層(去中心化)的資料建立這些索引。2. 無伺服器:在客戶端/伺服器模型中,應用透過增加伺服器擴容,因為所有的計算都在服務端執行。在去中心化計算中,應用在客戶端執行,每個使用者將自身的計算和儲存能力帶入網路(而不是依賴於應用開發者)。開發者只需提供最少的基礎設施託管應用程式碼,因為每個使用者自帶所需的儲存和計算資源使用應用。3. 智慧合約:在客戶端/伺服器模型中,全域性狀態變化由一箇中央伺服器協調,其是網路真理的唯一權威。在去中心化計算中,這些狀態的變化是透過執行於一個開放區塊鏈之上的智慧合約解決的。4. 去中心化認證:傳統的網際網路中,使用者認證透過使用某種信任的認證流程進行。如果應用維護了一個使用者資料庫,該應用透過密碼認證使用者,有時加入第二因子。如果應用依賴於某個第三方認證服務,像Google或Facebook,該應用將使用OAuth協議從第三方認證服務獲得驗證結果。顯然,在所有這些方法中使用者自己無法控制認證流程。在去中心化計算中,認證由使用者的客戶端執行,透過加密數字簽名證明對區塊鏈上註冊的某個使用者名稱的控制權。任何應用都可以獨立驗證證明。5. 原生代幣:在傳統的網際網路應用中,支付通常採用像信用卡一樣的第三方服務。數字代幣是去中心化計算平臺上的原生資產,如Blockstack和以太坊。使用者對代幣有直接的所有權,可以使用它們直接註冊數字資產和智慧合約,也可以支付智慧合約的執行費用。這種原生代幣的使用可透過智慧合約程式設計,構建軟體訂閱服務,也可以自動化其他的應用功能。這種可程式設計的代幣是傳統網際網路應用開發者無法得到的能力。去中心化計算層次結構
Blockstack去中心化計算網路邏輯上位於傳統網際網路架構的“應用層”。然而,Blockstack網路自身由多個系統組成,共同為實現去中心化應用提供必需的元件:1. Stacks區塊鏈:Stacks區塊鏈是Blockstack網路的基礎。Stacks區塊鏈使使用者可以註冊和控制數字資產,如通用使用者名稱,並且可以註冊/執行智慧合約。像通用使用者名稱這樣的數字資產,允許使用者接下來控制他們的儲存以及更多功能——使用者將其私有資料鎖櫃的訪問憑證與其通用使用者名稱進行連線。2. Gaia:Gaia是一個使用者控制的儲存系統,使應用可以和私人資料鎖櫃互動。私人資料鎖櫃可以在一個雲服務提供商,或者是其他的資料儲存服務商託管。重要的是,使用者控制使用哪一個提供商。Gaia上的資料經過加密,並使用使用者金鑰在客戶端側簽名。使用者的資料鎖櫃(data locker)可以透過查詢Stacks區塊鏈上的資訊發現。3. Blockstack認證:Blockstack認證協議是應用的去中心化認證協議。透過該協議使用者可以使用自己擁有的ID進行認證,並且設定使用哪個Gaia伺服器儲存該使用者的應用資料。4. Blockstack程式庫和開發包:開發者程式庫(Libraries)和開發包(SDKs)位於平臺堆疊的頂端,應用開發者和使用者以此和Blockstack網路的不同元件進行互動。例如,Blockstack客戶端軟體允許使用者註冊並管理自己的ID。Blockstack的開發者程式庫使開發人員構建Blockstack應用像構建傳統的Web應用一樣簡單。Stacks區塊鏈
Stacks區塊鏈是Blockstack網路的基礎層。Stacks區塊鏈為網路提供了全域性共識和協調層,產生了Blockstack網路的原生代幣,稱為“Stacks token”。當使用者註冊通用使用者名稱,軟體許可,儲存鎖櫃的指標等數字資產時,需要消耗Stacks代幣作為“燃料”。當註冊/執行智慧合約時,Stacks代幣也被用於支付給礦工。本章我們展示Stacks區塊鏈的高階設計。關於這些設計如何實現和演進的細節,我們建議您閱讀不同元件的SIP(Stacks Improvement Proposals)1。當更多的SIP被Stacks改程序序接受時,我們將更新本篇白皮書。Stacks區塊鏈體現瞭如下的設計決策:1.一個可調諧的工作量證明(tunable proof-of-work)機制用於領導人選舉2.一個燃燒證明(proof-of-burn)挖礦演算法來重用現有區塊鏈的算力3.一個新穎的對等網路(Atlas),節點連通採用基於圖的隨機遊走演算法,減少了取得共識需要的資料量4.一種智慧合約語言,Clarity (清),非圖靈完備,解釋型語言
區塊鏈版本:當前生產環境中執行的Stacks區塊鏈是“版本1”,是部署基本功能的一個初始實現。Stacks區塊鏈v1使用比特幣網路實現其共識演算法,支援Stacks代幣操作,比如轉賬。Stacks區塊鏈v1為一些用例實現了智慧合約,比如Blockstack Naming System。關於版本1功能和實現的更多細節,請檢視Github上的已有實現。本章中的剩餘部分將討論Stacks區塊鏈“版本2”的設計。Stacks區塊鏈v2實現了我們新共識演算法和智慧合約語言的完整功能,將是對版本1的一個主要升級。1. 領導人選舉Blockstack的第一代區塊鏈邏輯上在Layer-1(L1)之上操作,每一個交易1:1對應於一個L1的比特幣交易。這樣做的原因是確保重組Blockstack區塊鏈的難度就像重組比特幣區塊鏈的難度一樣大——這是我們從Namecoin,一個更小型區塊鏈網路上得到的一個安全問題的教訓。Stacks區塊鏈採用一個可調諧的證明機制(Tunable Proofs)用於領導人選舉過程。可調諧證明機制是一個有附加功能的工作量證明(PoW)系統,可以重用另一個更成熟區塊鏈的算力。採用可調諧證明機制,我們的目標是安全地啟動一條新的區塊鏈,慢慢轉換到使用自身的PoW機制。可調諧證明機制有兩部分:(a)自身的PoW 和(b)另一種加密數字貨幣的燃燒證明。在初始時,燃燒證明部分的挖礦有更大的權重。透過燃燒證明,礦工燃燒加密數字貨幣表明他們參與挖礦程式的興趣。為了競選領導人,候選人燃燒底層鏈的代幣(這裡是比特幣),在領導人的候選(would-be)塊裡提交了一個初始的交易集。該次提交同時也表明了該領導人的分叉選擇:當前塊的共識雜湊必須包含前一個塊的頭部。當出現有多個競爭的分叉時,那些選擇在失敗分叉上“挖礦”的領導人無法收到區塊獎勵和交易手續費,也不能恢復已燒掉的加密數字貨幣。Stacks區塊鏈中採用的燃燒證明機制可以達成:
高驗證吞吐量。處理的Stacks交易數量與底層“燃燒鏈”(這裡是比特幣)的交易處理速率間解耦。使用燃燒證明選舉允許Stacks交易的“全部區塊”用底層燃燒鏈的每一個新區塊來確認。低延遲塊採納。透過採用單一領導人選舉,我們的燃燒證明共識演算法允許當前領導人在Stacks區塊中立即包含一個來自於交易池(mempool)新交易。這個區塊流模型允許使用者在幾秒鐘內得知一個交易被區塊採納。開放領導人集合。燃燒證明選舉允許任何人成為領導人。這個機制確保Stacks區塊鏈是一個開放的區塊鏈(相對於依賴固定領導人集合的封閉區塊鏈,或者委託權益證明(DPoS)系統,其行為功能上與封閉的集合類似)。而且,透過執行單一領導人選舉,我們的共識演算法確保潛在領導人間無需協調。無挖礦硬體可參與。作為領導人參與,所需的工作涉及燃燒某種加密數字貨幣,而不是像傳統的工作量證明挖礦方案。因此,參與領導人選舉不需要挖礦硬體。任何能獲得要燃燒的加密數字貨幣的人都能參與挖礦,哪怕只能負擔得起最低限度的數量。公平礦池。Stacks區塊鏈天然地支援公平的礦池。任何參與到網路中的人可以燃燒加密數字貨幣支援某個指定領導人的選舉。提交這樣的“使用者投票型燃燒”(user support burns)的使用者將與該領導人分享等量份額的Stacks區塊獎勵。故障恢復能力。這個設計確保發生燃燒鏈不穩定,或者不適合Stacks區塊鏈挖礦時,Stacks區塊鏈可以使用另一條不同的燃燒鏈。
關於燃燒證明元件的更多細節參見文獻。將來可能發生的情況是,一旦在Stacks區塊鏈上有足夠的自身算力,燃燒證明元件就不再需要了。2. 可調諧證明除了燃燒證明之外,Stacks區塊鏈的共識演算法中包含了一個內建的工作量證明(PoW)元件。這種組合分擔了在SIP-001中描述的燃燒證明選舉系統所在區塊鏈的安全職責。這種內建的工作量證明和燃燒證明的組合在我們系統裡被稱為可調諧證明。允許引入內建的PoW挖礦,而在當前PoW利益較低時,透過燃燒證明確保區塊鏈的穩定。當底層燃燒鏈走向衰落時,可調諧的功能給我們更靈活的遷移。可協調機制的設計的靈活性還擴充套件到今後新的共識機制。我們可以研究其它PoW和PoS的共識機制, 如果未來有必要採取新的共識機制, 也可以安全合理的引入。PoW元件在領導人選舉中是這樣工作的,其允許候選人在他們的燃燒交易中可選地包含一個PoW隨機數。產生此隨機數需要的工作量(就是某種函式,其計算結果雜湊前置多少個0)對應成候選人的“燃燒數量”。在初始時,內建的PoW將佔比5%(相對於已提交的燃燒數量)。內建的PoW元件仍在大量的設計和開發之中。隨著更多的細節具體化,這部分內容(以及一個對應的SIP)將被更新。3. Atlas對等網路Atlas對等網路是一個內容可定址的對等網路,實現了一個Gossip協議,每個節點跟蹤哪些其他節點當前在網路中,每個節點試圖儲存網路中所有資料的一個完整副本。該網路的容量受到了Stacks區塊鏈的限制:資料集中的每一條新紀錄,都必須和Stacks區塊鏈上的一個交易相關聯。Atlas對等網路是作為Stacks區塊鏈的一個子系統工作的。其設計成一個無結構對等網路(unstructured peer network)以避免節點加入或離開網路引起的問題。而且,既然每個節點都保留所有資料的一個副本,資料的索引在Stacks區塊鏈上可用,那麼新的Atlas節點可以快速同步其需要儲存的資料,因為事先知道應該從其他節點儲存什麼資料(通常在點對點網路中這對節點是未知的)。
Atlas網路作為Stacks區塊鏈的“擴充套件儲存”子系統執行。我們的設計方案是儘可能少地依賴於直接與Stacks區塊鏈自身的互動,儘可能少地在其上儲存資料。對於許多在Blockstack上的應用,例如Blockstack Naming System (BNS)的智慧合約,其本質上是有一個機制儲存不可改變和帶有時間戳的資料。在BNS裡,這被用來將使用者名稱和路由資訊關聯,透過路由資訊可以發現使用者個人資料和應用資料。大多數的區塊鏈直接將這種資料儲存在區塊鏈上。然而,我們相反選擇將雜湊儲存在區塊鏈上(空間昂貴),並實現了一個單獨的對等網路來交換對應於這些雜湊的資料。4. Stacks代幣用途Stacks區塊鏈實現的原生Stacks代幣啟用了Blockstack網路上的幾項基礎操作:1. 註冊數字資產的燃料。Stacks代幣用來註冊不同種類的數字資產,例如:使用者名稱,域名,軟體授權,播客,還有一些其他的。2. 註冊/執行智慧合約的燃料。執行智慧合約需要燃料以支付驗證合約正確性並執行合約的開銷。Stacks代幣也被用來核銷在Stacks區塊鏈上儲存智慧合約的成本。3. 交易手續費。Stacks代幣被用來支付交易手續費,以此Stacks區塊鏈才能記錄該交易。
4. 錨定的應用鏈。對於在Blockstack上廣受歡迎的應用,我們的區塊鏈有一個可擴充套件的入口,應用可以在Stacks區塊鏈上初始化自己的區塊鏈。這樣的“應用鏈”燃燒Stacks代幣挖礦。上面的列表並不是全部——隨著Blockstack網路的成熟,我們期待網路參與者會發現和開發出Stacks代幣的其他用處。我們當前正積極研究一個“應用權益”機制,使代幣持有者可以潛在參與我們的“應用挖礦”開發者激勵計劃中。Clarity (清)智慧合約語言Stacks區塊鏈支援載入和執行智慧合約,以對數字資產進行程式設計控制。“清”這個新智慧合約語言最佳化了安全和可預測性,強調了其不同於先前的智慧合約系統的一些關鍵設計目標:1. 該語言必須允許快速、精確的執行時和空間需求的靜態分析。為了支援這一點,該語言在單一交易的執行中是非圖靈完備的。但就完整的交易歷史來說,該語言是圖靈完備的。2. 智慧合約應該是由我們的虛擬機器解釋執行的,而非編譯。開發者編寫的合約程式碼必須直接部署到區塊鏈上。
為了實現以上兩個性質,我們創造了一個新的LISP語言變種,特殊設計成智慧合約的編寫語言。在SIP-002[24]中有關於Clarity(清)語言設計的更詳細討論。1. 語言概覽智慧合約語言Clarity(清)與其他的LISP變種(例如:Scheme)相似,但是有如下的不同:1. 遞迴是非法的,並且沒有lambda函式2. 迴圈只能透過map,filter,或fold執行3. 唯一的原子型別是布林,整型,定長陣列,以及控制主體(principals,是Blockstack智慧合約語言中特有的資料型別)
4. 對原子型別的列表提供額外的支援,但該語言中唯一變長的列表只能作為函式輸入出現(也就是說,對類似append或join的列表操作不支援)。我們也支援名稱和型別指定(named-and-typed)的元組。5. 變數僅能使用let繫結建立,不支援類似set的可變功能6. 允許使用define語句定義常量和函式來簡化程式碼。但這純粹是句法意義上的。如果一個定義不能被還原(inlined),該合約將被視為非法被拒絕。這些定義同時也是私有的,在某個函式中這樣的定義,只能被指定智慧合約中定義的其他函式所呼叫。7. 透過define-public語句指定的函式是公有函式。傳給這些函式的引數必須指定型別。智慧合約有下面的權力:1. 從其他的智慧合約呼叫公有函式。這些智慧合約以其雜湊標識,被呼叫智慧合約必須在呼叫者智慧合約釋出時已存在。結合遞迴的非法性,這樣做將防止函式重入,這在現存的智慧合約平臺上是一個通用的攻擊途徑。
2. 擁有並控制數字資產。就像公鑰或多重簽名地址一樣,智慧合約是一級主體。每個智慧合約有自己的資料空間(data-space)。在此資料空間中的資料被儲存在map裡。這些儲存將一個typed-tuple與另一個typed-tuple相關聯(很像一個有型別的鍵值對資料庫)。相對於表(table)資料結構,map只關聯一個指定的key到一個唯一確定的value。每個智慧合約可以從任何其他智慧合約的map裡取資料。但是,只有一個智慧合約可以直接在其自己的map裡更新資料。由於以下兩點原因,我們選擇使用map,而不是其他的資料結構:1. 由於map結構的簡單性,使得虛擬機器內實現更簡單,函式推導更容易。透過檢查一個指定函式的定義,可以清楚的看到哪些map將被修改;甚至在那些map中,哪些key會受到一個給定呼叫的影響。2. Map介面確保其操作的返回型別是定長的,這對智慧合約執行時、成本和其他屬性的靜態分析是必須的。
2. 圖靈不完備和靜態分析創造一個非圖靈完備語言是一個重要的設計考慮。在區塊鏈這種惡意的網路環境中,這一點為程式設計帶來了許多好處。1. 圖靈不完備使靜態分析能夠決定執行一個指定交易的成本。這允許網路預先清楚地知道向一個指定交易收取多少手續費。這也會提升客戶端的體驗,因為對客戶端來說廣播一個交易的成本可知了,所以能容易地傳達給使用者。2. 圖靈不完備允許靜態分析可以快速決定一些重要屬性,例如單個交易可能呼叫了哪幾個合約。這提升了使用者體驗,因為客戶端可以警告使用者關於一個給定交易的任何潛在副作用。3. 改進的、精確的靜態分析將允許程式設計師充滿信心地分析他們的智慧合約,在上線之前發現任何可能的缺陷和錯誤。基本上我們認為,像對待其他程式設計形式一樣對待智慧合約程式設計是個錯誤。區塊鏈的性質造就了智慧合約非常重要的特性。我們認為犧牲程式設計的簡易,來換取增進的人和計算機對智慧合約行為的全面理解,是一個好的權衡。已有的智慧合約使用實踐證實了這點——圖靈完備智慧合約的歷史基本上是智慧合約bug的歷史。
在智慧合約語言“清”中,在廣播智慧合約之前執行的靜態分析可以提供如下的資訊:1. 廣播指定交易的成本是其輸入大小的函式2. 可以修改任意特定表的交易集合未來的工作可以支援甚至更高階的分析功能,例如自動檢查智慧合約程式碼上的證據的能力。3. 解釋型語言 vs. 編譯型語言在我們智慧合約語言Clarity(清)中的另一個關鍵設計決策是,選擇一門解釋型語言,而不是編譯型語言(例如,編譯成WASM)。與同時期的其他方法相比,我們不採用編譯器的設計決策是一個根本的不同。採用這種設計決策的主要原因,是對程式實現的bug歸因的能力。
程式實現的bug是無法更改的事實,即使有最好的編碼規範,也無從避免。智慧合約的bug(區塊鏈)是如此,其他程式碼也一樣。智慧合約的bug處理起來更復雜。不同的區塊鏈社羣奉行“程式碼即法律”的哲學,提交到區塊鏈上的法則是最終真相的來源(source of ultimate truth)。編寫智慧合約的開發者透過原始碼表達他們的意願,然而是編譯將他們的意願轉換為實際的法則。這會導致因為編譯器的bug使實際法則偏離開發者意願的情況。會產生令人不快的情況,人們將爭論是開發者意願更重要還是法則更重要。在Stacks區塊鏈裡,我們移除編譯步驟,直接提交開發者意願到區塊鏈,避免這種狀況,以使開發者意願絕不會偏離法則。讓我們考慮一下在智慧合約語言(也就是虛擬機器)的實現裡出現bug的情況。如果智慧合約語言使用直譯器,那麼解決bug相對容易實施。世界上的所有合約程式碼都在區塊鏈上,只需要對直譯器打一個補丁,然後從創世塊開始重啟區塊鏈(重新應用到所有的交易)。但是如果智慧合約語言是編譯的,該bug是在編譯器內部,而非虛擬機器,那補救措施就沒那麼明顯了,因而可能會發生更多的爭議。這是因為編譯器裡的一個bug可以導致其生成的程式碼(最終廣播到區塊鏈上)產生與開發者初衷背離的行為。在加密數字貨幣社羣裡,在對“程式碼即法律”哲學的認同下,這種情況愈加複雜。由開發者編寫的程式碼是正確的,但是區塊鏈上產生的交易是錯誤的。收集每個開發者的原始碼並重新編譯是不現實的,尤其在無法驗證原始碼是否已改變的情況下。我們懷疑,在實踐中這種情況下在區塊鏈上釋出的程式碼多數是最終真相的源。如果是這樣,開發者應該歸因和驗證此程式碼,而不是他們的原始碼。我們相信,使用一個高階的解釋型語言對於確保正確的智慧合約執行是至關重要的。Gaia:使用者控制的儲存 Blockstack使用Gaia儲存系統給使用者對其資料的控制權。這是一個使用者控制的儲存系統,使應用可以與私人資料鎖櫃(private data lockers)互動。私人資料鎖櫃可以託管在一個雲服務提供商,或者是其他的資料儲存服務商。重要的是,使用者控制使用哪一個提供商。Gaia上的資料經過加密,並使用使用者控制的金鑰簽名。邏輯上,Gaia像是一個廣域的檔案系統,可以被掛載以儲存檔案。使用Gaia儲存系統,使用者要指定一個Gaia儲存位置的地址,在此儲存資料。只是Gaia儲存位置的“指標”被儲存到Stacks區塊鏈上(以及Atlas子系統上)。當使用者使用Blockstack認證協議登入應用和服務時,將此位置傳遞給應用;有了這個資訊,應用知道如何與指定地Gaia資料鎖櫃交流,如此應用資料被儲存到使用者指定的儲存裡。

Gaia的設計哲學是,以一種終端使用者無需信任底層雲服務提供商的方式重用現有的雲服務提供商和基礎設施。我們看待雲端儲存服務提供商(像Amazon S3, Google Cloud Storage,甚至一個本地磁碟)只是作為一個通道(dumb drives),在上面儲存加密過的,和/或簽名過的資料。雲服務提供商看不到使用者的資料;他們只能看到加密的資料塊。

而且,因為透過Stacks區塊鏈可發現相關聯的公鑰或資料雜湊,雲服務提供商沒有篡改使用者資料的能力。

向Gaia伺服器寫資料涉及到POST資料到伺服器的合適位置。這些POST在伺服器端被驗證,檢查是否此寫請求附帶了一個簽名的認證token。這個token使用私鑰簽名,控制了是否對特定的bucket有寫許可權。為了給使用者的每一個應用提供分離的bucket,使用者將為每一個應用推匯出不同的私鑰。每一個私鑰僅賦予Gaia伺服器上特定bucket的訪問許可權。

在Gaia裡,使用者的區塊鏈驗證的路由資訊中包含一個URL,指向一個簽名過的JSON物件(由該使用者的owner key簽名)。這個簽名過的JSON物件內包含指向該使用者Gaia資料鎖櫃的URL。一旦應用知道使用者的Gaia資料鎖櫃的位置,就可以使用普通的HTTP請求向那個位置請求一個檔案。為了查詢不同使用者建立的檔案,應用可以完全在客戶端順序地執行查詢。這在初始查詢時會有時間延遲的開銷,但是路由資訊中的許多資料可以由瀏覽器本地快取(或者由本地應用),所以後續的查詢就像傳統的網際網路資料訪問一樣快了。

圖1顯示了Gaia的總覽。查詢一個像werner.id一樣的名字,其工作流程如下:

1. 在Stacks區塊鏈上查詢該名字,取得(name,hash)對
2. 在Blockstack的Atlas對等網路裡查詢hash(name),得到該名字的路由資訊檔案。
3. 從路由資訊檔案中取得該使用者的Gaia URL,接著查詢此URL,連線至儲存後端。
4. 從指定的Gaia服務處GET/PUT資料(如果需要且讀者有此訪問許可權,則進行解密),並驗證相應的簽名或雜湊。

上面的步驟1和步驟2可透過對blockstack-core在/v1/names/<name>訪問點上的一個簡單呼叫即可執行。這些重複的讀寫操作已在我們的開發者程式庫中自動處理了。

效能。我們架構的目標是相對構建於雲服務提供商之上的傳統網際網路應用提供可比的效能。透過移除控制和失效的中心點,我們引入了有意義的安全和容錯的好處——在讀寫效能上付出一些小的額外開銷是值得的,只要這些額外開銷對普通使用者不那麼重大或顯而易見。我們評估了Gaia的讀寫效能,顯示出其在讀寫底層儲存的檔案上是有競爭力的。由於加密的緣故,Gaia為每個檔案增加了一個可忽略的固定大小的儲存空間開銷(粗略為檔案大小的5%)。加密也會有CPU的額外開銷;但是因為檔案尺寸變化非常小,讀寫的網路效能與直接訪問底層的儲存服務是相似的。

系統擴充套件性。我們架構的儲存層不是一個可擴充套件性的瓶頸。同期的雲端儲存系統是高度可擴充套件的。Atlas網路也是擴充套件性良好,因為其並不索引單獨的使用者檔案或檔案塊,只索引指向使用者儲存後臺的指標。儲存後臺處理批次的資料讀寫操作,Atlas網路只在下述情況下參與 (a)使用者改變或更新了他的儲存後臺或者公鑰對映,或(b)新使用者在系統中註冊。當註冊新域名/使用者時,路由檔案的雜湊必須在區塊鏈上廣播。區塊鏈可能是可擴充套件性的一個瓶頸(相對於Atlas網路),但使用者極少寫區塊鏈。另外,鏈下名字註冊的使用可以在一個單一的區塊鏈交易中註冊超過100個使用者,由此可以支援每天數十萬個使用者註冊(可以與傳統雲上平臺的每日新使用者數量相比)。提升Gaia到10億使用者量級在實踐中可能會暴露出可擴充套件性問題,但明顯現在不會發生,解決這些挑戰是正在進行和將來工作的一個研究領域。

認證

使用網際網路應用,使用者賬戶是至關重要的。Blockstack提供給使用者一個通用的使用者名稱,無需任何密碼,可用於所有的應用。不像基於密碼的認證,使用者使用公鑰密碼學進行認證:一個本地執行的軟體客戶端處理來自特定應用的登入請求,並對認證請求籤名。

Blockstack Auth是我們的認證協議,其將應用與使用者的Gaia hub以及任何應用相關的私鑰連線在一起。應用使用這些資訊將使用者和其資料儲存,驗證其他使用者產生的資料是真實的。

1. 單點登入

Blockstack Auth使用公鑰密碼學進行認證。使用者登入一個應用以使此應用可以產生和儲存簽名過的資料,其他使用者可以讀取和驗證其資料。這反過來向其他使用者證明了該登入使用者是合法的。

在Blockstack中,登入的目的是嚮應用客戶端提供足夠的資訊,來產生和儲存真實的資料。這意味著,認證功能可以以一個認證器(authenticator)應用的形式,獨立執行在使用者的計算機上。因為所有的名字都是在Stacks區塊鏈上註冊的,每個應用和認證器一直有一個最新的檢視 (1)所有存在的名字,和(2)所有名字的公鑰及Gaia hub。這消除了對一個服務端ID提供者的需要。

為了認證使用者資料,應用客戶端只需能夠聯絡一個Stacks區塊鏈節點。為此使用者在登入時嚮應用提供其首選Stacks節點的網路地址。

用 戶 通 過 點 擊 “ 登 錄 ” 按 鈕 來 登 錄 一 個 Blockstack 應 用 。 此 應 用 ( 調 用blockstack.js SDK)將使用者重定向到Blockstack認證器應用,請求登入。使用者將看到可選擇的用於登入的Blockstack ID,同時還有一個應用所需的許可權列表。選擇一個ID,認證器則將使用者導回到應用,並嚮應用傳遞三個資訊:

1. 使用者的使用者名稱(或者是公鑰的雜湊,如果還沒使用者名稱的話)
2. 應用特定的私鑰,用來加密和簽名使用者的資料。這是使用使用者主私鑰、登入使用的ID和應用的HTTP Origin所生成的確定性金鑰。
3. 使用者Gaia hub的URL,以及用來查詢其他使用者和資料的首選Stacks區塊鏈節點。

有了這些,使用者展現了其使用者名稱,通知應用哪裡可以找到和儲存其資料。在那裡,應用可以持久化地讀寫應用特定的資料,訪問其他使用者的應用特定資料——所有這些不需要提供其自身的儲存或ID解決方案。

登出操作簡單地清除應用的本地狀態,因此導致Web瀏覽器和客戶端忘記應用特定的私鑰。

Blockstack程式庫和開發包

Blockstack PBC是一個公益公司(Public Benefit Corp),和開源貢獻者一起開發了Blockstack的核心協議和開發者程式庫。開發者程式庫使開發人員在Blockstack網路上構建應用更簡單,而Blockstack客戶端使使用者可以和Blockstack網路的不同元件以及不同應用進行互動。

1. 開發者程式庫

Blockstack設計成讓開發人員開發去中心化應用盡可能地簡單。與Stacks區塊鏈或去中心化儲存的互動複雜性大多向應用開發者隱藏了,他們可以只關注應用的邏輯。Blockstack開原始碼庫包含了一些不同平臺的開發者程式庫:一個Javascript Web SDK (blockstack.js),iOS和Android的移動SDK。所有這些程式庫都是在MIT許可協議下可用,訪問此連結可獲取 https://github.com/blockstack。

這些程式庫提供所有必須的API介面,以及實現我們認證協議的程式碼,直接與Gaia伺服器互動,生成Stacks交易。使用這些程式庫允許開發者建立尊重使用者安全和隱私的去中心化應用,就像開發傳統的應用一樣容易。

Radiks 對於希望穿透複雜的社交圖譜分享資料的應用來說,對資料建立索引通常是有用的和最有效的。Radiks系統是一個伺服器和客戶端的程式庫,用來構建並與這樣的索引互動。Radiks程式庫使開發人員可以在應用內建立跨使用者的結構化資料集,可以透過欄位的值查詢。這要求一個伺服器端的元件處理索引和查詢,可關鍵這不是使用者信任的計算環境的一部分。其只能看到資料的密文和一些必要的後設資料,後者用於構建索引以及透過索引應答查詢。

2. 使用者軟體

雖然應用開發者將使用開發包和程式庫與Blockstack網路進行互動,但使用者還需要軟體來執行諸如註冊使用者、指定其Gaia伺服器以及應用使用者認證等功能。Blockstack生態系統目前提供兩個可使使用者與網路進行互動的開源專案:

1. Blockstack瀏覽器。這是目前推薦的認證器應用的一個開源實現,而且其允許使用者瀏覽可用的Blockstack應用、註冊使用者名稱以及認證應用使用者。Blockstack瀏覽器可以在桌面上進行本地安裝,也可以採用web部署。

2. Blockstack CLI。這是一個命令列實用程式,允許高階使用者和開發者與Blockstack協議互動。除了提供認證功能,其允許使用者建立原始交易,以及透過Gaia進行高階資料管理任務。

應用和服務

截至2019年初,Blockstack上已經搭建了100多個應用。開發者正在搭建各種不同型別的應用,在app.co上可找到持續增多的Blockstack應用的完整清單。由於Blockstack是模組化的,不同的應用可獨立地使用不同的元件。以下是我們對一些示例用例做出的簡要概述。

目前,Blockstack上的辦公效率應用使用Blockstack認證和Gaia儲存,使用者可以建立、編輯以及共享檔案。為幫助使用者發現彼此的檔案,這些應用使用Blockstack個人資料檢索器。該檢索器是去中心化的——因為個人資料集是全球可見的,是可以被發現的,任何人都可以部署及執行個人資料檢索器。

Blockstack生態系統還包含許多社交應用。通常情況下,這些社交應用使用 Blockstack認證,同時部署一個Radiks伺服器,以使使用者高效地發現並獲取其他使用者的資料。在至少一個用例中,應用使用一個專用的中繼通道在眾多使用者間路由加密的資訊。Blockstack上的釋出和儲存應用不僅使用Gaia儲存使用者資料,而且還將其透過傳統的HTTP URL與非Blockstack使用者分享。

開發者獎勵。Stacks區塊鏈擴大了挖礦的概念,應用開發者可以透過在網路上釋出高質量的應用 “挖”Stacks代幣。這一機制被稱作應用挖礦,其被設計成一種激勵機制,以期在網路上獲得高質量應用。應用挖礦計劃目前由擁有多名獨立審閱人的Blockstack PBC運營。開發者可以將其應用每月提交一次以審閱,並基於其應用在應用排名機制中的表現獲得獎勵。應用由一組獨立審閱人審閱,每名審閱人對於什麼樣的應用才是好應用有自己的評定標準。應用得到的總分決定了其排名情況。

結論

Blockstack是一個去中心化計算網路,向開發者提供了用於搭建去中心化應用的全棧。迄今為止,我們的網路上已經搭建了100多個去中心化應用。Blockstack無需開發者執行伺服器和資料庫:取而代之的是用應用將資料寫到使用者控制的私人資料鎖櫃裡。這一去中心化儲存系統與傳統雲端儲存在效能上相當,只因加密/解密引入一點開銷。我們的認證協議無需採用基於密碼的登入方式,那種方式不如加密認證安全。使用者可以使用單一賬戶訪問所有服務和應用,不必持續不斷的為新服務建立新賬戶。我們的開發者程式庫使得在該平臺上開發去中心化應用與搭建傳統網際網路應用一樣簡單。

在本文中,我們呈現了Blockstack的最新設計。自2016年和2017年產品的早期實現以來,Blockstack的核心設計一直在演進,吸取了從產品部署中得到的經驗教訓以及去中心化應用開發者的反饋。與早期(2017年)的白皮書相比,主要變化包括(a)對Stacks 區塊鏈的說明,其使用新穎的可調諧證明機制來安全地啟動一條新的區塊鏈,和(b)對新智慧合約語言Clarity(清)的說明,關注智慧合約的安全和可預測性。我們已經以開源的方式釋出了Blockstack 。


關於更多Blockstack資訊:https://blockstack.org/
更多區塊鏈專案介紹:http://www.qukuaiwang.com.cn/news/xiangmu
風險提示:區塊鏈投資具有極大的風險,專案披露可能不完整或有欺騙。請在嘗試投資前確定自己承受以上風險的能力。區塊網只做專案介紹,專案真假和價值並未做任何稽覈。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;