banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.
follow
substack
tg_channel

P2P網絡

P2P(Peer-to-Peer)網絡即點對點網絡,是無中心伺服器、依靠用戶群(Peers)交換信息的互聯網體系(圖 2-1),是分佈式網絡的一種。通常而言,該網絡中各個節點之間的地位是對等的。與有中心伺服器的中央網絡 C/S 系統(Client-Server)(圖 2-1)不同,點對點網絡的每個節點既是客戶端,也是伺服器。節點之間依靠相互間的連接進行信息交流,各節點共享它們所擁有的資源(如磁碟存儲空間、網絡帶寬、處理器使用率等)來提供服務和內容。因此,當新節點加入網絡時,整個系統的容量也相應增大。

image

與 C/S 網絡模式相比,P2P 網絡尤其適用於共享文件:在 C/S 結構中,資源存儲在一個中心伺服器裡,在固定的帶寬下,請求下載的用戶越多,平均下來每個用戶的數據傳輸越慢。而對 P2P 網絡而言,許多節點存儲著同一份文件的副本,當有人需要下載它時,可以同時從多個節點進行下載,而自己已下載的文件,也可同時上傳給其他正在下載的節點,因此網絡越大,速度越快。P2P 網絡充分利用了網絡中其他對等節點的帶寬,而不只是利用文件來源節點的帶寬。

在共享文件方面的成功,使 P2P 網絡廣受歡迎,但是由於大部分共享的文件是流行音樂和電影,侵權的問題也使 P2P 網絡饱受诟病。** 在一個典型的 P2P 網絡中,數據可以隨意複製,副本可以任意保存。但是資產顯然是不可以隨意複製、存在多個副本的。** 中本聰創建的比特幣項目,保留了 P2P 網絡的 “分佈式” 特徵,也解決了資產在 P2P 網絡中轉移的問題:資產在不同的地址之間流動,而不是簡單 “複製”;礦工在交易信息的過程中,將核實資產的去向。以下將對比特幣的 P2P 網絡進行具體說明,這一模式或可對使用區塊鏈技術解決版權保護等問題提供啟發。

比特幣中的 P2P 網絡#

在比特幣網絡中,每個節點可隨機連接到其他節點,節點也可隨時加入網絡或離開網絡。整個網絡的節點總數是不確定的。各個節點在進行信息更新時,它們並不是實時一致的,而是只需在一定時間內達到一致。也就是說,部分節點的退出或崩潰,並不會帶來整個網絡的癱瘓;用戶的加入和退出並不會對整體網絡產生太大影響。

節點與節點之間的信息交換,主要以交易廣播的方式體現。交易廣播通過泛洪(flooding)的方式來實現。具體來說,節點發起一個交易的時候,會將這筆交易的信息告知所有相鄰節點,相鄰節點將根據存儲的歷史交易信息校驗這筆交易是否可以進行,如果校驗通過,這一交易信息會繼續接力傳播給下一批相鄰節點。交易信息會像漣漪一樣在節點群裡擴散、傳播開來。當節點接收到的交易信息與該節點交易池的信息重合,即表明這一信息已經傳播一次,這才終止廣播。由於每個交易有獨一無二的哈希值,通過哈希值查詢交易信息是否重複非常方便。

需注意的是,在 P2P 網絡中,由於帶寬等原因,信息的傳遞往往是有延遲的。因此不同節點的交易池內容略有不同。如果有人發起雙重支付攻擊,並且兩筆支付到達了同一個節點,誠實的節點將會僅保留一個交易,另一個不再廣播,最終網絡中不同的節點可能在短時間內存在記錄不同交易的分歧,但是沒關係,隨著時間的推移,共識機制保證了最終只會記錄一筆交易,使得雙重支付攻擊無法成立。

簡要而言,比特幣項目在 P2P 網絡中建立起一個現金支付系統,主要依靠以下因素:節點之間地位對等;交易信息在節點間以泛洪的方式傳播;節點檢查交易是否成立;由共識機制確定合法的交易信息。

P2P 網絡的局限性與權衡#

P2P 網絡的優勢如容錯、可擴展的傳輸速度、數據安全性等,但在區塊鏈項目中,這是以低交易處理能力為代價的。目前如火如荼的公鏈競爭中,許多項目都在交易處理能力上大顯身手(例如宣稱 “每秒可處理過萬筆交易” 等),也從側面表明了這是現有區塊鏈技術尚待解決的問題。事實上,隨著越來越多的節點被添加到其網絡中,信息在節點間的傳輸延遲逐漸積累,信息傳播至全網絡所需的時間越來越長。因此,P2P 網絡項目均需在低交易吞吐量和中心化之間進行權衡。當設置少部分 “超級節點” 進行交易信息的校核時,可提高交易信息的處理效率,但同時也使得網絡變得中心化。在一個所有節點的地位都相同的網絡中,所有節點都進行了交易的校驗,將造成一定程度的重複勞動與資源浪費。

區塊鏈技術令人興奮,與其去中心化的特點有很大關聯,而去中心化很大程度上是由 P2P 網絡作為基礎的。P2P 網絡是一個非常均衡的構想,然而也需要付出一定的資源作為代價。在均衡的網絡與提高工作效率之間,尚需進行取捨。建立一個高效率的點對點網絡,還需要我們共同在通信技術上繼續進步。

區塊鏈技術則提出一種分佈式賬本的架構,把第三方機構從系統中剔除,讓人與人之間可以直接進行交易。區塊鏈的解決思路是讓所有用戶都擁有一個賬本,所有用戶都參與到記賬的過程中。然而這樣也帶來一個問題:如何確保所有用戶擁有的是同一個賬本?如何保證賬本信息的一致性?

在區塊鏈中,交易信息是向全網絡廣播的,每個節點都能接收到交易信息。由此,** 賬本信息的一致性問題,實際上變成一種 “唯一性” 問題,** 只要設計一種規則,確保只有唯一一種交易信息能通過篩選保留下來,即可保證各個用戶記錄下來的是同一種信息。

而 “區塊” 和 “鏈” 就是實現這種唯一性的數據結構。區塊存儲的是一段時間內的交易信息,實際上是對交易信息的一種封裝;在比特幣裡,一個區塊可存儲約 3000 筆交易信息。一旦這個區塊被確認,3000 筆交易就一同被確認了。如果不對交易信息進行封裝,每次確認一筆交易,則需要高頻的確認操作,效率較低。

每個區塊包含指向上個區塊的地址信息,如此環環相扣,形成從最新區塊到創世區塊的一條 “鏈”。不同的共識機制,提供不同的方案來產生新的區塊;有時候,同一時段內有可能產生 2 個(或更多)內容不同的區塊,這就是 “分叉”。不同的區塊之後,各自又會產生新的區塊,而使各個鏈條有所延長。但一般而言,鏈條延長的速度是不同的。絕大部分區塊鏈項目都遵循 “選最長鏈作為主鏈” 的規則,這一規則可保證即便出現分叉,在一定時間後,總能有一條鏈條是公認的 “主鏈”。

image

由於最長鏈是唯一的,所有用戶都將把同一鏈條記錄在本地數據庫上,這就保證了賬本的唯一性,也就解決了賬本一致性問題。

此外,鏈式結構還帶來一個好處。所有的區塊都通過 “鏈” 連接在一起,形成了一個緊密的整體。如果黑客想要篡改歷史上的某筆交易內容,則需要篡改交易所在的區塊;黑客無法創造一個新的區塊並直接進行替換,而需要把從這個區塊直至最新區塊的整個鏈條都重新替換(在比特幣中,也就是從需要修改的區塊開始重新挖礦,連續挖出此後的所有區塊,並在進度上最終超過其他所有礦工,創造一條新的最長鏈),代價高昂。由此可避免篡改交易等攻擊。

** 然而這種數據結構仍然存在問題:數據處理能力較低。在區塊鏈中,為了避免存在衝突的交易信息(不允許持續分叉),也為了保證賬本的一致性(需選出唯一的鏈),區塊鏈採用的是最長單鏈結構。由於每次只能新增一個區塊,在 P2P 網絡中,區塊信息的傳播、確認需要時間,而區塊的容量有限,這就使得一段時間內,能記錄的交易信息存在上限。可見,“數據處理能力低” 實際上是滿足一致性要求而付出的代價。** 目前比特幣區塊鏈平均一秒只能處理約 7 筆交易,與中心化的電子支付系統存在較大差距。

為解決數據處理能力低(交易吞吐量小)的问题,一個重要的思路是讓多筆交易同時並行處理。側鏈技術通過對主鏈上的款項進行鎖定、解鎖的操作,可把不同的區塊鏈進行連接,擴充了交易處理的空間。而分片的思路則是把用戶劃分為不同的片區,每個片區裡的交易可以獨立驗證、並行進行,而跨片區之間的交易則需進行額外處理。在側鏈、分片技術中仍存在主鏈,兩者均是通過限制交易的靈活性(如款項被冻结、交易的對象受限等),在保障安全的前提下,滿足賬本的一致性。

image

image

而另一方面,DAGDirected Acyclic Graph有向無環圖)則是對另一種數據結構形式的探索。在一般的區塊鏈項目中,所有節點保存的信息都是相同的;而採用 DAG 技術的項目,則允許各個節點保存不同的信息。在 DAG 中,區塊可以隨時產生,而一個區塊與多個父區塊進行連接。這樣一來,所有人可以隨時記賬,交易信息的記錄速度大為提高。

image

然而由於多個區塊同時產生,且均有效,DAG 無法以 “唯一最長鏈” 來保證一致性。在這方面,有的項目以 “歷時性” 來保證 DAG 上賬本的一致性。具體而言,在 DAG 中一個新區塊將隨機選擇兩個次新的區塊進行連接,同時對與之相連的所有區塊進行交易信息的驗證。經歷了多次驗證的區塊,其交易內容存在衝突的可能性很低,可被認為是已確認的交易信息。這一方案裡,一致性的驗證依賴於區塊網絡的延伸和增長。

其他項目則以 “全連接” 來保證賬本一致,即每個新的區塊都與之前所有區塊相連,並驗證此前的所有交易信息。還有的項目以 “次序” 來保證一致性,由區塊遞歸投票來確認新的區塊等。

DAG 帶來吞吐量的提高,然而 “一致性” 始終是個有待解決的複雜問題,目前問題的解決都需要付出一些代價:可能是交易信息的確切驗證時間有所延誤;也可能是節點與節點之間需要進行大量的網絡通信,使得實際交易速度仍有待觀察。

歸根到底,** 分佈式賬本的一致性問題,是一個平衡的問題。** 不妨說 “一致性” 是一個系統目標,而達成這一目標需要付出相應的資源,因此或犧牲交易速度,或限制交易的靈活性,或延後確認時間,或提高對全網的傳輸要求,都是不同系統條件下進行的適應性選擇。相信上述提及的不同技術,將在不同的應用場景下,得到進一步的探索和驗證。

在 P2P 網絡中,各個節點地位相同,節點之間進行信息傳輸;在一個分佈式賬本中,需要保證各個節點之間存儲的內容相同。而 “共識機制” 則是使各個節點內容相同的一種解決方案。在 P2P 網絡裡,有可能存在節點性能下降、網絡擁塞等情況,使得系統中傳播了錯誤的信息。** 因此在設計共識機制時,要默認系統中存在不可靠的節點。** 從算法的角度,這些機制的設計本質上是基於經濟利益的博弈,使得誠實記賬所獲的收益,大於進行惡意破壞的收益,這樣一來即可保證絕大部分人的合作。

技術的邊界#

人們在設計一款新產品時,都必須了解當下技術的邊界:哪些技術已經可以完全使用了,哪些技術還要等待一段時間。對於需要等待的技術,人們不得不在之後再進行考慮。當然,科學和技術有一些不同,科學研究可以給出理論上的極限邊界,而從工程設計的角度更多考慮的是如何在大概率情況會出現的大致邊界內,整體上做到最好。這類似於一種優化問題,需要知道給定的約束條件,才能正確地求解。

就共識機制而言,前人的研究已經給出了兩個重要的邊界:

● Fischer-Lynch-Paterson 定理:它證明了在一個多進程的異步系統中,只要有一個進程不可靠,那麼就不存在一個協議,此協議能保證有限時間內使所有進程達成一致;

● CAP 原理:分佈式計算系統不可能同時確保一致性(Consistency)、可用性(Availability)和分區容忍性(Partition tolerance),設計中往往需要弱化對某個特性的保證。

其中一致性是指系統中服務節點對於處理結果達成的一致;可用性是指在有限時間內,任何非失敗節點都能應答請求;分區容忍性是指網絡可能發生分區,使得節點之間的通信得不到保障。

在分佈式場景下達成完全一致性是不可能的,但是工程上的許多問題的解決,都在於如何進行合理地取捨,可以犧牲一部分代價來換取分佈式場景的一致性。目前,基於區塊鏈設計的各種共識機制的不同主要來源於以下兩個方面:

第一、算法假設的條件不同。如 Paxos、Raft 等算法假設節點不會故意發送錯誤的消息,這是一個比較強的條件。在比特幣使用的 PoW 共識機制的前提條件是並不預先知道系統內有多少記賬的節點,而聯盟鏈裡常使用的 PBFT 等協議則假設節點需要許可。

第二、付出一些代價以換取一定程度的一致性。例如根據 CAP 原理,弱化可用性,在系統故障時拒絕服務,Paxos、Raft 等算法就是弱化了可用性來保證結果的一致性。再如比特幣犧牲了一部分容錯性(有可能出現分叉),但是保證了整個區塊鏈系統在一定時限後的一致性。

算法當然不是萬能的,它的邊界決定了必須要引入一些其他的激勵和約束機制來使得整個系統正常工作

在基於 PoS(Proof of Stake,權益證明)的區塊鏈項目中,創建新的區塊並不需要消耗算力,而節點作惡也並沒有什麼懲罰;對於一個節點來說,利益最大化的選擇是在多條鏈上同時挖礦,這會造成嚴重的分叉現象,一般需要針對這些情況引入額外的規則,如加入懲罰的協議等。

公有鏈的常用共識機制#

公有鏈裡的共識機制設計主要圍繞去中心化和增強激勵,目前的許多新型區塊鏈體系,支持可插拔的共識機制模塊,可以根據應用場景和需求,切換使用不同的共識機制。

保持主鏈的 “唯一性”,對公有鏈來說至關重要,因為這是解決 “双重支付” 問題的關鍵:為了避免雙重支付的出現,就應當獲悉所有歷史交易信息,以確保這筆交易與此前的歷史不發生衝突。如何在雙方信息不對稱、不確定的環境下,使得交易仍可順利進行,這就是 “拜占庭將軍問題”。

比特幣的 PoW(Proof of Work,工作量證明)機制通過以下途徑來解決拜占庭將軍問題:

● ** 維持周期循環,保證節點步調一致:** 調整難度來保證網絡一直需要花費 10 分鐘找到一個數學難題的解,並產生一個新區塊。在這 10 分鐘內,網絡上的參與者發送交易信息並完成交易,最後才會廣播區塊信息,這樣就杜絕了節點無限制、無規律地發送命令的狀態。

● ** 通過算力競賽,確保新區塊由單個節點生成:** 比特幣通過時間戳和電子簽名,確保在某一個時間段內只有一個(或少數幾個,這時屬於分叉現象)節點可挖出新區塊。

● ** 通過區塊鏈,使用一個共同賬本:** 比特幣網絡中的各個節點,在每個循環周期內是信息同步的。

事實上,無論採取什麼樣的方式,只要保證時間統一、步調一致、單點廣播、一個鏈條就能解決加密貨幣這種分佈式系統的拜占庭將軍問題。

PoS 作為另一種共識機制,礦工掌握的加密貨幣數量占比等於其挖出新區塊的概率。這會導致首富賬戶的權力更大,有可能支配記賬權,也會造成權益越來越中心化,但是 PoS 確實大大減少了挖礦的能源成本。長遠來看,可能會有更多的幣種向 PoS 方向發展。

除了以上兩種比較常見的基本的主流共識機制,目前的公有鏈共識機制的創新點在於兩者之間的混合,從而在保留去中心化特徵的同時提高數據處理的效率

例如以 Decred 為代表的 PoW/PoS 混合共識:

  • 挖礦的過程和比特幣類似,也需要完成一定量的工作量證明,但是在達成共識的環節有所區別,不同於比特幣需要全網節點來驗證區塊,最終以最長的鏈為主鏈,混合機制引入 PoS 投票來決定剛挖出的區塊是否有效,大大提高了驗證的速度。除此以外還有以 Hcash 為代表的 PoW/PoS 混合共識,結合雙層鏈結構。將 PoW 難度分成兩級,分別發布在兩條鏈上,使得 PoW 礦工和 PoS 礦工都能參與系統共識並發揮作用。

聯盟鏈的常用共識機制#

聯盟鏈更注重隱私、安全和監管,因此會加入更多的管控元素,採用類似於傳統的拜占庭家族共識機制

聯盟鏈相對於公有鏈而言,弱化了對於去中心化的強調,同時由於節點準入制,相當於已經賦予了節點一定的信任。

DPoS(Delegated Proof-of-Stake,股份授權證明)機制裡有股票權的人是通過選舉產生和更換的,而不是像 PoS 這樣根據幣的數量來產生的。它通過不同的策略,不定時地選中一小群節點,由這一小群節點做新區塊的創建、驗證,簽名和互相監督,大幅減少了區塊創建和確認所需要消耗的時間和算力成本。DPoS 不需要太多的信任,所選的這些委託人不能改變交易的細節,如果節點存在試圖作惡、提供的算力不穩定、計算機宕機等行為,公開的社區可以快速將他投票驅逐。

如果說 PoW 和 PoS 都是以經濟模型為主解決共識問題,那麼 PBFT(**Practical Byzantine Fault Tolerance,實用拜占庭容錯算法)就是以算法模型來解決共識,** 它不存在代幣分發機制,能耗很低。過程可以簡述為大家先投票選出領導者,領導者記賬後,其他人投票通過。在 PBFT 算法中,可證明只要會出錯的拜占庭節點小於系統全部數量的 1/3,那麼整個系統就可以正常工作。目前的改進算法方向大致包括使用 P2P 網絡、動態調整節點的數量,減少協議使用的消息數量等。

聯盟鏈的共識機制算法的創新也包括了例如 DPoS 和 PBFT 的混合,將 DPoS 的授權機制應用於 PBFT 中實現動態授權,已有研究證明這樣的算法在最佳出塊為 20 秒的時間間隔下,TPS 可以達到 10000-12000,時延控制在 100-200ms 之間。正是由於聯盟鏈保留了部分的 “中心化”,從而得到了交易速度增快,交易成本大幅降低的回報。

共識的經濟成本#

共識是需要成本的,公有鏈如 PoW 付出了大量的算力成本、硬件損耗時間和自然資源,以進行運算,求解一個不具實際意義的難題,來競爭記賬權;而在聯盟鏈上要達成共識,則如民主投票一樣,需要經過一輪又一輪的磋商,交換意見,最後達成一致。如何降低民主的成本,如何用最少的磋商次數、最小的溝通成本達成共識是算法追求的目標,也是決定區塊鏈這台機器是否跑得足夠快的重要因素。

歸根到底,我們應關注的是共識機制在代價與效果之間的平衡。區塊鏈技術畢竟最終都需落地。對於企業而言,企業當然應該仔細思量自己的投入產出比,以決定是應該使用區塊鏈技術,還是說存在成本更低的替代性方案。

例如使用分佈式數據庫來解決企業之間的信息不對稱性,對數據設置查看權限和加密等級來實現不可篡改,並配合一系列的管理辦法,加上大部分場景裡可能龍頭企業並無太大的動機去實現數據篡改,並且有足夠的動力去維護數據庫,在這種情況下,設計得再複雜的共識機制也許並不如一個好的商業模式來得有效。

哈希函數的特性#

哈希函數是指一類數學運算過程,它接受任意大小的輸入值,經過運算後可以給出一個確定的固定長度的輸出值,這個輸出值可以作為這個輸入值的數字指紋。正如對於雙胞胎而言,他們各自的指紋也是獨一無二的,哈希函數的設計使得它也具有同樣的特性:即使是非常微小的輸入值差別,哈希函數的運算結果也會有非常巨大的差異。除此以外,哈希函數沒有任何啟發式算法,輸入和輸出的關係看起來是完全隨機的,例如給一個確定的輸出結果,要求對應的輸入值應該是多少,或者是要求輸出結果小於某個值,問一個符合條件的輸入值應該是多少,這些問題的求解沒有什麼技巧和方法可循,只能通過不斷地進行嘗試,嘗試的次數越多,越有可能找到答案。

人們可以利用哈希函數的這些特性實現很多功能。例如數據保護:將數據的內容和數據的哈希值一起發送,接收者對接收到的數據進行哈希運算,對比即可知道數據是否被篡改。再比如,網站在進行用戶登錄時,可以在數據庫裡存儲用戶密碼的哈希值,與用戶輸入的密碼的哈希值進行比對來驗證身份,好處是如果數據庫洩露,黑客也不能通過這些哈希值來反推出用戶的密碼,相對來說比較安全。

值得注意的是,哈希函數的輸入集合是無限的,而由於輸出長度固定,輸出的所有可能的集合是有限的,根據鴿籠原理:n+1 個元素放到 n 個集合中去,其中必定有一個集合裡至少有兩個元素。所以兩個不同的輸入值有相同的哈希值理論上是一定存在的,但這樣的事情發生的概率非常小,而且哈希函數也在不斷改進的過程中,SHA1 函數就曾經被密碼分析人員發現了有效的攻擊方法,此後如比特幣在內的系統採用了更先進的 SHA2 系列算法,比特幣多年的良好運行,表明 SHA256 算法經受了時間的檢驗。此外,連續多次使用哈希函數也是一種更加安全的選擇。

哈希函數在比特幣中有多處運用,可以說扮演了非常關鍵的角色。

  • 用途一:交易信息的壓縮和驗證

由於區塊鏈要處理的交易信息內容龐大,將每個塊內的所有數據直接以序列的方式存儲將會非常低效且耗時,但是利用哈希函數可以對信息進行壓縮和驗證。在 Merkle 樹(一種二叉樹結構,可理解為存儲數據的一種拓撲結構)結構中,結合哈希函數技術,可以快速驗證某筆交易是否屬於某個區塊。對於打包到一個區塊的所有交易,首先將它們劃分為交易信息 1、交易信息 2 等部分,並計算出對應的哈希值 1、哈希值 2,之後兩兩結合進行哈希運算,最終得到這個 Merkle 樹的根哈希值。如果某一筆交易信息記錄的數據有變化,那麼最終算出來的 Merkle 根哈希值也會不一樣。

image

那麼為什麼要使用這樣的算法,而不是直接將所有的交易信息串成一個大塊並且算出它的哈希值呢?原因在於這樣的二叉樹結構可以允許僅僅進行少量數據的驗證,同時如果交易的數據信息有誤,也可以快速定位至出錯的位置。

  • 用途二:工作量證明

什麼都說區塊鏈是不可篡改的呢?首先考慮一個簡單的哈希鏈:每次打包時包含上個區塊的哈希值和這個區塊的相關信息,如果某一個塊的信息被篡改了,往後所有塊的哈希值都會有變化,其他人也會注意到這個變化。但是這樣設計的問題在於任何人都可以修改某一個區塊上的信息,重新計算剩餘鏈條的所有信息,並且聲稱這才是正確的鏈條。

比特幣設計的精妙之處在於,它使得要實現這樣的過程需要付出昂貴的成本。它採用工作量證明的共識機制,大家爭相證明自己完成了一定的工作量,最先完成的獲得記賬權。而工作量指的就是要求找到一個隨機數,使得它加上一個給定的字符串後,計算得到的哈希值小於某個值。在比特幣中,這個給定的字符串包含了版本號、上個區塊的哈希值、以 Merkle 根哈希值存放的交易信息、時間戳、難度值的信息。** 礦工找到符合要求的隨機數,既 “合法” 宣告了自己的記賬權,也通過哈希函數完成了對交易信息的編碼,並以一種不可篡改的方式存儲。** 如果有人試圖想更改交易信息,他必須運氣特別好,能夠快速且成功地找到往後鏈條的每個區塊正確的隨機數,使得他篡改信息後的鏈條成為當前最長的鏈條,這樣的情況理論上的確可能發生,但是在算力有限的情況下,概率比較小。

  • 用途三:比特幣錢包地址

在比特幣的交易中,大家都能看到的信息如圖 5-2 所示,左上角是交易號碼,箭頭連接的兩個字母和數字組成的字符串是比特幣地址,表明比特幣在兩個地址之間有了轉移。而這個地址的生成是由錢包的公鑰經過哈希函數轉換而成的。其中公鑰是由隨機數字構成的私鑰通過非對稱加密形成的。交易時公鑰和比特幣地址都需要公開發布,來使區塊鏈系統驗證付款交易的有效性。

在這裡哈希函數扮演的角色相當巧妙:量子計算機可以很容易地從公鑰反推出私鑰,但是量子計算機在面對哈希算法時,則難以找出擁有同一個哈希值的兩個不同輸入值,可以說中本聰的這個設計使得通過一些操作可以讓比特幣有可能抵禦量子計算機的威脅:比如每枚比特幣地址都只用一次,每次付款轉賬到別人的地址和自己的找零地址中。

中本聰通過巧妙的設計很好地利用了哈希函數的特性,並最終形成了一個良好运轉的系統,這當中牽扯到了多種交叉學科,也提示人們在技術創新時需要抽象出事物的本質,注意與其他領域相互融合。隨著技術的進步,新的哈希函數也在不斷地被設計出來,並接受著大家的檢驗。

零知識證明#

零知識證明是一種基於概率的驗證方式,驗證內容包括 “事實類陳述” 和 “關於個人知識的陳述”。驗證者基於一定的隨機性向證明者提出問題,如果都能給出正確回答,則說明證明者大概率擁有他所聲稱的 “知識”。Zerocoin(零幣協議)將零知識驗證用於鑄造零幣和贖回零幣的過程中,以隱藏一筆交易對應的發送方和接收方信息。Zerocash(零鈔協議)採用更新穎的 zkSNARKs 技術,將需要驗證的交易內容轉換成證明兩個多項式乘積相等,結合同態加密等技術在保護隱藏交易金額的同時進行交易驗證。

缺點在於若網絡受到攻擊,在網絡上出現超發的零鈔,人們無法發現這一情況或採取措施;Zerocoin 和 Zerocash 均需要進行預先的 “信任設置”,沒有達到真正的 “去信任”。英特爾 SGX、zkSTARKs 等新技術有可能解決上述問題,但仍需實踐的檢驗。

零知識證明是一種加密方案,最初在 20 世紀 80 年代由 MIT 研究人員在論文中提出:“零知識協議是一方(證明方)可以向另一方(驗證方)證明某事是真實的方法,除了這一具體陳述是真實的事實以外,不透露任何額外的信息。例如對於登錄網站而言,在 Web 伺服器上存儲了客戶密碼的哈希值,為了驗證客戶實際上知道密碼,目前大部分網站採用的方式是伺服器對客戶輸入的密碼進行哈希計算,並與已存結果對比,但是這種方式的弊病在於伺服器在計算時就可以知道客戶的原始密碼,一旦伺服器被攻擊,用戶的密碼也就洩露了。如果能夠實現零知識證明,那麼就可以在不知道客戶密碼的前提下,進行客戶登錄的驗證,即使伺服器被攻擊,由於並未存儲客戶明文密碼,用戶的賬戶還是安全的”。

基本的零知識證明協議是交互式的,需要驗證方向證明方不斷詢問一系列有關其所掌握的 “知識” 問題,如果均能給出正確回答,那麼從概率上來講,證明方的確很有可能知道其所聲稱的 “知識”。

例如某人聲稱知道一個數獨難題的答案,一種零知識證明的方式是驗證方隨機指定這一次按列、按行還是按九宮格來檢測,每次檢測不需要看到數字擺的具體位置,只需要檢測出來是否包含了 1~9 個數字即可,只要驗證的次數足夠多,那麼可以大概率相信證明方是知道數獨題目的解的。但是這樣簡單的方式還不能讓人相信證明方和驗證方均沒有造假,在數獨的案例中,兩者有可能事先串通好,從而使得證明方在不知道答案的前提下通過驗證。

如果他們想讓第三方信服,驗證方必須也要證明自己每次的檢測方案是隨機的且自己沒有和證明方串通。

由於第三方觀察者難以驗證交互式零知識證明的結果,因此當向多人證明某些內容時,需要付出額外的努力和成本。而非交互式的零知識證明顧名思義,不需要互動過程,避免了串通的可能性,但是可能會額外需要一些機器和程序來決定試驗的序列:例如在數獨的例子中,通過程序的方式來決定哪一次按行、哪一次按列來檢測,但是這個試驗序列必須保密,否則驗證方預先知道了試驗的序列就有可能利用這個信息提前準備,在並不知道真實 “知識” 的情況下通過驗證。

零知識證明的內容可以概括為兩類:“事實” 類陳述:

  • 例如證明 “一個特定的圖可以進行三著色”,或者 “一個數 N 是合數”;

  • 關於個人知識的陳述:例如 “我知道這個特定圖的染色方案” 或者 “我知道 N 的因式分解”。

但並不是所有的問題都有零知識證明的加密方案, Goldreich、Micali 和 Wigderson 給出了理論上存在零知識證明解的有效範圍。他們發現對於複雜度為多項式級的決策問題(問題的答案僅為是 / 否),存在已知的零知識證明方案。只需要在這樣的 NP 問題中找到想要證明的論述,並轉化為三色問題的一個實例,那麼就可以利用已有的協議實現零知識證明。由於三色問題屬於 NPC 問題,任何其他的 NP 問題都可以轉化為這個問題的實例。

在區塊鏈上的交易中,如比特幣和以太坊網絡,除了使用地址來替換交易雙方的真實身份,使得交易具有部分匿名性以外,發送、接收地址和金額都是已知的,別人有可能通過網絡上的各種信息和現實世界發生的交互記錄等,將比特幣地址和真實身份對應起來,也因此具有隱私暴露的隱患。Zerocoin 設計了一種全新的思路,無法通過交易歷史分析來獲得用戶真實身份。Zerocoin 裡需要消耗一定價值的要交易的貨幣,以生成具有獨特序列號的一枚零幣。零知識證明可以在不透露花費了具體哪個貨幣的基礎上,驗證出你的確花了這筆錢。為了將這筆錢轉給他人,邏輯上需要使這枚零幣不能再被別人花費,零幣的辦法是大家共同維護一個作廢列表,存著所有已經花費的零幣的序列號。礦工在驗證這筆花費交易時,運用零知識證明的方法,不需要知道具體花掉哪一個零幣,也可以驗證零幣的序列號是否在作廢列表裡。由於花費交易並沒有輸入地址和簽名的信息,在整個交易過程中,礦工也並不知道這個零幣的來源,因此也就難以對交易歷史進行分析而獲取用戶身份。

在零幣裡,交易的金額是可以知道的,而採用 zkSNARKs 技術的 Zerocash 連交易金額都可以隱匿,賬本唯一公開記錄的內容就是交易的存在性。可以證明對於 NP 中的所有問題存在 zkSNARKs。它引入了多項創新技術,使它們可以在區塊鏈中使用。最重要的是,zkSNARKs 減少了證明的大小和驗證它們所需的計算量。它的過程可以簡述如下。

(1)將要驗證的程序拆解成一個個邏輯上的驗證步驟,將這些邏輯上的步驟拆解成由加減乘除構成的算數電路。

(2)通過一系列的變換,將需要驗證的程序轉換成驗證多項式乘積是相等的,如證明txhx)=wxvx)。

(3)為了使得證明更加簡潔,驗證者預先隨機選擇幾個檢查點 s,檢查在這幾個點上的等式是否成立。

(4)通過同態編碼 / 加密的方式使得驗證者在計算等式時,不知道實際的輸入數值,但是仍能進行驗證。

(5)在等式左右兩邊可以同時乘上一个不為 0 的保密的數值 k,則在驗證tshsk等於wsvsk時,就無法知道具體的ts)、hs)、ws)和vs),因此可以保護信息安全。

不同於 Zerocoin 的密碼學原語 RSA 累加器,zkSNARKs 技術較新,未經廣泛驗證,存在風險,同時由於更強的匿名性, Zerocash 的漏洞更難發現,和 Zerocoin 相比,Zerocash 由於交易金額信息也是未知的,所以如果有攻擊者無限制地發行零鈔,這樣的情況是無法檢測的。

除此以外,Zerocoin 和 Zerocash 均需要提前內置生成參數,用戶在使用這些網絡的時候,必須信任這些參數沒有被洩露,但是一旦這些參數被洩露,整個網絡將面臨毀滅性打擊。複雜的信任設置使得 Zerocash 存在爭議,即使他們設計了一套 “儀式”(例如錄下砸壞存有密鑰計算機的過程)來證明自己的安全性。

可能的解決辦法包括利用像英特爾 SGX 和 ARM TrustZone 這樣的現代 “可信執行環境”。就英特爾的 SGX 技術而言,即使應用程序、操作系統、BIOS 或 VMM 遭到了破壞,私鑰也是安全的。除此以外,最新提出的 zkSTARKs 技術不需要進行信任設置。

根據 zkSTARKs 白皮書中所述,zkSTARKs 是首次實現可以不依賴任何信任設置來完成區塊鏈驗證,同時計算速度隨著計算數據量的增加,而指數級加速的系統。它不依賴公鑰密碼系統,更簡單的假設使得它理論上更安全,因為它唯一的加密假設是散列函數(如 SHA2)是不可預測的(這一假設也是比特幣挖掘穩定性的基礎),因此也使其具有抗量子性。作為一種新穎的技術,和 zkSTARKs 一樣,它也需要經過時間的檢驗。

如果一個問題可以找到一個能在多項式的時間裡解決它的算法,則稱為 P 類問題。NP 問題是指可以在多項式的時間裡驗證一個解的問題。如果一個問題是一個 NP 問題並且所有的 NP 問題都可以約化到它,則稱為 NPC 問題。

哈希時間鎖協議#

哈希時間鎖協議Hashed-Timelock Agreements,**HTLAs)是一項可使不同區塊鏈項目之間進行代幣交易、互換的技術。** 在傳統的交易所進行代幣交易時,交易者往往需要把代幣提前質押給交易所,這帶來了一定的交易風險,並需要較高的手續費用。而在哈希時間鎖協議中,只需發送者、連接方、接收者三方,即可實現代幣的交易,期間不需要任何交易所平台,且在交易失敗時,代幣並未發生實際轉移,不需支付額外的交易費用。與交易所相比,哈希時間鎖協議相當於提供了一個 “跳蚤市場”,無須托管的第三方,交易所的作用被分散至社區內的個人,人與人之間可以安全地進行代幣間的交易。

哈希時間鎖協議技術想法的提出,最早應源於 2013 年 BitcoinTalk 論壇裡的一場討論;而技術的實際落地,又與比特幣的閃電網絡有關聯。在閃電網絡中,為實現兩個用戶之間的小額支付通道,用戶需提前鎖定自己的部分款項,兩個用戶涉及該部分款項的交易在鏈下進行。一段時間後,款項的最終分配確定下來,該分配方案再上傳至主鏈(圖 7-1)。這樣一來,即可使大量的小額交易在鏈下進行,提高了比特幣網絡的交易吞吐量。

閃電網絡中用於鎖定用戶款項的哈希鎖合同(Hashed Timelock Contracts,HTLC)技術啟發了後來的開發者們。代幣與代幣之間的交易,需要經由中間人的轉換,這其中的關鍵在於取得各方的信任。而對代幣進行鎖定的過程,正是一個可以產生信任的質押過程。

image

以一筆虛構的交易為例。假如 1 枚比特幣與 10 枚以太幣的價值等同,發送者(Sender)手上擁有 1.1 枚比特幣,希望購買接收者(Receiver)提供的價值 10 枚以太幣的服務。則發送者可以聯繫一個同時具有比特幣地址與以太坊地址的連接方(Connector),並協商好代幣轉換的手續費為 0.1 枚比特幣。那麼交易的流程如圖所示。

image

在這一過程裡,風險較高的是傳輸 1.1 枚比特幣的步驟:連接方有可能在收取 1.1 枚比特幣後馬上退出交易,使得發送方利益受損。合理的方案是把比特幣的交付延後處理。當以太幣實現交付後,再進行比特幣交付,交易風險即轉移至連接方(方案二)。

為了同時保障連接方的利益,需解決的問題是確保接收方在獲得 10 枚以太幣的同時,發送方的 1.1 枚比特幣也送往連接方,兩個事件需要同時發生。** 這實際上是交易 “原子性” 的體現:要麼款項完全實現轉移,要麼款項完全未轉移,不存在中間的狀態。** 這一問題由預共享密鑰(Pre-Shared Key,PSK)技術解決。

如果把 1.1 枚比特幣看作一個交易包,10 枚以太幣看作另一個交易包,在 PSK 技術中,這兩個交易包都由同一個密鑰啟動,從而實現 “两者同時發生”。

發送方預先由加密算法得到一個密鑰,把密鑰發送給接收者,把相關信息發給連接方。同時,發送方將自己的 1.1 枚比特幣鎖定在交易包 1 裡,需密鑰才能轉移款項。

連接方通過發送方給出的信息,製作一個包含 10 枚以太幣的交易包 2 並發給接收者。當接收者用密鑰打開交易包 2 時,接收者獲得 10 枚以太幣,同時密鑰也被發送給連接方,連接方可以使用該密鑰獲得交易包 1 裡的 1.1 枚比特幣。這樣一來就實現了代幣之間的互換。

為避免款項鎖定時間過長,交易包 1、2 均需約定限制時間,超出時間後,款項即解鎖、返回原地址,這就是時間鎖(Timelock)功能。而上文提到的預共享密鑰則使用了哈希加密(Hashed),因此該技術方案被稱為哈希時間鎖協議(Hashed-Timelock Agreements)。

局限性#

這一技術依然存在一定的局限性:

(1)連接方需承擔一定的風險。在 PSK 技術中,連接方需向交易包 1 注入密鑰才能獲得比特幣,也就是比特幣和以太幣的交付並非完全在同一時間發生。由於兩個幣種的交付均約定了限制時間,若交易包 2 的限制時間大於交易包 1,有可能使得接收者獲取 10 個以太坊後,連接方無法收回應得的 1.1 枚比特幣,而蒙受損失。這一風險可通過設定交易包 1 的限制時間總大於交易包 2 來避免。

image

**(2)對於不支持哈希時間鎖技術的區塊鏈項目,只能通過另外的賬本平台進行上述過程。** 額外的記賬平台可保存代幣之間轉移的交易記錄。然而由於記賬平台本身不發生代幣的轉移,本質上記錄的是賒賬、借賬的信息,需交易雙方之間相互具備充足的信任度,交易才可進行。而通過賬本平台,只要保證雙方具備信任基礎,非區塊鏈的資產亦可通過這一記賬方式進行交換。

** 本質上,不同資產之間的交易、流轉,只需提供信任基礎(產生聯繫),保證交易的原子性(資產交割),即可進行。** 而在哈希時間鎖協議中,代幣的鎖定實現了資產質押,為交易提供了信任基礎。而密鑰的傳遞,則保證了交易的原子性。同時時間鎖的引入,避免了交易時間過長而造成的糾紛或意外。除區塊鏈項目外,這一模式可應用到不同資產類別的流轉中。

哈希時間鎖協議技術已由 Ripple Interledger 項目基本實現,在可運行智能合約的區塊鏈項目中,幣與幣交易的落地或將逐漸變得普遍。** 這一技術提供了一種區塊鏈項目生態的可能性:** 如 BTC 等主流區塊鏈項目作為主結算系統,而其他應用項目針對性地解決用戶的不同需求。當用戶享受服務、進行結算時,使用代幣互換技術進行支付。這樣一來,主流項目傳遞價值;應用項目面向細分需求,同時為主流項目分攤服務壓力;用戶各取所需。最終將構建起一張全球共用的可信任的結算網絡,在此基礎上運行一切去中心化的應用,真正實現豐富的區塊鏈應用生態。

參考:

 https://bitcointalk.org/index.php?topic=193281.msg2224949#msg2224

分片技術#

傳統概念裡的分片技術是將數據庫分割成多個碎片並放置在不同的伺服器上。在現代的雲服務中,數據常常被托管在不同站點並進行分區。這一做法的原因包括使多台計算機之間的負載平衡,進而提高可擴展性;通過多站點存儲數據,來提高可用性等。

而區塊鏈分片技術則是基於數據庫分片概念的一種擴容技術。

無論在區塊鏈領域,還是數據庫領域,分片時要進行的第一步工作都是提取數據的關鍵特徵值,並將關鍵特徵值按照一定的規則來劃分給不同的碎片進行處理。關鍵特徵值的選擇非常重要,它關係著數據的唯一性保障以及分片的效果。關於特徵值的選取方法,一個言簡意賅的標準:“以你所認為的基本數據模式為標準”。因此在區塊鏈項目中經常可以看到分片的依據是用戶的私鑰 / 賬戶地址等,因為這些值是唯一的且不隨時間改變的,分片時邏輯比較清晰。

傳統數據庫的分片方式#

傳統數據庫的分片主要有三種方式:

**(1)哈希運算後取模:** 例如規定全網絡劃分為 3 個分片,則將數據經過哈希運算後用 3 求模,根據結果分配至特定的碎片,此種策略的目的是減少分片負載不均衡的發生,因為哈希函數計算出來的結果毫無規律,也就打破了因為一些關鍵特徵值和負載的量相關的情況,因此數據更有可能均勻分散於各個分片之間。一個反例則是,如果數據的關鍵特徵值是註冊時間順序的話,剛註冊的數據更為活躍,則有可能會把它們都分到某一個分片裡。但是這一方法的缺點在於如果有新的分片加入,重新平衡分片比較困難;其優點則在於不需要額外維護狀態信息。

**(2)一致性哈希:** 無虛擬節點的一致性哈希方式是指數據按照特徵值映射到首尾相連的哈希環上,同時也將節點按照一定規則映射上去,數據順時針找到的第一個節點為其所存儲的節點。有虛擬節點的一致性哈希和此類似,不過是將虛擬節點映射到哈希環上,因此,一個實際的物理節點可以占據哈希環上的多個範圍。此種方法需要維護狀態信息,也就是數據具體被分到哪個節點了,但是優點在於如果碎片的數目需要增加,則重新平衡分片更為容易。但是分片狀態信息的維護需要考慮一致性問題,較為複雜。

**(3)人為劃分區間:** 按照關鍵特徵值劃分成不同區間,每個節點對應一個或多個區間,類似一致性哈希的方式,也需要維護狀態信息。

  • 分片中的一致性挑戰

在區塊鏈技術中,需要有機制來知道哪個節點實現了哪個分片,在傳統數據庫系統中分片信息(即元數據,指哪些數據劃分到了哪個碎片內)一般需要專門的伺服器存儲,有時為了減輕元數據伺服器的壓力,分佈式系統會在其他節點緩存元數據。在區塊鏈中的思路也大體一致,需要保證在節點之間緩存的元數據的一致性,或者引入一個類似的主伺服器來保證性能,但這些方案都需面對數據一致性的挑戰。

多個副本的一致性、可用性是 CAP 理論討論的範疇,主要有兩種可用的方案。

第一種是主從同步,首先選出主伺服器,只有主伺服器提供對外服務,主伺服器將元數據的更新信息以日誌的方式存至某個共享的存儲空間,然後從伺服器從共享存儲空間讀取日誌並應用,達到與主伺服器一致的狀態,如果主伺服器被檢測到故障,那麼會重新選出新的主伺服器。

在網絡分割的情況下,有可能出現大家認為原來的主伺服器已經宕機了,就選舉出新的主伺服器,但是原來的主伺服器還在繼續提供服務的 “双主” 現象。為了解決這種問題,需要想辦法把舊的主伺服器隔離,使其不能正常對外提供服務。為了保證元數據的強一致性,在準備進行切換的時候,新的主伺服器必須要在確認元數據完全同步之後,才能繼續對外提供服務。為了達到這個目的,一種方式是當元數據變化時,立即通知所有的緩存伺服器,並鎖定數據,如果系統要完成的任務需要多個碎片裡同時對狀態進行更新,那麼在更新完成之前,訪問將被拒絕。另一種在高度可擴展的 NoSQL 數據庫中經常實現的複製數據之間保持高度一致性的方法是使用讀寫仲裁和版本控制。這種方法避免了鎖定數據,代價是讀取和寫入數據的過程中會帶來額外的複雜度。

第二種方式是通過分佈式一致性協議來達到多個副本件的一致,如 Paxos 和 Raft 協議,協議可以實現所有備份均提供對外服務,並且保證強一致性。

區塊鏈技術下的分片方式#

在區塊鏈網絡中,根據對象的不同,技術可分為狀態分片、交易分片和網絡分片。其中,網絡分片採用較多的技術方案。

區塊鏈的狀態分片是指每個節點只存儲了一部分的區塊鏈狀態信息,需要解決的一致性問題與上述類似。

而交易分片的實現更為簡單。在基於賬戶的區塊鏈系統中,每一筆交易將會有一個發送者的地址,然後系統可以根據發送者的地址分配一個碎片。這確保了兩筆雙花交易將在相同的碎片中得到驗證,因此系統可以很容易地檢測到雙花交易,而不需要進行任何跨碎片的通信。如果節點是確定的,那麼幾乎不存在上述討論的元數據的更新帶來的問題。但是如果交易驗證時涉及跨碎片之間的通信,通常成本很高,將影響網絡的吞吐量和經濟效益。

區塊鏈的網絡分片指將礦工劃分成幾個組,同時驗證交易,提高系統並行處理交易的能力。通常可以通過定期以隨機數生成來決定選取達成共識的節點,將其映射到已經編好號的分片中。但是如果有節點宕機,重新分配節點時,就需要在分片之間形成一致性共識。

值得注意的是,在區塊鏈中採用網絡分片技術,也就是將礦工分成幾個子網絡分別負責驗證該碎片上的交易,需要保證惡意節點的數目足夠小,因此在分配礦工的規則上注意保證隨機性。

分片技術的關鍵在於由於每個片區裡的數據是分開更新的,在設計應用邏輯時,必須確保在平衡效率的前提下,對信息進行成功更新,同時也需要預留出一定的魯棒性,來應對達成最終一致性過程中可能出現的問題。在區塊鏈中應用分片技術,還需要考慮的問題是對各種攻擊如女巫攻擊、DDOS 攻擊、雙花攻擊的防禦,需要在權衡效率的同時,保證每個分片內的總節點數目足夠多,並且誠實的節點占大多數,分片技術對安全性要求極高,同時,區塊鏈系統中的節點數目比傳統數據庫中的可能要多,並且面臨帶寬的限制,需要充分考慮到延遲帶來的不一致性導致的性能和安全性問題,因此很少有落地的相關項目。需要在大規模的網絡中進行長時間的測試驗證,並結合嚴謹的理論方案證明,才能令人信服。

空間證明共識算法#

自 2009 年第一枚比特幣被挖出以來,區塊鏈行業逐漸拓展為一個巨大的全球市場。除 BTC 以外,LTC、ETH、EOS 等各式各樣的區塊鏈項目層出不窮。目前,僅以太坊上的 ERC20 代幣項目,就超過 11 萬個;而發布項目白皮書的公司更是數不勝數。

比特幣實現了一種點對點的電子支付系統,而這一分佈式系統的誕生,有賴於其採取的 PoW(Proof of Work,工作量證明)共識算法。目前,絕大多數具備主鏈的區塊鏈項目,仍採用 PoW 或改良後的 PoW 共識算法,僅有一部分項目採用 PoS(Proof of Stake,權益證明)或 DPoS(Delegated Proof of Stake,股份授權證明)等算法。PoW 為分佈式賬本帶來簡明、有效的共識產生機制,然而也產生了一些問題:在計算哈希函數的過程中,大量能源被浪費。由於 ASIC 等芯片的產生,比特幣也面臨著越來越中心化的挑戰。比特幣的現狀與中本聰最早的設計已經相去甚遠。

而 PoS、DPoS 機制同樣具有中心化的問題,而且投票過程往往較為煩瑣,兩者顯然並非最佳的解決方案。值得一提的是,市面上曾出現一些採用如 “交易即挖礦”“鎖倉即挖礦”“投保即挖礦”“挖礦即挖礦” 等方案的區塊鏈項目。但本質上,這些項目所發行的還僅僅是以太坊上的 ERC20 代幣。由於不具備主鏈,這些項目均不需要共識機制。所謂的挖礦方案,本質上屬於空投方案,是一種激勵手段,與區塊鏈的核心技術無必然關聯。

真正要解決 PoW 所衍生的浪費能源、中心化的問題,開發多樣化的挖礦方案,至少需要解決以下一系列技術問題:

(1)如果不耗費工作量,以什麼作為用戶付出代價的證明?

(2)該種證明如何被校驗?

(3)如何確定挖礦競賽的優勝者?

(4)如何避免主鏈分叉等?

空間證明的原理#

在技術進展的過程中,PoSpace 方案做出了重要的探索。PoSpace 即 Proof of Space空間證明。PoSpace 意在取代比特幣中的 PoW 機制,成為一種新型的共識機制解決方案。這一方案目前已在一些區塊鏈項目上實施落地。它以用戶支付的硬碟空間作為付出代價的證明,通

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。