1. 程式人生 > >Blockstack: A Global Naming and Storage System Secured by Blockchains

Blockstack: A Global Naming and Storage System Secured by Blockchains

作者:Muneeb Ali, Jude Nelson, Ryan Shea, and Michael Freedman Blockstack Labs and Princeton University (USENIX ATC 16)

1. Motivation

當我們想要訪問facebook的個人資料的時候,我們通常會在瀏覽器下輸入facebook的域名,這個時候我們會首先訪問DNS伺服器,將域名轉化為ip,然後再去訪問facebook伺服器所在的ip地址,在這個過程中,域名的管理機構比如verSign(威瑞信)有一套pki體系會驗證域名是否合法,這兩步都完成之後,我們就可以去訪問到自己的資料。如下圖所示:

因為有時候中心化的第三方經常會發生資料洩露的事件,因此作者提出一個系統想把這些過程全部變成去中心化的過程。這個系統可以讓使用者註冊一個唯一且人類可讀的使用者名稱和與使用者名稱相聯絡的公鑰,同時將使用者產生的資料與使用者名稱和公鑰繫結。將上面的過程簡化成如下形式:

2. Background

作者首先想到的是NameCoin這個系統,NameCoin是從Bitcoin上fork下來的一個分支,在它上面做了一些業務上的修改,它是除了比特幣外執行最久的一個區塊鏈系統。

NameCoin的作用提供傳統DNS(域名管理系統)服務商類似的功能,但與傳統系統不一樣的是Namecoin基於去中心化的區塊鏈,是一種分散式的DNS,它將域名與IP對映的資訊全都存在了區塊鏈上,這樣可以阻止網路審查,保證資訊自由釋出。我們常用的com和cn的DNS服務商分別由美國和中國控制,所以政府可以審查網站內容,甚至關閉。但現在NameCoin把域名和IP的對映資訊全都存在區塊鏈上,不允許其修改,

一些問題

a. 區塊鏈的安全問題

這個系統首先在nameCoin上執行,出現了一下這些問題:首先是區塊鏈的安全問題,NameCoin的使用的整體算力不是很高,而且是基於比特幣的區塊鏈,很容易出現單個礦池掌握百分之51以上的算力,比如上圖就是兩大礦池在2015年的七八月份出現挖礦的算力比例。這樣這個區塊鏈很容易受到攻擊。

b. 一些未知的協議或者軟體問題

NameCoin因為不成熟會出現一些軟體不穩定的問題,比如說可能會因為網路中的某些人傳送的交易中資料欄位很多,區塊在打包這個交易時花費的時間很長,會導致一些延遲問題。可以看出圖中NmaeCoin這個系統在2014年的時候在產生第19200個區塊的時候,有很大的網路延遲。

c.網路吞吐量的降低

有些大型的礦池有意或者因為其他原因無法把交易打包進他正在寫的區塊,這些交易就只能由其他的礦工來完成打包任務,這個時候網路的吞吐量就會大大下降。

3. Design of Blockstack

作者根據以上問題,發現這個NameCoin系統的效能和安全性有很大的問題,這個時候要尋找一個安全穩定的區塊鏈,但發現這種要求的區塊鏈只有目前比較成熟的比特幣和以太坊等。於是作者就想把業務層和區塊鏈分離開來,底層使用原有的BitCoin系統。作者在這裡提出了一個blockstack的分層結構,將系統分成了兩層—控制層和資料層。其中控制層中包含了一層單獨的區塊鏈層以及還有一層定義了註冊使用者,使用者公私鑰的建立,以及一些與使用者名稱繫結的hash函式的建立的業務層,資料層主要負責資料的儲存。整個系統架構如下:

其中控制層分為兩層,一層是區塊鏈層,另一層是虛擬鏈層;資料層也分為兩層,分別是路由層和儲存層。

a. 區塊鏈層

第一次:區塊鏈層,它負責儲存blockstack的一些操作序列,同時就這些操作序列的順序一致提供共識。作者在blockstack系統中將該層的區塊鏈系統設定成了bitcoin,因為bitcoin相對其他的區塊鏈來說執行的時間最長,穩定性比較好。系統會把這些操作序列處理成bitcoin所能接受的交易的形式儲存在區塊鏈上,

b. 虛擬鏈層

虛擬鏈定義了blockstack上的操作序列,比如建立使用者,插入資料,刪除資料等等這些操作序列,這個操作序列可以看成一種狀態機,比如圖中這些都是針對使用者x,y,z的操作序列,當bitCoin中有一個新區快產生的時候,blockstack會去讀取該區塊,從其中找到可以接受的交易傳到虛擬鏈這一層。在將這些操作序列接收之前,會檢查系統的blockstack是系統否達成共識,即系統會驗證系統當前的操作序列是否保持一致,然後驗證使用者名稱下面的加密地址是否一致。如果這些都沒有問題,就會將這些操作資訊存入blockstack資料庫,資料的組織形式和圖上一樣,一個域名,也就是使用者名稱,加密地址,zonefile的hash值。

c. 路由層

剛才說到了,虛擬鏈層儲存了域名和對應的zonefile的hash,而zonefile實際上是儲存在路由層的。

Zonefile在傳統的DNS裡指的是一組包含如何將網路域名轉換為對應的IP地址的指令集,裡面通常包含了域名對應的IP的資訊。而在本系統中,zonefile和它的意義差不多,裡面存放的是域名對應的資料存放在哪個雲服務商的伺服器裡。

d. 儲存層

儲存層以key-value的形式儲存真實的資料,這些資料都會被使用者所擁有的公鑰進行加密

整個系統架構部署在BitCoin上如下:

4. 全域性一致HASH——Simple Name Verification

因為blockstack的底層採用的是其他的區塊鏈系統,有可能一些節點沒有在某些時刻達到一致,這個時候上層的blockstack需要驗證一把。驗證的辦法如下:

驗證全域性一致hash的時候,它會將當前區塊中與本系統相關的交易取出來同時加上之前區塊已經計算過的針對對應塊的Ph值,做一個共同的hash計算,這裡要注意,它並不會遍歷所有的區塊,它只會遍歷編號為h減去2的i次冪的區塊。舉例如下,現在只取一部分割槽塊:

假設現在底層區塊鏈的塊高是h,先將塊中是關於blockstack的交易取出來,組織成一棵默克爾樹的形式,拿到根節點,然後再去將之前得到的塊h-1,h-2,h-4,h-8的值做一個求和取hash的計算。就會得到快高為h的共識hash值了。

5. Future Work

未來的工作,因為現在系統的底層是BitCoin,作者想測試一下把它遷到以太坊,或者超級賬本試一試,同時設想將這三個都作為底層的區塊鏈系統試一試。

相關知識

DNS

DNS( Domain Name System)是域名系統的英文縮寫,是一種組織成域層次結構的計算機和網路服務命名系統,它用於TCP/IP網路,它所提供的服務是用來將主機名和域名轉換為IP地址的工作。

DNS的查詢過程

假設現在我們要訪問www . qq .com的過程。

1.在瀏覽器中輸入www . qq .com 域名,作業系統會先檢查自己本地的hosts檔案是否有這個網址對映關係,如果有,就先呼叫這個IP地址對映,完成域名解析。

2.如果hosts裡沒有這個域名的對映,則查詢本地DNS解析器快取,是否有這個網址對映關係,如果有,直接返回,完成域名解析。

3.如果hosts與本地DNS解析器快取都沒有相應的網址對映關係,首先會找TCP/IP引數中設定的首選DNS伺服器,在此我們叫它本地DNS伺服器,此伺服器收到查詢時,如果要查詢的域名包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具有權威性。

4.如果要查詢的域名,不由本地DNS伺服器區域解析,但該伺服器已快取了此網址對映關係,則呼叫這個IP地址對映,完成域名解析,此解析不具有權威性。

5、如果本地DNS伺服器本地區域檔案與快取解析都失效,則根據本地DNS伺服器的設定(是否設定轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS伺服器收到請求後會判斷這個域名(.com)是誰來授權管理,並會返回一個負責該頂級域名伺服器的一個IP。本地DNS伺服器收到IP資訊後,將會聯絡負責.com域的這臺伺服器。這臺負責.com域的伺服器收到請求後,如果自己無法解析,它就會找一個管理.com域的下一級DNS伺服器地址http://qq.com給本地DNS伺服器。當本地DNS伺服器收到這個地址後,就會找http://qq.com域伺服器,重複上面的動作,進行查詢,直至找到www.qq.com主機。

6、如果用的是轉發模式,此DNS伺服器就會把請求轉發至上一級DNS伺服器,由上一級伺服器進行解析,上一級伺服器如果不能解析,或找根DNS或把轉請求轉至上上級,以此迴圈。不管是本地DNS伺服器用是是轉發,還是根提示,最後都是把結果返回給本地DNS伺服器,由此DNS伺服器再返回給客戶機。

論文原文以及相應的slides地址:github

參考資料

[1] DNS原理及其解析過程

[2] BlockStack:A Global Naming and Storage System Secured by Blockchains. USENIX ATC ’16

[3] Blockstack:只用一個數字ID行走區塊鏈世界?

[4] Blockstack:給DAPP開發者和使用者的便捷橋