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)html

1. Motivation

當咱們想要訪問facebook的我的數據的時候,咱們一般會在瀏覽器下輸入facebook的域名,這個時候咱們會首先訪問DNS服務器,將域名轉化爲ip,而後再去訪問facebook服務器所在的ip地址,在這個過程當中,域名的管理機構好比verSign(威瑞信)有一套pki體系會驗證域名是否合法,這兩步都完成以後,咱們就能夠去訪問到本身的數據。以下圖所示:git

由於有時候中心化的第三方常常會發生數據泄露的事件,所以做者提出一個系統想把這些過程所有變成去中心化的過程。這個系統可讓用戶註冊一個惟一且人類可讀的用戶名和與用戶名相聯繫的公鑰,同時將用戶產生的數據與用戶名和公鑰綁定。將上面的過程簡化成以下形式:github

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地址映射,完成域名解析,此解析不具備權威性。

五、若是本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,若是未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS服務器收到請求後會判斷這個域名(.com)是誰來受權管理,並會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息後,將會聯繫負責.com域的這臺服務器。這臺負責.com域的服務器收到請求後,若是本身沒法解析,它就會找一個管理.com域的下一級DNS服務器地址http://qq.com給本地DNS服務器。當本地DNS服務器收到這個地址後,就會找http://qq.com域服務器,重複上面的動做,進行查詢,直至找到http://www.javashuo.com/tag/www.qq.com主機。

六、若是用的是轉發模式,此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開發者和用戶的便捷橋樑?

相關文章
相關標籤/搜索