今天的互聯(lián)網(wǎng),已經(jīng)發(fā)展了四十多年,從一個(gè)小型的科研項(xiàng)目,成長(zhǎng)為數(shù)字觸角伸向世界的龐然大物。盡管核心的底層互聯(lián)網(wǎng)協(xié)議自20世紀(jì)90年代以來基本保持一致,互聯(lián)網(wǎng)的應(yīng)用層和服務(wù)架構(gòu)卻發(fā)生了極大的變化,以支持互聯(lián)網(wǎng)應(yīng)用的爆發(fā)式增長(zhǎng)。
建設(shè)互聯(lián)網(wǎng)應(yīng)用的基本模型是上世紀(jì)90年代流行起來的客戶端/服務(wù)器模型。該模型短期利好,但長(zhǎng)期帶來很多負(fù)面后果。Web應(yīng)用順勢(shì)而起,但是導(dǎo)致Web服務(wù)愈加依賴于遠(yuǎn)程服務(wù)器。云計(jì)算是基礎(chǔ)的客戶端/服務(wù)器模型的一個(gè)演進(jìn)。今天,在云端存儲(chǔ)著私有的用戶數(shù)據(jù),運(yùn)行著應(yīng)用業(yè)務(wù)邏輯和計(jì)算,管理著訪問權(quán)限,等等。
最近的十年里,我們開始看到云計(jì)算帶來的負(fù)面后果,人們由此開始質(zhì)疑基于客戶端/服務(wù)器開發(fā)軟件的完整模型。大規(guī)模的數(shù)據(jù)泄露, 用戶隱私的喪失,數(shù)據(jù)缺乏可移植性,以及根植于客戶端/服務(wù)器模型核心設(shè)計(jì)帶來的科技巨頭間廣泛的互不信任。鑒于計(jì)算在人類社會(huì)中的重要性與日俱增,我們不能讓過時(shí)的計(jì)算模型來定義我們現(xiàn)在的生活方式。
云計(jì)算的下一步演進(jìn)將利用更強(qiáng)勁的客戶端設(shè)備、邊緣計(jì)算和全球連接以減少對(duì)這些中心化平臺(tái)的依賴。趨勢(shì)已經(jīng)朝著去中心化計(jì)算演進(jìn),我們相信這是計(jì)算機(jī)工業(yè)自大型機(jī)轉(zhuǎn)向桌面電腦以來最重大的技術(shù)變遷。去中心化計(jì)算可以改變軟件如何構(gòu)造和使用。其提供給開發(fā)者一系列新的工具,改變了用戶和軟件之間的關(guān)系:軟件的存在是保護(hù)用戶,軟件的優(yōu)化是為用戶利益至上。
Blockstack是一個(gè)開源軟件產(chǎn)品,在開源社區(qū)中設(shè)計(jì)、開發(fā)、成長(zhǎng)為一個(gè)去中心化計(jì)算網(wǎng)絡(luò),為傳統(tǒng)的云計(jì)算提供一個(gè)全棧的替代。Blockstack正在重新構(gòu)想傳統(tǒng)互聯(lián)網(wǎng)的應(yīng)用層,為去中心化應(yīng)用提供一個(gè)全新網(wǎng)絡(luò);構(gòu)建于Blockstack之上的應(yīng)用將使用戶擁有和直接控制他們自己的數(shù)據(jù)。Blockstack使用現(xiàn)存的互聯(lián)網(wǎng)傳輸層協(xié)議以及底層的通信協(xié)議,但是移除了應(yīng)用層里的中心點(diǎn)。我們遵循端到端的設(shè)計(jì)原則,以保持網(wǎng)絡(luò)核心簡(jiǎn)單,而將復(fù)雜性推送到客戶端。為了應(yīng)用的可擴(kuò)展性,我們將全局狀態(tài)變化最小化,提供一個(gè)可靠的去中心化存儲(chǔ)系統(tǒng),其相比云存儲(chǔ)性能相當(dāng)。而且,我們的全棧方法為所有開發(fā)者構(gòu)建去中心化應(yīng)用必須的棧組件提供了默認(rèn)的選項(xiàng)。Blockstack是模塊化的,開發(fā)者可以輕易定制和集成其他替代技術(shù)。
設(shè)計(jì)目標(biāo)
Blockstack的設(shè)計(jì)優(yōu)化源于下列屬性:
1. 易使用。去中心化應(yīng)用應(yīng)該像現(xiàn)在的互聯(lián)網(wǎng)應(yīng)用一樣容易被終端用戶所使用。此外,開發(fā)去中心化應(yīng)用應(yīng)該像在今天的云上開發(fā)一樣容易。
2. 可擴(kuò)展。去中心化應(yīng)用應(yīng)該可以支持互聯(lián)網(wǎng)級(jí)別的用戶量,也就是數(shù)億到十億的用戶量。為了達(dá)到這點(diǎn),網(wǎng)絡(luò)(包括區(qū)塊鏈)必須可以隨用戶數(shù)和運(yùn)行的應(yīng)用數(shù)量進(jìn)行擴(kuò)展。
3. 用戶控制。采用去中心化計(jì)算的應(yīng)用應(yīng)該默認(rèn)由用戶控制。用戶應(yīng)該可以提供自己的計(jì)算和存儲(chǔ)資源,而不是依賴于應(yīng)用運(yùn)營的服務(wù)器。
帶著這些設(shè)計(jì)目標(biāo),Blockstack做出了自己的設(shè)計(jì)選擇,將其與其他的“重”區(qū)塊鏈和“世界計(jì)算機(jī)”設(shè)計(jì)哲學(xué)的去中心化計(jì)算方案區(qū)別開來。
最小化區(qū)塊鏈層的邏輯和狀態(tài):為了取得可擴(kuò)展性,Blockstack在我們的“輕”區(qū)塊鏈層最小化了應(yīng)用的邏輯和數(shù)據(jù)。使用區(qū)塊鏈操作記錄應(yīng)用邏輯和存儲(chǔ),本質(zhì)上要比“鏈下”方法要慢。需要在全網(wǎng)范圍和設(shè)備間同步和驗(yàn)證狀態(tài),顯示出這種操作在吞吐量上極大的局限性。限制因素在于底層的全局連通帶寬和典型網(wǎng)絡(luò)節(jié)點(diǎn)上可用的內(nèi)存/存儲(chǔ),也就是物理限制(而不是任何協(xié)議的限制)。
本地狀態(tài)變化 vs. 全局狀態(tài)變化:Blockstack平臺(tái)使用全棧方法確保構(gòu)建在Blockstack上的應(yīng)用是可擴(kuò)展的:與應(yīng)用的交互盡可能改變本地的狀態(tài),而不是全局的狀態(tài)。正因?yàn)榇?,我們的存?chǔ)系統(tǒng)和認(rèn)證協(xié)議是我們平臺(tái)的基礎(chǔ)組件——其使得應(yīng)用不發(fā)起一個(gè)區(qū)塊鏈交易,就可以和用戶的私人數(shù)據(jù)存儲(chǔ)交互,并且完成用戶認(rèn)證。Stacks區(qū)塊鏈僅用于在去中心化的環(huán)境中,以一種一致的方式協(xié)調(diào)全局狀態(tài)的變換(例如:注冊(cè)一個(gè)全局唯一的用戶名)。
可靠的云存儲(chǔ) vs. 對(duì)等存儲(chǔ):在Blockstack上構(gòu)建的應(yīng)用,其數(shù)據(jù)存儲(chǔ)和用戶是一體的(使用用戶自己的私人數(shù)據(jù)鎖柜),不需要在服務(wù)器端保存任何用戶訪問憑證。這種方式不僅將用戶數(shù)據(jù)交由用戶自己控制,而且為開發(fā)人員降低了復(fù)雜度:開發(fā)人員無需運(yùn)行服務(wù)器和數(shù)據(jù)庫,從而代替用戶支付云服務(wù)的賬單。此外,我們避免了點(diǎn)對(duì)點(diǎn)存儲(chǔ)固有的可靠性和性能問題,在一個(gè)去中心化的廣域文件系統(tǒng)中改變了現(xiàn)有云存儲(chǔ)提供商的位置——區(qū)塊鏈層只存儲(chǔ)指向用戶數(shù)據(jù)鎖柜的指針。
適用開發(fā)者的全棧SDK:Blockstack提供全棧方法,為開發(fā)去中心化應(yīng)用所需的所有層提供了默認(rèn)的選項(xiàng)。開發(fā)者SDK將區(qū)塊鏈的復(fù)雜性和其他開發(fā)技術(shù)抽離;應(yīng)用開發(fā)者能夠使用Blockstack SDKs輕松構(gòu)建他們的應(yīng)用。技術(shù)棧的不同層次是模塊化的,可以根據(jù)需要使用其他技術(shù)。
與同期的去中心化計(jì)算方法除了這些不同外,我們的智能合約語言也做了獨(dú)特的設(shè)計(jì)決策來優(yōu)化智能合約的安全和可預(yù)測(cè)性。
新應(yīng)用模型
Blockstack為開發(fā)者構(gòu)建應(yīng)用提供了一個(gè)新的模型,確保應(yīng)用是去中心化的,而且默認(rèn)是由用戶控制的:
1. 無不透明數(shù)據(jù)庫:在客戶端/服務(wù)器模型中,數(shù)據(jù)庫是所有應(yīng)用的核心組成部分,因?yàn)榉?wù)端需要存儲(chǔ)和查詢大量的用戶數(shù)據(jù)。在去中心化計(jì)算中,開發(fā)者無需擔(dān)心數(shù)據(jù)庫的維護(hù)和安全問題,因?yàn)樗麄儚囊婚_始就不做數(shù)據(jù)托管。開發(fā)者更多聚焦在應(yīng)用邏輯上,用戶下載應(yīng)用后,接入他們的私人數(shù)據(jù)鎖柜。如果使用數(shù)據(jù)庫的話,其功能等同于過去互聯(lián)網(wǎng)的“搜索檢索器”——索引公共數(shù)據(jù)的服務(wù)。任何人都可以使用底層(去中心化)的數(shù)據(jù)創(chuàng)建這些索引。
2. 無服務(wù)器:在客戶端/服務(wù)器模型中,應(yīng)用通過增加服務(wù)器擴(kuò)容,因?yàn)樗械挠?jì)算都在服務(wù)端執(zhí)行。在去中心化計(jì)算中,應(yīng)用在客戶端運(yùn)行,每個(gè)用戶將自身的計(jì)算和存儲(chǔ)能力帶入網(wǎng)絡(luò)(而不是依賴于應(yīng)用開發(fā)者)。開發(fā)者只需提供最少的基礎(chǔ)設(shè)施托管應(yīng)用代碼,因?yàn)槊總€(gè)用戶自帶所需的存儲(chǔ)和計(jì)算資源使用應(yīng)用。
3. 智能合約:在客戶端/服務(wù)器模型中,全局狀態(tài)變化由一個(gè)中央服務(wù)器協(xié)調(diào),其是網(wǎng)絡(luò)真理的唯一權(quán)威。在去中心化計(jì)算中,這些狀態(tài)的變化是通過執(zhí)行于一個(gè)開放區(qū)塊鏈之上的智能合約解決的。
4. 去中心化認(rèn)證:傳統(tǒng)的互聯(lián)網(wǎng)中,用戶認(rèn)證通過使用某種信任的認(rèn)證流程進(jìn)行。如果應(yīng)用維護(hù)了一個(gè)用戶數(shù)據(jù)庫,該應(yīng)用通過密碼認(rèn)證用戶,有時(shí)加入第二因子。如果應(yīng)用依賴于某個(gè)第三方認(rèn)證服務(wù),像Google或Facebook,該應(yīng)用將使用OAuth協(xié)議從第三方認(rèn)證服務(wù)獲得驗(yàn)證結(jié)果。顯然,在所有這些方法中用戶自己無法控制認(rèn)證流程。在去中心化計(jì)算中,認(rèn)證由用戶的客戶端執(zhí)行,通過加密數(shù)字簽名證明對(duì)區(qū)塊鏈上注冊(cè)的某個(gè)用戶名的控制權(quán)。任何應(yīng)用都可以獨(dú)立驗(yàn)證證明。
5. 原生代幣:在傳統(tǒng)的互聯(lián)網(wǎng)應(yīng)用中,支付通常采用像信用卡一樣的第三方服務(wù)。數(shù)字代幣是去中心化計(jì)算平臺(tái)上的原生資產(chǎn),如Blockstack和以太坊。用戶對(duì)代幣有直接的所有權(quán),可以使用它們直接注冊(cè)數(shù)字資產(chǎn)和智能合約,也可以支付智能合約的運(yùn)行費(fèi)用。這種原生代幣的使用可通過智能合約編程,構(gòu)建軟件訂閱服務(wù),也可以自動(dòng)化其他的應(yīng)用功能。這種可編程的代幣是傳統(tǒng)互聯(lián)網(wǎng)應(yīng)用開發(fā)者無法得到的能力。
去中心化計(jì)算層次結(jié)構(gòu)
Blockstack去中心化計(jì)算網(wǎng)絡(luò)邏輯上位于傳統(tǒng)互聯(lián)網(wǎng)架構(gòu)的“應(yīng)用層”。然而,Blockstack網(wǎng)絡(luò)自身由多個(gè)系統(tǒng)組成,共同為實(shí)現(xiàn)去中心化應(yīng)用提供必需的組件:
1. Stacks區(qū)塊鏈:Stacks區(qū)塊鏈?zhǔn)荁lockstack網(wǎng)絡(luò)的基礎(chǔ)。Stacks區(qū)塊鏈?zhǔn)褂脩艨梢宰?cè)和控制數(shù)字資產(chǎn),如通用用戶名,并且可以注冊(cè)/執(zhí)行智能合約。像通用用戶名這樣的數(shù)字資產(chǎn),允許用戶接下來控制他們的存儲(chǔ)以及更多功能——用戶將其私有數(shù)據(jù)鎖柜的訪問憑證與其通用用戶名進(jìn)行連接。
2. Gaia:Gaia是一個(gè)用戶控制的存儲(chǔ)系統(tǒng),使應(yīng)用可以和私人數(shù)據(jù)鎖柜交互。私人數(shù)據(jù)鎖柜可以在一個(gè)云服務(wù)提供商,或者是其他的數(shù)據(jù)存儲(chǔ)服務(wù)商托管。重要的是,用戶控制使用哪一個(gè)提供商。Gaia上的數(shù)據(jù)經(jīng)過加密,并使用用戶密鑰在客戶端側(cè)簽名。用戶的數(shù)據(jù)鎖柜(data locker)可以通過查詢Stacks區(qū)塊鏈上的信息發(fā)現(xiàn)。
3. Blockstack認(rèn)證:Blockstack認(rèn)證協(xié)議是應(yīng)用的去中心化認(rèn)證協(xié)議。通過該協(xié)議用戶可以使用自己擁有的ID進(jìn)行認(rèn)證,并且設(shè)置使用哪個(gè)Gaia服務(wù)器保存該用戶的應(yīng)用數(shù)據(jù)。
4. Blockstack程序庫和開發(fā)包:開發(fā)者程序庫(Libraries)和開發(fā)包(SDKs)位于平臺(tái)堆棧的頂端,應(yīng)用開發(fā)者和用戶以此和Blockstack網(wǎng)絡(luò)的不同組件進(jìn)行交互。例如,Blockstack客戶端軟件允許用戶注冊(cè)并管理自己的ID。Blockstack的開發(fā)者程序庫使開發(fā)人員構(gòu)建Blockstack應(yīng)用像構(gòu)建傳統(tǒng)的Web應(yīng)用一樣簡(jiǎn)單。
Stacks區(qū)塊鏈
Stacks區(qū)塊鏈?zhǔn)荁lockstack網(wǎng)絡(luò)的基礎(chǔ)層。Stacks區(qū)塊鏈為網(wǎng)絡(luò)提供了全局共識(shí)和協(xié)調(diào)層,產(chǎn)生了Blockstack網(wǎng)絡(luò)的原生代幣,稱為“Stacks token”。當(dāng)用戶注冊(cè)通用用戶名,軟件許可,存儲(chǔ)鎖柜的指針等數(shù)字資產(chǎn)時(shí),需要消耗Stacks代幣作為“燃料”。當(dāng)注冊(cè)/執(zhí)行智能合約時(shí),Stacks代幣也被用于支付給礦工。
本章我們展示Stacks區(qū)塊鏈的高階設(shè)計(jì)。關(guān)于這些設(shè)計(jì)如何實(shí)現(xiàn)和演進(jìn)的細(xì)節(jié),我們建議您閱讀不同組件的SIP(Stacks Improvement Proposals)1。當(dāng)更多的SIP被Stacks改進(jìn)程序接受時(shí),我們將更新本篇白皮書。Stacks區(qū)塊鏈體現(xiàn)了如下的設(shè)計(jì)決策:
1.一個(gè)可調(diào)諧的工作量證明(tunable proof-of-work)機(jī)制用于領(lǐng)導(dǎo)人選舉
2.一個(gè)燃燒證明(proof-of-burn)挖礦算法來重用現(xiàn)有區(qū)塊鏈的算力
3.一個(gè)新穎的對(duì)等網(wǎng)絡(luò)(Atlas),節(jié)點(diǎn)連通采用基于圖的隨機(jī)游走算法,減少了取得共識(shí)需要的數(shù)據(jù)量
4.一種智能合約語言,Clarity (清),非圖靈完備,解釋型語言
區(qū)塊鏈版本:當(dāng)前生產(chǎn)環(huán)境中運(yùn)行的Stacks區(qū)塊鏈?zhǔn)恰鞍姹?”,是部署基本功能的一個(gè)初始實(shí)現(xiàn)。Stacks區(qū)塊鏈v1使用比特幣網(wǎng)絡(luò)實(shí)現(xiàn)其共識(shí)算法,支持Stacks代幣操作,比如轉(zhuǎn)賬。Stacks區(qū)塊鏈v1為一些用例實(shí)現(xiàn)了智能合約,比如Blockstack Naming System。關(guān)于版本1功能和實(shí)現(xiàn)的更多細(xì)節(jié),請(qǐng)查看Github上的已有實(shí)現(xiàn)。本章中的剩余部分將討論Stacks區(qū)塊鏈“版本2”的設(shè)計(jì)。Stacks區(qū)塊鏈v2實(shí)現(xiàn)了我們新共識(shí)算法和智能合約語言的完整功能,將是對(duì)版本1的一個(gè)主要升級(jí)。
1. 領(lǐng)導(dǎo)人選舉
Blockstack的第一代區(qū)塊鏈邏輯上在Layer-1(L1)之上操作,每一個(gè)交易1:1對(duì)應(yīng)于一個(gè)L1的比特幣交易。這樣做的原因是確保重組Blockstack區(qū)塊鏈的難度就像重組比特幣區(qū)塊鏈的難度一樣大——這是我們從Namecoin,一個(gè)更小型區(qū)塊鏈網(wǎng)絡(luò)上得到的一個(gè)安全問題的教訓(xùn)。
Stacks區(qū)塊鏈采用一個(gè)可調(diào)諧的證明機(jī)制(Tunable Proofs)用于領(lǐng)導(dǎo)人選舉過程??烧{(diào)諧證明機(jī)制是一個(gè)有附加功能的工作量證明(PoW)系統(tǒng),可以重用另一個(gè)更成熟區(qū)塊鏈的算力。采用可調(diào)諧證明機(jī)制,我們的目標(biāo)是安全地啟動(dòng)一條新的區(qū)塊鏈,慢慢轉(zhuǎn)換到使用自身的PoW機(jī)制??烧{(diào)諧證明機(jī)制有兩部分:(a)自身的PoW 和(b)另一種加密數(shù)字貨幣的燃燒證明。
在初始時(shí),燃燒證明部分的挖礦有更大的權(quán)重。通過燃燒證明,礦工燃燒加密數(shù)字貨幣表明他們參與挖礦程序的興趣。為了競(jìng)選領(lǐng)導(dǎo)人,候選人燃燒底層鏈的代幣(這里是比特幣),在領(lǐng)導(dǎo)人的候選(would-be)塊里提交了一個(gè)初始的交易集。該次提交同時(shí)也表明了該領(lǐng)導(dǎo)人的分叉選擇:當(dāng)前塊的共識(shí)哈希必須包含前一個(gè)塊的頭部。當(dāng)出現(xiàn)有多個(gè)競(jìng)爭(zhēng)的分叉時(shí),那些選擇在失敗分叉上“挖礦”的領(lǐng)導(dǎo)人無法收到區(qū)塊獎(jiǎng)勵(lì)和交易手續(xù)費(fèi),也不能恢復(fù)已燒掉的加密數(shù)字貨幣。
Stacks區(qū)塊鏈中采用的燃燒證明機(jī)制可以達(dá)成:
高驗(yàn)證吞吐量。處理的Stacks交易數(shù)量與底層“燃燒鏈”(這里是比特幣)的交易處理速率間解耦。使用燃燒證明選舉允許Stacks交易的“全部區(qū)塊”用底層燃燒鏈的每一個(gè)新區(qū)塊來確認(rèn)。
低延遲塊采納。通過采用單一領(lǐng)導(dǎo)人選舉,我們的燃燒證明共識(shí)算法允許當(dāng)前領(lǐng)導(dǎo)人在Stacks區(qū)塊中立即包含一個(gè)來自于交易池(mempool)新交易。這個(gè)區(qū)塊流模型允許用戶在幾秒鐘內(nèi)得知一個(gè)交易被區(qū)塊采納。
開放領(lǐng)導(dǎo)人集合。燃燒證明選舉允許任何人成為領(lǐng)導(dǎo)人。這個(gè)機(jī)制確保Stacks區(qū)塊鏈?zhǔn)且粋€(gè)開放的區(qū)塊鏈(相對(duì)于依賴固定領(lǐng)導(dǎo)人集合的封閉區(qū)塊鏈,或者委托權(quán)益證明(DPoS)系統(tǒng),其行為功能上與封閉的集合類似)。而且,通過執(zhí)行單一領(lǐng)導(dǎo)人選舉,我們的共識(shí)算法確保潛在領(lǐng)導(dǎo)人間無需協(xié)調(diào)。
無挖礦硬件可參與。作為領(lǐng)導(dǎo)人參與,所需的工作涉及燃燒某種加密數(shù)字貨幣,而不是像傳統(tǒng)的工作量證明挖礦方案。因此,參與領(lǐng)導(dǎo)人選舉不需要挖礦硬件。任何能獲得要燃燒的加密數(shù)字貨幣的人都能參與挖礦,哪怕只能負(fù)擔(dān)得起最低限度的數(shù)量。
公平礦池。Stacks區(qū)塊鏈天然地支持公平的礦池。任何參與到網(wǎng)絡(luò)中的人可以燃燒加密數(shù)字貨幣支持某個(gè)指定領(lǐng)導(dǎo)人的選舉。提交這樣的“用戶投票型燃燒”(user support burns)的用戶將與該領(lǐng)導(dǎo)人分享等量份額的Stacks區(qū)塊獎(jiǎng)勵(lì)。
故障恢復(fù)能力。這個(gè)設(shè)計(jì)確保發(fā)生燃燒鏈不穩(wěn)定,或者不適合Stacks區(qū)塊鏈挖礦時(shí),Stacks區(qū)塊鏈可以使用另一條不同的燃燒鏈。
關(guān)于燃燒證明組件的更多細(xì)節(jié)參見文獻(xiàn)。將來可能發(fā)生的情況是,一旦在Stacks區(qū)塊鏈上有足夠的自身算力,燃燒證明組件就不再需要了。
2. 可調(diào)諧證明
除了燃燒證明之外,Stacks區(qū)塊鏈的共識(shí)算法中包含了一個(gè)內(nèi)置的工作量證明(PoW)組件。這種組合分擔(dān)了在SIP-001中描述的燃燒證明選舉系統(tǒng)所在區(qū)塊鏈的安全職責(zé)。這種內(nèi)置的工作量證明和燃燒證明的組合在我們系統(tǒng)里被稱為可調(diào)諧證明。允許引入內(nèi)置的PoW挖礦,而在當(dāng)前PoW利益較低時(shí),通過燃燒證明確保區(qū)塊鏈的穩(wěn)定。當(dāng)?shù)讓尤紵溩呦蛩ヂ鋾r(shí),可調(diào)諧的功能給我們更靈活的遷移??蓞f(xié)調(diào)機(jī)制的設(shè)計(jì)的靈活性還擴(kuò)展到今后新的共識(shí)機(jī)制。我們可以研究其它PoW和PoS的共識(shí)機(jī)制, 如果未來有必要采取新的共識(shí)機(jī)制, 也可以安全合理的引入。
PoW組件在領(lǐng)導(dǎo)人選舉中是這樣工作的,其允許候選人在他們的燃燒交易中可選地包含一個(gè)PoW隨機(jī)數(shù)。產(chǎn)生此隨機(jī)數(shù)需要的工作量(就是某種函數(shù),其計(jì)算結(jié)果哈希前置多少個(gè)0)對(duì)應(yīng)成候選人的“燃燒數(shù)量”。在初始時(shí),內(nèi)置的PoW將占比5%(相對(duì)于已提交的燃燒數(shù)量)。內(nèi)置的PoW組件仍在大量的設(shè)計(jì)和開發(fā)之中。隨著更多的細(xì)節(jié)具體化,這部分內(nèi)容(以及一個(gè)對(duì)應(yīng)的SIP)將被更新。
3. Atlas對(duì)等網(wǎng)絡(luò)
Atlas對(duì)等網(wǎng)絡(luò)是一個(gè)內(nèi)容可尋址的對(duì)等網(wǎng)絡(luò),實(shí)現(xiàn)了一個(gè)Gossip協(xié)議,每個(gè)節(jié)點(diǎn)跟蹤哪些其他節(jié)點(diǎn)當(dāng)前在網(wǎng)絡(luò)中,每個(gè)節(jié)點(diǎn)試圖保存網(wǎng)絡(luò)中所有數(shù)據(jù)的一個(gè)完整副本。該網(wǎng)絡(luò)的容量受到了Stacks區(qū)塊鏈的限制:數(shù)據(jù)集中的每一條新紀(jì)錄,都必須和Stacks區(qū)塊鏈上的一個(gè)交易相關(guān)聯(lián)。Atlas對(duì)等網(wǎng)絡(luò)是作為Stacks區(qū)塊鏈的一個(gè)子系統(tǒng)工作的。其設(shè)計(jì)成一個(gè)無結(jié)構(gòu)對(duì)等網(wǎng)絡(luò)(unstructured peer network)以避免節(jié)點(diǎn)加入或離開網(wǎng)絡(luò)引起的問題。而且,既然每個(gè)節(jié)點(diǎn)都保留所有數(shù)據(jù)的一個(gè)副本,數(shù)據(jù)的索引在Stacks區(qū)塊鏈上可用,那么新的Atlas節(jié)點(diǎn)可以快速同步其需要存儲(chǔ)的數(shù)據(jù),因?yàn)槭孪戎缿?yīng)該從其他節(jié)點(diǎn)存儲(chǔ)什么數(shù)據(jù)(通常在點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)中這對(duì)節(jié)點(diǎn)是未知的)。
Atlas網(wǎng)絡(luò)作為Stacks區(qū)塊鏈的“擴(kuò)展存儲(chǔ)”子系統(tǒng)運(yùn)行。我們的設(shè)計(jì)方案是盡可能少地依賴于直接與Stacks區(qū)塊鏈自身的交互,盡可能少地在其上存儲(chǔ)數(shù)據(jù)。對(duì)于許多在Blockstack上的應(yīng)用,例如Blockstack Naming System (BNS)的智能合約,其本質(zhì)上是有一個(gè)機(jī)制存儲(chǔ)不可改變和帶有時(shí)間戳的數(shù)據(jù)。在BNS里,這被用來將用戶名和路由信息關(guān)聯(lián),通過路由信息可以發(fā)現(xiàn)用戶個(gè)人資料和應(yīng)用數(shù)據(jù)。大多數(shù)的區(qū)塊鏈直接將這種數(shù)據(jù)存儲(chǔ)在區(qū)塊鏈上。然而,我們相反選擇將哈希存儲(chǔ)在區(qū)塊鏈上(空間昂貴),并實(shí)現(xiàn)了一個(gè)單獨(dú)的對(duì)等網(wǎng)絡(luò)來交換對(duì)應(yīng)于這些哈希的數(shù)據(jù)。
4. Stacks代幣用途
Stacks區(qū)塊鏈實(shí)現(xiàn)的原生Stacks代幣激活了Blockstack網(wǎng)絡(luò)上的幾項(xiàng)基礎(chǔ)操作:
1. 注冊(cè)數(shù)字資產(chǎn)的燃料。Stacks代幣用來注冊(cè)不同種類的數(shù)字資產(chǎn),例如:用戶名,域名,軟件授權(quán),播客,還有一些其他的。
2. 注冊(cè)/執(zhí)行智能合約的燃料。執(zhí)行智能合約需要燃料以支付驗(yàn)證合約正確性并執(zhí)行合約的開銷。Stacks代幣也被用來核銷在Stacks區(qū)塊鏈上存儲(chǔ)智能合約的成本。
3. 交易手續(xù)費(fèi)。Stacks代幣被用來支付交易手續(xù)費(fèi),以此Stacks區(qū)塊鏈才能記錄該交易。
4. 錨定的應(yīng)用鏈。對(duì)于在Blockstack上廣受歡迎的應(yīng)用,我們的區(qū)塊鏈有一個(gè)可擴(kuò)展的入口,應(yīng)用可以在Stacks區(qū)塊鏈上初始化自己的區(qū)塊鏈。這樣的“應(yīng)用鏈”燃燒Stacks代幣挖礦。
上面的列表并不是全部——隨著Blockstack網(wǎng)絡(luò)的成熟,我們期待網(wǎng)絡(luò)參與者會(huì)發(fā)現(xiàn)和開發(fā)出Stacks代幣的其他用處。我們當(dāng)前正積極研究一個(gè)“應(yīng)用權(quán)益”機(jī)制,使代幣持有者可以潛在參與我們的“應(yīng)用挖礦”開發(fā)者激勵(lì)計(jì)劃中。
Clarity (清)智能合約語言
Stacks區(qū)塊鏈支持加載和執(zhí)行智能合約,以對(duì)數(shù)字資產(chǎn)進(jìn)行編程控制?!扒濉边@個(gè)新智能合約語言優(yōu)化了安全和可預(yù)測(cè)性,強(qiáng)調(diào)了其不同于先前的智能合約系統(tǒng)的一些關(guān)鍵設(shè)計(jì)目標(biāo):
1. 該語言必須允許快速、精確的運(yùn)行時(shí)和空間需求的靜態(tài)分析。為了支持這一點(diǎn),該語言在單一交易的執(zhí)行中是非圖靈完備的。但就完整的交易歷史來說,該語言是圖靈完備的。
2. 智能合約應(yīng)該是由我們的虛擬機(jī)解釋執(zhí)行的,而非編譯。開發(fā)者編寫的合約代碼必須直接部署到區(qū)塊鏈上。
為了實(shí)現(xiàn)以上兩個(gè)性質(zhì),我們創(chuàng)造了一個(gè)新的LISP語言變種,特殊設(shè)計(jì)成智能合約的編寫語言。在SIP-002[24]中有關(guān)于Clarity(清)語言設(shè)計(jì)的更詳細(xì)討論。
1. 語言概覽
智能合約語言Clarity(清)與其他的LISP變種(例如:Scheme)相似,但是有如下的不同:
1. 遞歸是非法的,并且沒有l(wèi)ambda函數(shù)
2. 循環(huán)只能通過map,filter,或fold執(zhí)行
3. 唯一的原子類型是布爾,整型,定長(zhǎng)數(shù)組,以及控制主體(principals,是Blockstack智能合約語言中特有的數(shù)據(jù)類型)
4. 對(duì)原子類型的列表提供額外的支持,但該語言中唯一變長(zhǎng)的列表只能作為函數(shù)輸入出現(xiàn)(也就是說,對(duì)類似append或join的列表操作不支持)。我們也支持名稱和類型指定(named-and-typed)的元組。
5. 變量?jī)H能使用let綁定創(chuàng)建,不支持類似set的可變功能
6. 允許使用define語句定義常量和函數(shù)來簡(jiǎn)化代碼。但這純粹是句法意義上的。如果一個(gè)定義不能被還原(inlined),該合約將被視為非法被拒絕。這些定義同時(shí)也是私有的,在某個(gè)函數(shù)中這樣的定義,只能被指定智能合約中定義的其他函數(shù)所調(diào)用。
7. 通過define-public語句指定的函數(shù)是公有函數(shù)。傳給這些函數(shù)的參數(shù)必須指定類型。
智能合約有下面的權(quán)力:
1. 從其他的智能合約調(diào)用公有函數(shù)。這些智能合約以其哈希標(biāo)識(shí),被調(diào)用智能合約必須在調(diào)用者智能合約發(fā)布時(shí)已存在。結(jié)合遞歸的非法性,這樣做將防止函數(shù)重入,這在現(xiàn)存的智能合約平臺(tái)上是一個(gè)通用的攻擊途徑。
2. 擁有并控制數(shù)字資產(chǎn)。就像公鑰或多重簽名地址一樣,智能合約是一級(jí)主體。
每個(gè)智能合約有自己的數(shù)據(jù)空間(data-space)。在此數(shù)據(jù)空間中的數(shù)據(jù)被存儲(chǔ)在map里。這些存儲(chǔ)將一個(gè)typed-tuple與另一個(gè)typed-tuple相關(guān)聯(lián)(很像一個(gè)有類型的鍵值對(duì)數(shù)據(jù)庫)。相對(duì)于表(table)數(shù)據(jù)結(jié)構(gòu),map只關(guān)聯(lián)一個(gè)指定的key到一個(gè)唯一確定的value。
每個(gè)智能合約可以從任何其他智能合約的map里取數(shù)據(jù)。但是,只有一個(gè)智能合約可以直接在其自己的map里更新數(shù)據(jù)。
由于以下兩點(diǎn)原因,我們選擇使用map,而不是其他的數(shù)據(jù)結(jié)構(gòu):
1. 由于map結(jié)構(gòu)的簡(jiǎn)單性,使得虛擬機(jī)內(nèi)實(shí)現(xiàn)更簡(jiǎn)單,函數(shù)推導(dǎo)更容易。通過檢查一個(gè)指定函數(shù)的定義,可以清楚的看到哪些map將被修改;甚至在那些map中,哪些key會(huì)受到一個(gè)給定調(diào)用的影響。
2. Map接口確保其操作的返回類型是定長(zhǎng)的,這對(duì)智能合約運(yùn)行時(shí)、成本和其他屬性的靜態(tài)分析是必須的。
2. 圖靈不完備和靜態(tài)分析
創(chuàng)造一個(gè)非圖靈完備語言是一個(gè)重要的設(shè)計(jì)考慮。在區(qū)塊鏈這種惡意的網(wǎng)絡(luò)環(huán)境中,這一點(diǎn)為編程帶來了許多好處。
1. 圖靈不完備使靜態(tài)分析能夠決定執(zhí)行一個(gè)指定交易的成本。這允許網(wǎng)絡(luò)預(yù)先清楚地知道向一個(gè)指定交易收取多少手續(xù)費(fèi)。這也會(huì)提升客戶端的體驗(yàn),因?yàn)閷?duì)客戶端來說廣播一個(gè)交易的成本可知了,所以能容易地傳達(dá)給用戶。
2. 圖靈不完備允許靜態(tài)分析可以快速?zèng)Q定一些重要屬性,例如單個(gè)交易可能調(diào)用了哪幾個(gè)合約。這提升了用戶體驗(yàn),因?yàn)榭蛻舳丝梢跃嬗脩絷P(guān)于一個(gè)給定交易的任何潛在副作用。
3. 改進(jìn)的、精確的靜態(tài)分析將允許程序員充滿信心地分析他們的智能合約,在上線之前發(fā)現(xiàn)任何可能的缺陷和錯(cuò)誤。
基本上我們認(rèn)為,像對(duì)待其他編程形式一樣對(duì)待智能合約編程是個(gè)錯(cuò)誤。區(qū)塊鏈的性質(zhì)造就了智能合約非常重要的特性。我們認(rèn)為犧牲編程的簡(jiǎn)易,來換取增進(jìn)的人和計(jì)算機(jī)對(duì)智能合約行為的全面理解,是一個(gè)好的權(quán)衡。已有的智能合約使用實(shí)踐證實(shí)了這點(diǎn)——圖靈完備智能合約的歷史基本上是智能合約bug的歷史。
在智能合約語言“清”中,在廣播智能合約之前運(yùn)行的靜態(tài)分析可以提供如下的信息:
1. 廣播指定交易的成本是其輸入大小的函數(shù)
2. 可以修改任意特定表的交易集合
未來的工作可以支持甚至更高級(jí)的分析功能,例如自動(dòng)檢查智能合約代碼上的證據(jù)的能力。
3. 解釋型語言 vs. 編譯型語言
在我們智能合約語言Clarity(清)中的另一個(gè)關(guān)鍵設(shè)計(jì)決策是,選擇一門解釋型語言,而不是編譯型語言(例如,編譯成WASM)。與同時(shí)期的其他方法相比,我們不采用編譯器的設(shè)計(jì)決策是一個(gè)根本的不同。采用這種設(shè)計(jì)決策的主要原因,是對(duì)程序?qū)崿F(xiàn)的bug歸因的能力。
程序?qū)崿F(xiàn)的bug是無法更改的事實(shí),即使有最好的編碼規(guī)范,也無從避免。智能合約的bug(區(qū)塊鏈)是如此,其他代碼也一樣。智能合約的bug處理起來更復(fù)雜。不同的區(qū)塊鏈社區(qū)奉行“代碼即法律”的哲學(xué),提交到區(qū)塊鏈上的法則是最終真相的來源(source of ultimate truth)。編寫智能合約的開發(fā)者通過源代碼表達(dá)他們的意愿,然而是編譯將他們的意愿轉(zhuǎn)換為實(shí)際的法則。這會(huì)導(dǎo)致因?yàn)榫幾g器的bug使實(shí)際法則偏離開發(fā)者意愿的情況。會(huì)產(chǎn)生令人不快的情況,人們將爭(zhēng)論是開發(fā)者意愿更重要還是法則更重要。在Stacks區(qū)塊鏈里,我們移除編譯步驟,直接提交開發(fā)者意愿到區(qū)塊鏈,避免這種狀況,以使開發(fā)者意愿絕不會(huì)偏離法則。
讓我們考慮一下在智能合約語言(也就是虛擬機(jī))的實(shí)現(xiàn)里出現(xiàn)bug的情況。如果智能合約語言使用解釋器,那么解決bug相對(duì)容易實(shí)施。世界上的所有合約代碼都在區(qū)塊鏈上,只需要對(duì)解釋器打一個(gè)補(bǔ)丁,然后從創(chuàng)世塊開始重啟區(qū)塊鏈(重新應(yīng)用到所有的交易)。
但是如果智能合約語言是編譯的,該bug是在編譯器內(nèi)部,而非虛擬機(jī),那補(bǔ)救措施就沒那么明顯了,因而可能會(huì)發(fā)生更多的爭(zhēng)議。這是因?yàn)榫幾g器里的一個(gè)bug可以導(dǎo)致其生成的代碼(最終廣播到區(qū)塊鏈上)產(chǎn)生與開發(fā)者初衷背離的行為。在加密數(shù)字貨幣社區(qū)里,在對(duì)“代碼即法律”哲學(xué)的認(rèn)同下,這種情況愈加復(fù)雜。由開發(fā)者編寫的代碼是正確的,但是區(qū)塊鏈上產(chǎn)生的交易是錯(cuò)誤的。收集每個(gè)開發(fā)者的源代碼并重新編譯是不現(xiàn)實(shí)的,尤其在無法驗(yàn)證源代碼是否已改變的情況下。我們懷疑,在實(shí)踐中這種情況下在區(qū)塊鏈上發(fā)布的代碼多數(shù)是最終真相的源。如果是這樣,開發(fā)者應(yīng)該歸因和驗(yàn)證此代碼,而不是他們的源代碼。我們相信,使用一個(gè)高級(jí)的解釋型語言對(duì)于確保正確的智能合約執(zhí)行是至關(guān)重要的。
Gaia:用戶控制的存儲(chǔ)
Blockstack使用Gaia存儲(chǔ)系統(tǒng)給用戶對(duì)其數(shù)據(jù)的控制權(quán)。這是一個(gè)用戶控制的存儲(chǔ)系統(tǒng),使應(yīng)用可以與私人數(shù)據(jù)鎖柜(private data lockers)交互。私人數(shù)據(jù)鎖柜可以托管在一個(gè)云服務(wù)提供商,或者是其他的數(shù)據(jù)存儲(chǔ)服務(wù)商。重要的是,用戶控制使用哪一個(gè)提供商。Gaia上的數(shù)據(jù)經(jīng)過加密,并使用用戶控制的密鑰簽名。邏輯上,Gaia像是一個(gè)廣域的文件系統(tǒng),可以被掛載以保存文件。
使用Gaia存儲(chǔ)系統(tǒng),用戶要指定一個(gè)Gaia存儲(chǔ)位置的地址,在此保存數(shù)據(jù)。只是Gaia存儲(chǔ)位置的“指針”被保存到Stacks區(qū)塊鏈上(以及Atlas子系統(tǒng)上)。當(dāng)用戶使用Blockstack認(rèn)證協(xié)議登錄應(yīng)用和服務(wù)時(shí),將此位置傳遞給應(yīng)用;有了這個(gè)信息,應(yīng)用知道如何與指定地Gaia數(shù)據(jù)鎖柜交流,如此應(yīng)用數(shù)據(jù)被保存到用戶指定的存儲(chǔ)里。
Gaia的設(shè)計(jì)哲學(xué)是,以一種終端用戶無需信任底層云服務(wù)提供商的方式重用現(xiàn)有的云服務(wù)提供商和基礎(chǔ)設(shè)施。我們看待云存儲(chǔ)服務(wù)提供商(像Amazon S3, Google Cloud Storage,甚至一個(gè)本地磁盤)只是作為一個(gè)通道(dumb drives),在上面存儲(chǔ)加密過的,和/或簽名過的數(shù)據(jù)。云服務(wù)提供商看不到用戶的數(shù)據(jù);他們只能看到加密的數(shù)據(jù)塊。
而且,因?yàn)橥ㄟ^Stacks區(qū)塊鏈可發(fā)現(xiàn)相關(guān)聯(lián)的公鑰或數(shù)據(jù)哈希,云服務(wù)提供商沒有篡改用戶數(shù)據(jù)的能力。
向Gaia服務(wù)器寫數(shù)據(jù)涉及到POST數(shù)據(jù)到服務(wù)器的合適位置。這些POST在服務(wù)器端被驗(yàn)證,檢查是否此寫請(qǐng)求附帶了一個(gè)簽名的認(rèn)證token。這個(gè)token使用私鑰簽名,控制了是否對(duì)特定的bucket有寫權(quán)限。為了給用戶的每一個(gè)應(yīng)用提供分離的bucket,用戶將為每一個(gè)應(yīng)用推導(dǎo)出不同的私鑰。每一個(gè)私鑰僅賦予Gaia服務(wù)器上特定bucket的訪問權(quán)限。
在Gaia里,用戶的區(qū)塊鏈驗(yàn)證的路由信息中包含一個(gè)URL,指向一個(gè)簽名過的JSON對(duì)象(由該用戶的owner key簽名)。這個(gè)簽名過的JSON對(duì)象內(nèi)包含指向該用戶Gaia數(shù)據(jù)鎖柜的URL。一旦應(yīng)用知道用戶的Gaia數(shù)據(jù)鎖柜的位置,就可以使用普通的HTTP請(qǐng)求向那個(gè)位置請(qǐng)求一個(gè)文件。為了查詢不同用戶創(chuàng)建的文件,應(yīng)用可以完全在客戶端順序地執(zhí)行查詢。這在初始查詢時(shí)會(huì)有時(shí)間延遲的開銷,但是路由信息中的許多數(shù)據(jù)可以由瀏覽器本地緩存(或者由本地應(yīng)用),所以后續(xù)的查詢就像傳統(tǒng)的互聯(lián)網(wǎng)數(shù)據(jù)訪問一樣快了。
圖1顯示了Gaia的總覽。查詢一個(gè)像werner.id一樣的名字,其工作流程如下:
1. 在Stacks區(qū)塊鏈上查詢?cè)撁郑〉茫╪ame,hash)對(duì)
2. 在Blockstack的Atlas對(duì)等網(wǎng)絡(luò)里查詢hash(name),得到該名字的路由信息文件。
3. 從路由信息文件中取得該用戶的Gaia URL,接著查詢此URL,連接至存儲(chǔ)后端。
4. 從指定的Gaia服務(wù)處GET/PUT數(shù)據(jù)(如果需要且讀者有此訪問權(quán)限,則進(jìn)行解密),并驗(yàn)證相應(yīng)的簽名或哈希。
上面的步驟1和步驟2可通過對(duì)blockstack-core在/v1/names/《name》訪問點(diǎn)上的一個(gè)簡(jiǎn)單調(diào)用即可執(zhí)行。這些重復(fù)的讀寫操作已在我們的開發(fā)者程序庫中自動(dòng)處理了。
性能。我們架構(gòu)的目標(biāo)是相對(duì)構(gòu)建于云服務(wù)提供商之上的傳統(tǒng)互聯(lián)網(wǎng)應(yīng)用提供可比的性能。通過移除控制和失效的中心點(diǎn),我們引入了有意義的安全和容錯(cuò)的好處——在讀寫性能上付出一些小的額外開銷是值得的,只要這些額外開銷對(duì)普通用戶不那么重大或顯而易見。我們?cè)u(píng)估了Gaia的讀寫性能,顯示出其在讀寫底層存儲(chǔ)的文件上是有競(jìng)爭(zhēng)力的。由于加密的緣故,Gaia為每個(gè)文件增加了一個(gè)可忽略的固定大小的存儲(chǔ)空間開銷(粗略為文件大小的5%)。加密也會(huì)有CPU的額外開銷;但是因?yàn)槲募叽缱兓浅P?,讀寫的網(wǎng)絡(luò)性能與直接訪問底層的存儲(chǔ)服務(wù)是相似的。
系統(tǒng)擴(kuò)展性。我們架構(gòu)的存儲(chǔ)層不是一個(gè)可擴(kuò)展性的瓶頸。同期的云存儲(chǔ)系統(tǒng)是高度可擴(kuò)展的。Atlas網(wǎng)絡(luò)也是擴(kuò)展性良好,因?yàn)槠洳⒉凰饕龁为?dú)的用戶文件或文件塊,只索引指向用戶存儲(chǔ)后臺(tái)的指針。存儲(chǔ)后臺(tái)處理批量的數(shù)據(jù)讀寫操作,Atlas網(wǎng)絡(luò)只在下述情況下參與 (a)用戶改變或更新了他的存儲(chǔ)后臺(tái)或者公鑰映射,或(b)新用戶在系統(tǒng)中注冊(cè)。當(dāng)注冊(cè)新域名/用戶時(shí),路由文件的哈希必須在區(qū)塊鏈上廣播。區(qū)塊鏈可能是可擴(kuò)展性的一個(gè)瓶頸(相對(duì)于Atlas網(wǎng)絡(luò)),但用戶極少寫區(qū)塊鏈。另外,鏈下名字注冊(cè)的使用可以在一個(gè)單一的區(qū)塊鏈交易中注冊(cè)超過100個(gè)用戶,由此可以支持每天數(shù)十萬個(gè)用戶注冊(cè)(可以與傳統(tǒng)云上平臺(tái)的每日新用戶數(shù)量相比)。提升Gaia到10億用戶量級(jí)在實(shí)踐中可能會(huì)暴露出可擴(kuò)展性問題,但明顯現(xiàn)在不會(huì)發(fā)生,解決這些挑戰(zhàn)是正在進(jìn)行和將來工作的一個(gè)研究領(lǐng)域。
認(rèn)證
使用互聯(lián)網(wǎng)應(yīng)用,用戶賬戶是至關(guān)重要的。Blockstack提供給用戶一個(gè)通用的用戶名,無需任何密碼,可用于所有的應(yīng)用。不像基于密碼的認(rèn)證,用戶使用公鑰密碼學(xué)進(jìn)行認(rèn)證:一個(gè)本地運(yùn)行的軟件客戶端處理來自特定應(yīng)用的登錄請(qǐng)求,并對(duì)認(rèn)證請(qǐng)求簽名。
Blockstack Auth是我們的認(rèn)證協(xié)議,其將應(yīng)用與用戶的Gaia hub以及任何應(yīng)用相關(guān)的私鑰連接在一起。應(yīng)用使用這些信息將用戶和其數(shù)據(jù)保存,驗(yàn)證其他用戶產(chǎn)生的數(shù)據(jù)是真實(shí)的。
1. 單點(diǎn)登錄
Blockstack Auth使用公鑰密碼學(xué)進(jìn)行認(rèn)證。用戶登錄一個(gè)應(yīng)用以使此應(yīng)用可以產(chǎn)生和存儲(chǔ)簽名過的數(shù)據(jù),其他用戶可以讀取和驗(yàn)證其數(shù)據(jù)。這反過來向其他用戶證明了該登錄用戶是合法的。
在Blockstack中,登錄的目的是向應(yīng)用客戶端提供足夠的信息,來產(chǎn)生和存儲(chǔ)真實(shí)的數(shù)據(jù)。這意味著,認(rèn)證功能可以以一個(gè)認(rèn)證器(authenticator)應(yīng)用的形式,獨(dú)立運(yùn)行在用戶的計(jì)算機(jī)上。因?yàn)樗械拿侄际窃赟tacks區(qū)塊鏈上注冊(cè)的,每個(gè)應(yīng)用和認(rèn)證器一直有一個(gè)最新的視圖 (1)所有存在的名字,和(2)所有名字的公鑰及Gaia hub。這消除了對(duì)一個(gè)服務(wù)端ID提供者的需要。
為了認(rèn)證用戶數(shù)據(jù),應(yīng)用客戶端只需能夠聯(lián)系一個(gè)Stacks區(qū)塊鏈節(jié)點(diǎn)。為此用戶在登錄時(shí)向應(yīng)用提供其首選Stacks節(jié)點(diǎn)的網(wǎng)絡(luò)地址。
用 戶 通 過 點(diǎn) 擊 “ 登 錄 ” 按 鈕 來 登 錄 一 個(gè) Blockstack 應(yīng) 用 。 此 應(yīng) 用 ( 調(diào) 用blockstack.js SDK)將用戶重定向到Blockstack認(rèn)證器應(yīng)用,請(qǐng)求登錄。用戶將看到可選擇的用于登錄的Blockstack ID,同時(shí)還有一個(gè)應(yīng)用所需的權(quán)限列表。選擇一個(gè)ID,認(rèn)證器則將用戶導(dǎo)回到應(yīng)用,并向應(yīng)用傳遞三個(gè)信息:
1. 用戶的用戶名(或者是公鑰的哈希,如果還沒用戶名的話)
2. 應(yīng)用特定的私鑰,用來加密和簽名用戶的數(shù)據(jù)。這是使用用戶主私鑰、登錄使用的ID和應(yīng)用的HTTP Origin所生成的確定性密鑰。
3. 用戶Gaia hub的URL,以及用來查詢其他用戶和數(shù)據(jù)的首選Stacks區(qū)塊鏈節(jié)點(diǎn)。
有了這些,用戶展現(xiàn)了其用戶名,通知應(yīng)用哪里可以找到和存儲(chǔ)其數(shù)據(jù)。在那里,應(yīng)用可以持久化地讀寫應(yīng)用特定的數(shù)據(jù),訪問其他用戶的應(yīng)用特定數(shù)據(jù)——所有這些不需要提供其自身的存儲(chǔ)或ID解決方案。
登出操作簡(jiǎn)單地清除應(yīng)用的本地狀態(tài),因此導(dǎo)致Web瀏覽器和客戶端忘記應(yīng)用特定的私鑰。
Blockstack程序庫和開發(fā)包
Blockstack PBC是一個(gè)公益公司(Public Benefit Corp),和開源貢獻(xiàn)者一起開發(fā)了Blockstack的核心協(xié)議和開發(fā)者程序庫。開發(fā)者程序庫使開發(fā)人員在Blockstack網(wǎng)絡(luò)上構(gòu)建應(yīng)用更簡(jiǎn)單,而Blockstack客戶端使用戶可以和Blockstack網(wǎng)絡(luò)的不同組件以及不同應(yīng)用進(jìn)行交互。
1. 開發(fā)者程序庫
Blockstack設(shè)計(jì)成讓開發(fā)人員開發(fā)去中心化應(yīng)用盡可能地簡(jiǎn)單。與Stacks區(qū)塊鏈或去中心化存儲(chǔ)的交互復(fù)雜性大多向應(yīng)用開發(fā)者隱藏了,他們可以只關(guān)注應(yīng)用的邏輯。Blockstack開源代碼庫包含了一些不同平臺(tái)的開發(fā)者程序庫:一個(gè)Javascript Web SDK (blockstack.js),iOS和Android的移動(dòng)SDK。所有這些程序庫都是在MIT許可協(xié)議下可用,訪問此鏈接可獲取 https://github.com/blockstack。
這些程序庫提供所有必須的API接口,以及實(shí)現(xiàn)我們認(rèn)證協(xié)議的代碼,直接與Gaia服務(wù)器交互,生成Stacks交易。使用這些程序庫允許開發(fā)者創(chuàng)建尊重用戶安全和隱私的去中心化應(yīng)用,就像開發(fā)傳統(tǒng)的應(yīng)用一樣容易。
Radiks 對(duì)于希望穿透復(fù)雜的社交圖譜分享數(shù)據(jù)的應(yīng)用來說,對(duì)數(shù)據(jù)建立索引通常是有用的和最有效的。Radiks系統(tǒng)是一個(gè)服務(wù)器和客戶端的程序庫,用來構(gòu)建并與這樣的索引交互。Radiks程序庫使開發(fā)人員可以在應(yīng)用內(nèi)創(chuàng)建跨用戶的結(jié)構(gòu)化數(shù)據(jù)集,可以通過字段的值查詢。這要求一個(gè)服務(wù)器端的組件處理索引和查詢,可關(guān)鍵這不是用戶信任的計(jì)算環(huán)境的一部分。其只能看到數(shù)據(jù)的密文和一些必要的元數(shù)據(jù),后者用于構(gòu)建索引以及通過索引應(yīng)答查詢。
2. 用戶軟件
雖然應(yīng)用開發(fā)者將使用開發(fā)包和程序庫與Blockstack網(wǎng)絡(luò)進(jìn)行交互,但用戶還需要軟件來執(zhí)行諸如注冊(cè)用戶、指定其Gaia服務(wù)器以及應(yīng)用用戶認(rèn)證等功能。Blockstack生態(tài)系統(tǒng)目前提供兩個(gè)可使用戶與網(wǎng)絡(luò)進(jìn)行交互的開源項(xiàng)目:
1. Blockstack瀏覽器。這是目前推薦的認(rèn)證器應(yīng)用的一個(gè)開源實(shí)現(xiàn),而且其允許用戶瀏覽可用的Blockstack應(yīng)用、注冊(cè)用戶名以及認(rèn)證應(yīng)用用戶。Blockstack瀏覽器可以在桌面上進(jìn)行本地安裝,也可以采用web部署。
2. Blockstack CLI。這是一個(gè)命令行實(shí)用程序,允許高級(jí)用戶和開發(fā)者與Blockstack協(xié)議交互。除了提供認(rèn)證功能,其允許用戶創(chuàng)建原始交易,以及通過Gaia進(jìn)行高級(jí)數(shù)據(jù)管理任務(wù)。
應(yīng)用和服務(wù)
截至2019年初,Blockstack上已經(jīng)搭建了100多個(gè)應(yīng)用。開發(fā)者正在搭建各種不同類型的應(yīng)用,在app.co上可找到持續(xù)增多的Blockstack應(yīng)用的完整清單。由于Blockstack是模塊化的,不同的應(yīng)用可獨(dú)立地使用不同的組件。以下是我們對(duì)一些示例用例做出的簡(jiǎn)要概述。
目前,Blockstack上的辦公效率應(yīng)用使用Blockstack認(rèn)證和Gaia存儲(chǔ),用戶可以創(chuàng)建、編輯以及共享文件。為幫助用戶發(fā)現(xiàn)彼此的文件,這些應(yīng)用使用Blockstack個(gè)人資料檢索器。該檢索器是去中心化的——因?yàn)閭€(gè)人資料集是全球可見的,是可以被發(fā)現(xiàn)的,任何人都可以部署及運(yùn)行個(gè)人資料檢索器。
Blockstack生態(tài)系統(tǒng)還包含許多社交應(yīng)用。通常情況下,這些社交應(yīng)用使用 Blockstack認(rèn)證,同時(shí)部署一個(gè)Radiks服務(wù)器,以使用戶高效地發(fā)現(xiàn)并獲取其他用戶的資料。在至少一個(gè)用例中,應(yīng)用使用一個(gè)專用的中繼通道在眾多用戶間路由加密的信息。Blockstack上的發(fā)布和存儲(chǔ)應(yīng)用不僅使用Gaia存儲(chǔ)用戶資料,而且還將其通過傳統(tǒng)的HTTP URL與非Blockstack用戶分享。
開發(fā)者獎(jiǎng)勵(lì)。Stacks區(qū)塊鏈擴(kuò)大了挖礦的概念,應(yīng)用開發(fā)者可以通過在網(wǎng)絡(luò)上發(fā)布高質(zhì)量的應(yīng)用 “挖”Stacks代幣。這一機(jī)制被稱作應(yīng)用挖礦,其被設(shè)計(jì)成一種激勵(lì)機(jī)制,以期在網(wǎng)絡(luò)上獲得高質(zhì)量應(yīng)用。應(yīng)用挖礦計(jì)劃目前由擁有多名獨(dú)立審閱人的Blockstack PBC運(yùn)營。開發(fā)者可以將其應(yīng)用每月提交一次以審閱,并基于其應(yīng)用在應(yīng)用排名機(jī)制中的表現(xiàn)獲得獎(jiǎng)勵(lì)。應(yīng)用由一組獨(dú)立審閱人審閱,每名審閱人對(duì)于什么樣的應(yīng)用才是好應(yīng)用有自己的評(píng)定標(biāo)準(zhǔn)。應(yīng)用得到的總分決定了其排名情況。
結(jié)論
Blockstack是一個(gè)去中心化計(jì)算網(wǎng)絡(luò),向開發(fā)者提供了用于搭建去中心化應(yīng)用的全棧。迄今為止,我們的網(wǎng)絡(luò)上已經(jīng)搭建了100多個(gè)去中心化應(yīng)用。Blockstack無需開發(fā)者運(yùn)行服務(wù)器和數(shù)據(jù)庫:取而代之的是用應(yīng)用將數(shù)據(jù)寫到用戶控制的私人數(shù)據(jù)鎖柜里。這一去中心化存儲(chǔ)系統(tǒng)與傳統(tǒng)云存儲(chǔ)在性能上相當(dāng),只因加密/解密引入一點(diǎn)開銷。我們的認(rèn)證協(xié)議無需采用基于密碼的登錄方式,那種方式不如加密認(rèn)證安全。用戶可以使用單一賬戶訪問所有服務(wù)和應(yīng)用,不必持續(xù)不斷的為新服務(wù)創(chuàng)建新賬戶。我們的開發(fā)者程序庫使得在該平臺(tái)上開發(fā)去中心化應(yīng)用與搭建傳統(tǒng)互聯(lián)網(wǎng)應(yīng)用一樣簡(jiǎn)單。
在本文中,我們呈現(xiàn)了Blockstack的最新設(shè)計(jì)。自2016年和2017年產(chǎn)品的早期實(shí)現(xiàn)以來,Blockstack的核心設(shè)計(jì)一直在演進(jìn),吸取了從產(chǎn)品部署中得到的經(jīng)驗(yàn)教訓(xùn)以及去中心化應(yīng)用開發(fā)者的反饋。與早期(2017年)的白皮書相比,主要變化包括(a)對(duì)Stacks 區(qū)塊鏈的說明,其使用新穎的可調(diào)諧證明機(jī)制來安全地啟動(dòng)一條新的區(qū)塊鏈,和(b)對(duì)新智能合約語言Clarity(清)的說明,關(guān)注智能合約的安全和可預(yù)測(cè)性。我們已經(jīng)以開源的方式發(fā)布了Blockstack 。
評(píng)論
查看更多