跳到主要內容

In Math We Trust

ArcBlock
區塊鏈去中心化

日前,ArcBlock 研發副總裁陳天應邀出席 Erlang 社群全球開發者年度大會 Code BEAM SF 2019 並發表主題演講,會後撰文分享如何從技術角度理解對區塊鏈的信仰——

這次 Code Beam,我的演講題目是:Build a decentralized, public-verifiable DB。過去兩年,區塊鏈忽冷忽熱,催生許多流星般的 buzzword,也造就不少值得深入探討的概念,例如公開可驗證(public verifiable)。公開可驗證探討的是信任——我們如何在不信任對方身分的情況下信任資料本身。網際網路時代,信任基於身分,也就是基於權威。我們信任微信上的好友資料、Google 的搜尋結果,只因資料來自微信、Google 這樣的巨頭。我們「信任」它們,不是真的相信它們不作惡,而是別無選擇,只能從經濟角度一廂情願地認為作惡的代價高於不作惡。

以 Code Beam 門票為例。我們信任 Eventbrite 並向它購票,是因為 1)它是這個領域的權威;2)Code Beam 在此平台售票。購票者把信任寄託於:1)Eventbrite 會如實儲存購票紀錄供 Code Beam 驗證;2)其資料庫足夠安全,資料不會損壞、遺失或遭惡意竄改;3)即使資料損壞或遺失,也有足夠備份恢復至合理狀態。

工程師都知道這種信任多麼脆弱。資料庫雖設有層層存取權限,並費心規劃災難復原,但所有操作的基礎都建立在資料本身可信。因此,所有安全手段只是在確保資料存取者能處理獲准的資料。假設只允許 Tyr 向 asset 表格新增資料,不可修改或刪除,那麼只要 Tyr 登入資料庫,即使隨意塗鴉,只要符合資料型別,資料庫也會照單全收。

無論 postgres、riak、aurora 或 dynamodb,只要使用者擁有寫入權限,就能寫入任何真實或虛假的資料。

換句話說,資料的可信並非建立在資料本身,而是依賴其環境安全。因為信任環境,所以信任資料——多麼完美的邏輯!這讓我想起某集 Mission Impossible 中,阿湯哥跳進藏於水壩下的資料中心,更換資料卡,成功協助 Benji 竄改身分的情節。

有沒有辦法在資料輸入時就保證其完整性與不可竄改性?

答案很簡單——數位簽章

為方便說明,假設有一個人人都能存取的資料庫 Cyberbase——任何人無須批准,就能寫入與自己相關的資料。資料庫只接受簽章正確的資料,並依一定規則更新。

例如我要把微信年齡改為 18 歲。在現有系統裡,我告訴微信:「請把我的年齡改成 18 歲」,微信再告訴資料庫:

update user set age = 18 where id = 'a008374856...';

在 Cyberbase 中,我用私鑰簽署一項事實(fact):Tyr 今年 18 歲。更新規則是:若發起人(sender)的簽章正確,就執行 sender.age = 18。如此一來,關於 Tyr 的 fact 只能由 Tyr 陳述;第三方 Alice 沒有 Tyr 的私鑰,無法正確簽章,也就不能偽造相關 fact。

傳統資料庫與 Cyberbase 的第一個重要差異就在這裡:傳統資料庫不在意資料的正確性與完整性,而交由應用程式保證;只要發起更新的 client 已獲授權,就會盲目更新狀態。Cyberbase 則從輸入源驗證事件,只有簽章有效的 fact 才會依條件更新。

有了 fact,仍不能保證 Cyberbase 的資料未遭竄改。即使 Tyr 的年齡依其 fact 更新為 18 歲,也可能被改成 81 歲。因此,我們需要某種機制,確保任何非法更新都會被發現。這裡不是確保非法更新不會發生——不存在絕對安全的系統與環境,可能發生的事終將發生;我們要控制的是發生後的影響。

我們可以使用 Merkle tree,不斷合併零散原始資料並進行 hash,建立最終彙整至 root hash 的樹。任何資料變更都會改變其 hash,進而逐層影響合併後的 hash,最終 root hash 必然改變。在現有數學模型下,沒有演算法能竄改資料而不逐層反映至 root hash。因此,只要每次更新都妥善儲存 root hash,資料竄改必會被發現。就像 Tyr 的各種資料彙整在臉上,一看這張臉便能拆穿 81 歲的謊言。

然而,妥善儲存 root hash 說來輕鬆,做起來並不簡單。駭客若能把 Tyr 的年齡改成 81,自然也能逐層修改 merkle tree 的 hash、偽造新樹,並修改所謂妥善儲存的 root hash。若 root hash 也被更改,Cyberbase 就會信任偽造資料。因此,把 root hash 與資料存在同一處並不妥善。

存在異地呢?若不信任自己的伺服器,就把 root hash,也就是 Tyr 的臉,存進銀行保險箱;要確認年齡是否遭竄改,只須開箱查看。但仍有兩個問題:1)成本高昂,無法承受系統資料更新的頻率;2)如何保證通訊通道安全,並驗證另一端傳回的確實是真實資料?

有點慌。

換個角度,既然存在自己這裡不安全、存在別人那裡不可信,不如昭告天下,讓每次資料變更產生的 root hash 全網皆知。如此一來,只要駭客無法讓掌握資訊的足夠多人全數遭到操控(超過 1/3),就無法成功竄改資料。

這就解決了儲存 root hash,卻擔心資料遭竄改而無法發現的問題。

整理目前的 Cyberbase:每個人透過對事件簽章,獨立產生與自己有關、可驗證且可信的 fact。這些 fact 依規則寫入 Cyberbase,成為資料庫狀態(state)。狀態以 merkle tree 組織成完整信任樹,樹根是 root hash;將 root hash 廣播至網路後,駭客作惡門檻大幅提高,使竄改成本高到不可行。

到目前為止,我們沒有依賴任何環境安全——無論實體、網路或作業系統安全。我們依賴植根於數學的密碼演算法與預設規則,端到端保證資料可信。

仍缺少一個重要環節:誰來保證規則正確執行?Cyberbase 可能運作於故障磁碟,即使規則執行正確,寫入與讀出的資料也不一致;駭客也可能修改規則程式碼,使可信的 fact不可信的程式碼提交至可信的 state,最終產生不可信的 state

因此,我們要讓任何人都能運行 Cyberbase。網路中每個節點都能持續接收 fact,並依預定規則獨立執行。只要初始值(genesis data)、收到的 fact 及順序、執行規則皆相同,就會得到相同的最終 state,也就是相同的 root hash。如此,單點故障或規則遭竄改不會影響全局;駭客必須竄改足夠多節點才能成功。網路愈大、節點愈分散,攻擊成本就愈高。

這就是去中心化(decentralization)與公開可驗證(public-verifiable)。建構這樣的 Cyberbase,我們不必信任任何人,只須信任宇宙萬物運行的基石——數學。它創造了一種美妙的平等:資料面前人人平等;巨頭與個人提供的服務,在信任層面一視同仁。印刷術與文藝復興打破上層社會對知識的壟斷,讓知識面前人人平等;資訊革命與網際網路打破少數媒體對資訊創作、傳播的壟斷,讓資訊面前人人平等;Cyberbase 背後的區塊鏈技術則有機會打破可信資料由 Google、微信、Facebook 等網路巨頭壟斷的局面,讓資料面前人人平等。每個服務提供者的競爭優勢將來自資料分析、使用者體驗與需求理解,而不是資料壟斷。

原文連結: 誠者,天之道也

本頁涉及

術語

  • Decentralization

    它不是一個整體屬性,而是對每一部分分別要問的問題:誰能改動它、誰能扣住它、事後誰能核實它。一個系統通常只在某些部分是去中心的,另一些部分不是。

  • 區塊鏈

    透過密碼學連接記錄,並按共同的驗證與共識規則確定交易歷史的分散式帳本。