banner
leaf

leaf

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

密碼學是因,區塊鏈是果

比特幣是基於密碼學構建的去信任數字貨幣。我認為他把密碼學與區塊鏈的關係說得很清楚,

怎麼理解他們之間的這種因果關係呢?可能有的同學會認為是區塊鏈需要有可追溯,不可篡改等特性,所以中本聰才設計了幾種密碼學算法去支撐他的構想。但這是完全錯誤的,屬於顛倒黑白的想法。

你只需要理解兩類基本算法就可以,那就是哈希算法以及非對稱加密算法,而且學習密碼學跟學習其他技術不太一樣,理解密碼學原理需要深厚的數學功底。其實工程師完全可以把密碼學當作黑盒,你不需要太關注其技術原理,而只需要理解它的特性以及應用場景就可以了。

哈希算法 我們先一起看看之前提及比較多的哈希算法,哈希算法又稱散列函數,它可以將任意長度的數據轉換成短的、固定長度的數據指紋

其實哈希算法不是只有一個固定的實現,而是一類算法的統稱,比如常用的有 MD5 跟 SHA-256。要評判一個哈希算法是否足夠優秀,我們有 4 個標準:正向快速、逆向困難、輸入敏感和避免碰撞

正向快速 什麼是正向快速呢?這點很好理解,如果給定信息和算法規則,可以在有限的時間內計算得到信息的哈希結果。你說你設計了一個優秀的哈希算法,結果一次計算過程就花了好幾秒,那只能說你的設計不夠優秀,雖然時間有限,但根本沒辦法在真實場景中使用。為了能給你更直觀的感受,我專門寫了一個程序,測試我們常用到的 MD5 跟 SHA-256 這兩個哈希算法的計算到底有多快。

// 計算結果 //md5 count: 10064932 //sha256 count: 5727246

可以看到,最終得到的結果是非常給力的,在大概 1 秒鐘的時間內,MD5 計算了 1000 萬次,而 SHA-256 算法也計算了 500 萬次。我這裡僅僅是用了一台普通的電腦,如果是在伺服器上跑,相信結果會更震撼。通過這個測試,相信你對正向快速這個標準的解讀應該足夠清晰了。當然單純分析哈希算法的計算速度是沒有意義的,還是要將其帶入到具體的業務場景中,此處只是給你一個直觀的印象。

逆向困難 接下來我們看第二個標準,那就是如果給定哈希結果,在有限的時間內基本不可能逆推出原始信息。也就是說一個優秀的哈希算法是不可能通過密文反推明文的,這也就是不可逆的根源

這是我在電腦的命令行中執行的一條命令,得到了 “極客時間” 的 MD5 哈希值。想像一下,如果我不告訴你 e0aac893629b048e8797800294f55004 是 “極客時間” 的 MD5 哈希結果,你能通過這段字符,反推出它代表的明文是 “極客時間” 嗎?不光你懵,我想計算機看到這問題也會懵,因為計算機只能通過窮舉去猜結果。當然,並不是說哈希算法就是不能夠被破解的。相反,MD5 哈希可以說已經被變相破解了,既然逆向困難,那我提前窮舉常見的數據組合存起來,有破解需求的時候我再回頭查就好了,簡單而又粗暴。

輸入敏感

我們再看另一個標準,就是原始信息即使發生一丁點的變化,重新計算的哈希值與之前比較都應該有很大的不同。這個標準主要是降低原始信息被部分推斷的風險。如果新產生的哈希值與之前的相差不大,計算機就可以利用差異去推斷變化,相比窮舉,困難度當然是降低了,而這卻是不被允許的。還是來看一個例子:

避免碰撞#

你可能就會有疑問,以 MD5 算法為例,任意數據信息經過哈希算法後都可以得到 32 位哈希值,那不會重複嗎,畢竟 32 位哈希值能表現的數據量是比較少的?其實你只說對了一半,32 位在計算機中是用 128 位二進制數表示的值,所以實質上 MD5 哈希能表示的數據有個那麼多,你如果去算一算就會發現,這其實是一個很大的數字。如果你仍然認為不夠保險,那還有更高位數的算法可以選擇,比如 SHA-256 及 SHA512 等。當然,表示的數據量大,並不代表著就不會有兩個不同的數據得到相同的哈希值,這確實在實踐中已經出現過。所以,在設計哈希算法時,應該避免不同的明文信息產生相同的哈希值。

區塊鏈中的哈希 現在我們了解了優秀哈希算法評判的 4 個標準,相信你對哈希算法的特性已經有所認識了。那區塊鏈中是怎樣應用哈希算法的呢?我們接著往下說。因為哈希算法相當於是對信息提取摘要,是數據的指紋,因此經常被用於數據完整性的校驗,而區塊鏈在此基礎上又做了適當的延伸。區塊鏈中用到哈希算法的地方主要是交易哈希和塊哈希,主要功能就是校驗交易及區塊的完整性,以及充當區塊鏈網絡中交易及區塊的唯一標識。說到這裡,你有沒有想到上一講

我留下的第二個討論題?沒錯,在區塊鏈數據落盤的時候,我們就可以使用交易哈希、區塊哈希分別作為交易及區塊的數據主鍵,只要保持了數據與標識對應索引關係,就可以把交易跟區塊存儲在任意數據庫中。

區塊哈希還有另一個作用,區塊屬性中包含了前一個區塊的哈希,從而構建成一條由區塊哈希關聯的數據鏈條,所以我們稱區塊鏈為哈希鏈也不為過。利用哈希算法對輸入的敏感性,作惡者如想篡改區塊鏈數據,必須從被修改處開始依次修改後續的全部區塊,哈希算法的加入增加了作惡者篡改的成本,可以說是哈希算法成就了區塊鏈單節點的不可篡改特性。 非對稱加密算法 講完哈希算法的內容,我們再將目光轉向非對稱加密算法。說到非對稱,肯定有與之對應的對稱加密算法。顧名思義,對稱與非對稱體現在對密鑰的處理上。對稱表示加密和解密都使用同一套密 鑰。而非對稱加密卻不一樣,分為公鑰跟私鑰,如果使用公鑰加密,只有用對應的私鑰才能解密,反之亦然。那既然有了對稱加密算法,為什麼還要發明非對稱加密算法呢?這裡我用一個快遞的例子幫你解惑。你在外地打拼,給遠在老家的父母寄了一份珍貴的禮物,用一個精美的盒子做包裝。為了禮物不被破壞,其實最好的方法就是你親自送回家,但這不現實,你只好發快遞。

而父母收到你的禮物非常高興,他們立馬也快遞給你一些老家的土特產,用的正是你送禮物的那個盒子。就這樣來來回回好幾輪,原來精美的盒子已經變得殘破不堪,甚至可以透過盒子看到內部的物品,也很容易丟失。這個例子讓我們形象地理解了對稱加密的不足。其中禮物跟土特產就是需要交換的信息,而那個起初精美的盒子就是密鑰。 對稱加密算法要想保證密鑰不被泄露,最好的辦法是面對面協商,而且即便是面對面協商了密鑰,後續也不能多次使用,否則使用次數越多,泄密風險越高,且不能保證中途沒有其他人篡改。

還是用快遞的例子,為了能保證快遞物品不丟失,這次過年回家你給父母買了個快遞保險箱,共兩把鑰匙,父母一把,你留一把。這樣後續再寄快遞時,就可以把物品放在保險箱中,這樣就算用快遞運輸,也不用怕物品被調包了,因為除了你跟父母之外,沒有人可以

再打開保險箱。 這裡的保險箱就相當於公鑰,而鑰匙就相當於私鑰。這個 “保險箱” 方案,其實在密碼學裡就對應著非對稱加密算法的思想。非對稱加密算法的密鑰是一對,分為公鑰跟私鑰。公鑰可以隨便公開,而私鑰需要私密保存,而只要私鑰不被泄露,信息交換過程就是安全的。當然這個例子還與非對稱加密有所差異,真正的私鑰應該只有一份。

非對稱加密算法雖然解決了對稱加密算法使用過程中遇到的問題,但其加解密的效率是遠不如對稱加密算法的。因此,在使用過程中常採用混用的方式,即明文數據採用對稱加密算法進行加密,然後使用非對稱加密算法加密對稱加密的密鑰和明文數據哈希,對方收到信息後,用匹配成對的另一個密鑰解密數據並核對明文數據哈希,混用的方式可很好地平衡安全性與時效性。 非對稱加密算法跟哈希算法一樣,也是一類算法的統稱。現用的比較多的是 RSA 跟 ECC 橢圓曲線加密算法,RSA 多用於互聯網信息傳輸中,比如我們上網用到的 https 通信,而 在區塊鏈中基本都使用的是 ECC 類的變種,比如 ECDSA 跟 ED25519 等。相較於 RSA,ECC 密鑰較短,在擁有更高安全性的同時還有更好的性能。

區塊鏈中的非對稱加密#

了解了算法的特性,我們再回過頭來看區塊鏈中是如何使用非對稱加密算法的。你如果之前了解過區塊鏈,就會發現在區塊鏈中,好像並沒有哪個地方使用非對稱加密對數據進行 加解密。的確,區塊鏈中對非對稱加密算法的使用並不是直接被用作數據加密,而是利用其具備身份確權的能力,也就是數字簽名。什麼是數字簽名?顧名思義,其實跟我們平常手寫簽名的概念及作用是相似的,都是用於證明你的身份,且對所簽署的文件或者數據進行確認授權。

在諸如比特幣以太坊等公有鏈中都有類似於地址、賬戶的概念,我們可以認為這就是區塊鏈中的身份證,這個身份證不同於現實中需要政府統一頒發,而是分散的基於非對稱加密 算法的公鑰的一種形變表示。這裡可以引申一個小知識點,你通過數字貨幣手機錢包創建了一個賬戶,此時區塊鏈網絡並不知道,只有當你接收到一筆轉賬之後,網絡中才有你這個賬戶的信息。那如何確認這個賬戶是屬於你的呢?道理非常簡單,只要你能證明你可以花費賬戶中的餘額就可以了,而這證明的關鍵就在於數字簽名。既然賬戶是公鑰的形變表示,那麼必定存在與之對應的私鑰,且只存在你的手中。

image

可以將交易結構分成兩部分,左邊部分是交易的基本屬性,而右邊只包括簽名。如果我們不看簽名,其實左邊部分已經能基本表示交易的內容了,只是缺少了證明。因此我們將左邊部分看作一個整體,然後對它進行哈希計算得到交易摘要,接著用你手中的私鑰對交易摘要進行加密,而加密的結果就是交易的簽名。而如果要驗證交易,只需要按照相反的流程進行就可以了,將交易簽名使用對應的公鑰解 密得到簽名中包含交易摘要,同時將明文的交易內容利用哈希算法再計算交易摘要,然後將簽名中的交易摘要與自主計算的交易摘要進行對比,如果匹配,則表示交易驗證成功

image

數字簽名的本質也是一種加密,只不過針對的是數據的哈希摘要,而不是數據本身。這麼做有什麼好處呢?主要有兩點,一方面證明了確實是你自己構建的這筆交易,因為其他人 沒有你的私鑰,無法假冒。另一方面,因為數字簽名是有哈希算法參與的,因此也繼承了哈希算法的特性,能保障交易的完整性,確保了交易不會被他人無故篡改。

總結#

這一講我從哈希算法跟非對稱加密算法為出發點,為你淺析了區塊鏈中常用到的密碼學算法。哈希算法被用來抽象交易哈希跟區塊哈希,除了用於保證數據完整性外,還能用來構建由 區塊哈希關聯的哈希鏈條,增加作惡篡改的成本。

區塊鏈中使用非對稱加密算法並不是直接用於數據加密,而是主要用作交易簽名,數字簽名集成了哈希算法與非對稱加密算法的雙重特性,在保證交易完整性的同時,還能證明交易發起者的身份。 區塊鏈中並不是只用到了哈希跟非對稱加密,幾乎所有的區塊鏈都在此基礎上做了些許的衍生,比如追求隱私交易的 ZCash 就引入了密碼學中的零知識證明,專注於隱私計算的區 块鏈就引入了同態加密等等。密碼學的知識浩如煙海,現在區塊鏈用到的只是冰山一角。通過今天的學習我們可以發現,正因為有了密碼學的加持,區塊鏈就好像站在了巨人的肩膀上

對於密碼學整體發展的歷史,你可以參考密碼學初探。

  • 這一講重點講解了區塊鏈中最常見、最基礎的密碼學算法,想了解更多關於區塊鏈中涉及的密碼學的門類,可以閱讀 V 神列的知識清單。

  • 如果你看得還不過癮,想了解文中介紹的密碼學算法原理,可以參考這幾篇文章:哈希算法原理,RSA 加密算法原理以及ECC 橢圓曲線加密算法介紹。

主要就是理解私鑰代表了所有權,證明身份的基石。公鑰是給公開給別人(張三、李四,王五都知道)的,拿公鑰對數據哈希值做加密運算,無法提現是張三、李四,還是王五操作的。就沒有 “簽名” 的意義了

image

網絡模型#

為什麼區塊鏈會採用點對點網絡模型作為節點間數據傳遞的紐帶呢?要想真正搞懂這種思路,我們做個對比。 不管是點外賣還是買車票,在日常工作生活中,我們接觸的大部分網絡應用架構都是客戶端 - 伺服器模型。這個模型的運行機制是這樣的:各個客戶端向伺服器發送請求,而伺服器負責接收並處理請求,最終給客戶端返回處理結果。為了讓你直觀理解,我還畫了一張 示意圖

image

結合示意圖,我們可以清晰認識到這是一個中心化的網絡架構,其服務能力完全取決於中心的伺服器,如果中心伺服器因意外導致宕機,那整個服務就癱瘓了。整個應用的可用性僅依賴於伺服器的活性,與客戶端無關。

而點對點網絡則完全不同,它是一種分佈式的網絡架構,並不存在單一的中心伺服器網絡中每個節點的權利與義務都是一致的。每個節點都擁有向網絡中其他節點發起請求的權利,同時也有著必須響應其他節點請求的義務。

節點權利與義務的對等意味著什麼呢?這代表點對點網絡的可用性是隨著節點數的增多而增強的,網絡的運行並不依賴任何單一節點,節點可以任意地加入或者退出。即使一些節點宕機或者遭受攻擊,只要還有正常運行的節點,整個系統依舊可以照常運作。

怎麼形象地理解二者的區別呢?我們拿銀行系統來舉例,如果按現有的中心化架構,有一天銀行網點大面積停擺,不對外提供服務。原因可能很簡單,排除網絡的干擾,大概率是 銀行的總機房出現了問題,這就是中心化架構可能出現的單點故障。

而區塊鏈架構則不同,一家銀行就相當於一個區塊鏈網絡,每一個銀行網點代表一個區塊鏈節點,一個節點無法對外提供服務,我們可以隨時切換另一個節點,一兩個節點的問題不影響整個網絡。當然,這個例子描述得非常極端粗暴,只是為了幫你理解,真正的銀行系統架構不會這麼脆弱。

網絡拓撲#

從某種角度來說,不管是先有雞還是先有蛋,點對點網絡與區塊鏈都是相互成就的 CP 組合。

前面課程中,我說過區塊鏈的去中心化是相對去中心化,而絕對去中心化只是一個理想狀態,如果對應到點對點網絡,這其實是由點對點網絡的拓撲結構決定的。怎麼理解這種對 應關係呢? 只有一個節點的網絡實質就是中心化網絡,此時區塊鏈表現為中心化。而如果網絡中所有的節點兩兩之間建立連接,此時點對點網絡可以看作是完美對稱的,區塊鏈也就表現出絕對去中心化特性。但如果我們不那麼極端,允許點對點網絡在這兩個極端理論值間左右搖擺,就會發現區塊鏈網絡會一直處於中心化與絕對去中心化之間的動態平衡之中,而對去中心化程度的考量 主要依托於對點對點網絡拓撲結構的選擇。

這麼說你可能還是有點懵,別擔心,我們來一起理一理這中間的邏輯。相比中心化網絡,點對點網絡雖然優勢明顯,但它的不足也同樣明顯,那就是新的節點加入網絡之前,必須 知道至少一個已存在於網絡裡的節點,不然這個新節點跟整個網絡就是脫鉤的。這點非常容易理解:在中心化網絡中,客戶端要想讓伺服器響應自己的請求,必須先將自己的請求發送到伺服器,而這就要求客戶端知道伺服器在哪,就像你上網必須要知道網址一樣。而點對點網絡則不一樣,所有節點互為伺服器客戶端,因此節點必須知道其他節點的地址,才能加入網絡。對節點發現機制處理的不同,也就形成了不同的網絡拓撲結構,下面我分別為你分析一下。

第一種結構是引入了一個中心索引節點,用來保存其他所有節點的接入信息。新節點的加入首先將自身信息傳入中心節點,從而換取已在網絡中其他節點的連接信息,隨後與其他節點組成點對點網絡,這種結構與我們使用搜索引擎進行信息檢索是類似的,但存在單點故障的可能性,一旦中心索引節點宕機,新節點將無法加入網絡。

image

第二種結構你可以理解成一種無為而治的結構。新節點選擇連接一個已存在網絡中的節點,被連接的節點可以告知新節點它連接的其他節點信息,這樣新節點可以隨機選擇再連接到其他節點,這樣就形成了一張沒有規律的網絡拓撲結構。

而第三種結構則融合了前兩種結構的特點,整個網絡由多個種子節點形成主幹網絡,而其他普通節點則連接到某個種子節點,這樣就形成了整體分散局部集中的混合結構。

最後一種網絡拓撲是結構化的,它跟上面講的三種拓撲不同,節點間的連接遵循某種算法,組成了一種有序的結構化網絡,比如樹形網絡結構。大多數結構化網絡的算法都是基於分佈式哈希表算法實現的,這是一種用於在大量節點的系統中快速定位目標節點的索引算法,具體原理你可以參考擴展閱讀。

區塊鏈網絡拓撲#

了解了這 4 種網絡拓撲結構之間的差異,那區塊鏈中到底是如何組織節點拓撲的呢?縱觀前面說的比特幣跟以太坊網絡,你會發現它們的選擇是有差異的。比特幣採用的是類似於混合型的網絡拓撲結構,一個新節點的加入需要給節點指定幾個已在比特幣網絡中的相鄰節點信息,可以是普通節點,也可以是種子節點。當建立節點間連接以後,新節點將自身信息發送給相鄰節點,相鄰節點再將新節點的信息依次轉發給它們各自的相鄰節點,從而保證了新節點信息在網絡中被廣泛傳播。新節點也可以從相鄰節點獲取該節點的相鄰節點信息,從而選擇性地連接更多節點,增強節點自身與整個網絡連接的穩定性。

比特幣中的點對點網絡相對簡單,也更容易理解,但信息傳遞的效率不高,並且對網絡帶寬的負載要求較高,這點你看完後面交易的擴散過程就能明白了。而以太坊的選擇則不太一樣,使用的是結構化網絡拓撲,打造這種結構,離不開基於分佈式哈希表思想的Kademlia 算法(後面簡稱 Kad 算法)。雖然 Kad 算法的原理比較複雜,但如果你能先理解它幹了什麼事,就會大大降低學習難度。 簡單來講,Kad 算法定義了一種節點間距離計算的方法,用於新節點的發現。那具體怎麼計算呢?我們接著往下看。

image

節點 A 首先從自身存儲節點信息的 K 桶中找出 2 個與自己距離最近的節點,之後請求這 2 個節點,要求他們從各自的 K 桶中分別找出 2 個與節點 A 更近的節點。那么節點 A 最多可以得到 2 × 2 個新節點信息,隨後再請求這 2×2 個新節點中距離節點 A 最近的 2 個節點,讓它們再分別返回與節點 A 距離更近的 2 個節點,整個過程持續迭代,直到沒有新節 點被發現。

通過這種辦法,節點 A 只與自己距離最近的節點連接,這保持了以太坊網絡中節點的有序。但你需要注意,節點間的距離是邏輯距離,而並非是物理距離,也就是說即便兩個以 太坊節點運行在同一台電腦上,它們之間的邏輯距離也可能無限遠,這是算法本身導致的,就比如圖中的節點 C 明顯離節點 A 更近,但這只是表象,邏輯距離還是 D/E 更近。 通過對比特幣以太坊對不同網絡拓撲的選擇,我們可以發現,區塊鏈中選擇網絡結構是沒有定式的,沒有唯一標準。如果你熟悉聯盟鏈技術體系,就會發現聯盟鏈對點對點網絡的重視程度不如公鏈,主要有 兩方面原因,一方面聯盟鏈的節點是確定的,很少出現隨時加入,隨時退出的需求;另一方面聯盟鏈節點個數比較少,並不需要節點發現機制引導新節點的加入。交易的擴散 有了前面基礎知識的鋪墊,我們終於可以將交易通過網絡流動起來了,接下來我們通過交易的擴散進一步加深對網絡的理解。之前我們講過,區塊鏈網絡不生產交易,而只是交易的搬運工。從區塊鏈網絡示意圖中可以看到,在區塊鏈網絡外圍有大量的手機、電腦、汽車等外聯設備,這些設備與任意的區塊鏈節點連接,就能從該節點獲取與自身相關的信息,諸如餘額、歷史交易等等。 同時,外聯設備所構建的交易會隨之發送到與之相連的節點,所以它們是區塊鏈網絡的交易源頭

image

傳播過程是相對容易的,但是我們應該注意到不同網絡拓撲對重複接收相同交易處理上的差別。以太坊網絡的節點只與自己最近距離的相鄰節點連接,交易的擴散並不存在回路的可能性,它的擴散路徑更像是一種單向的持續向外廣播,就像水永遠只向低處流一樣,交易會逐漸遠離最初的節點,交易擴散效率較高。而比特幣的交易擴散對此的處理則有所不同。它的網絡拓撲是隨機的,交易擴散的時候是擴散至與之連接的節點,但擴散前並不知道對方是否已經接收過相同的交易,因此網絡擴散的效率是較低的。隨著網絡節點規模的擴大,節點間連接關係更為無序,大量的網絡帶寬浪費在對交易的重複擴散中。節點接收到重複交易並不會再次理會,而是直接丟棄,白白做了無用功。你看,比特幣的網絡拓撲雖然結構簡單,但也為此付出了代價。對區塊的擴散也遵循交易擴散的通用邏輯,只不過此時並不需要外聯設備的參與,而是由

首先滿足共識條件的礦工節點發出,你可以先留下個印象,等下一講我們學共識算法的時候,我再詳細講解。

總結#

點對點網絡是區塊鏈中最常用的網絡交互模型,相比於中心架構的客戶端伺服器模型,每個節點具有對等的權利與義務,與區塊鏈的去中心化特性相得益彰。但點對點網絡節點發現機制比中心化網絡複雜得多,對此處理的不同衍生出中心、隨機、混合及結構化等不同的網絡拓撲結構。不同區塊鏈有不同的選擇,影響了區塊鏈網絡對交易及區塊擴散處理上的不同。其實,區塊鏈中是先有去中心化思想還是先有點對點網絡的啟蒙,這個問題其實不是最重要的。討論這個問題,是因為研究二者的關係可以讓你更深刻地理解區塊鏈網絡。而在最後,我也想給出我的觀點傾向,我認為是點對點網絡的思想啟發了中本聰,讓他想到利用其無絕對中心的特性去構建去除第三方中介的數字貨幣系統。

智能合約基礎#

你知道嗎,智能合約並不是區塊鏈的專屬,其實早在上世紀 90 年代,就有人提出了 “智能合約” 的概念,基本可以概括如下。以數字形式制定的一系列承諾,包括各參與方履行這些承諾的協議。

a set of promises, specified in digital form, including protocols within which theparties perform on these promises

只不過因為當時缺少有效的載體,智能合約未能進一步發展。直到以太坊出現,才將區塊鏈技術與智能合約相結合,最終呈現在我們面前。怎麼理解智能合約的概念呢?我們不妨從 “合約” 開始聯想,利用我們原先熟悉的知識做 對比。想想平時工作生活中的合同和協議,我們就能很清晰地認識到,智能合約跟它們的概念其實是相通的,只不過智能合約是數字形式的。當然,智能合約跟傳統合約還是有差異的。二者約束力的產生機理並不相同,傳統意義上的合同協議的約束力來自於權威機構背書,一旦合同簽訂的多方未履行協議規定的義務,其他參與方是無權對違約方進行私自的追責及懲罰的,必須通過法院等司法渠道進行合理合法的訴求。

但智能合約則有所不同,其約束力的一部分就來自合約本身,智能合約實質就是一段計算機程序代碼,因此具有極強的邏輯緊密性,說一不二,代碼本身就描述了各參與方的權利及義務,以及各種條件下的處理邏輯流程,可以說代碼即法律。那你可能就有問題了,既然代碼即法律,那為什麼我們平時所接觸到到的各類軟件應用並不 能叫做智能合約呢?這其實就要說到智能合約約束力的另一部分了,那就是為智能合約提供運行環境的區塊鏈網絡。那區塊鏈網絡與軟件應用提供的運行環境有什麼不一樣呢? 結合前面幾節課對區塊鏈性質及基礎技術的講解,你會發現差異就在於區塊鏈的特性。傳統軟件應用是由單一的企業機構或個人提供的個性化服務,軟件的最終解釋權在應用開發者,因此在特殊場景下,很難令用戶產生信任感。另外你使用了應用,其實這相當於你與開發者簽訂了傳統意義的合同協議,約束力還是來自權威機構。而區塊鏈網絡是由網絡的所有參與方共同維護的,由全體成員共同遵守的區塊鏈協議為智能合約提供信任約束力。

智能合約的執行依靠的是交易的鏈外發起,一旦上鏈,其運行可以排除任何第三方的干擾。另外,即便是對合約執行的流程有異議,也能利用可追溯特性對智能合約的執行過程 進行追蹤。

正是因為約束力的不同,智能合約存在部分落地問題。因為智能合約缺乏權威法律的監管,只受制於代碼約束及區塊鏈信任約束。這樣就使得在當下這樣的一個時間點,普通大眾還是缺乏一些對智能合約的信任感,尤其是在涉及重要的合同協定的時候,還是普遍信任權威機構。

當然,這只是新事物在推向市場時都要經歷的過渡階段。隨著區塊鏈及智能合約的不斷推廣,民眾對區塊鏈的信任感會加深,智能合約的普及也只是時間問題。為什麼我會這麼樂觀呢?這是因為以太坊不僅是將智能合約引入到區塊鏈中,為智能合約落地提供運行環境;更是為智能合約的推廣及普及提供了通道,而這也就是以太坊改進提 案 EIP。

以太坊不僅提供技術能力支撐,還提供了可重用模版。入門難度降低了,對使用體驗的提升影響深遠。因為全世界的用戶都可以提交各類以太坊改進意見稿,如果社區接收了意,隨後的以太坊新版本就會實現這些方案。這相當於在以太坊社區運營者跟用戶間搭建了直通的交流通道。少數人的思路畢竟有限,但匯聚群眾的智慧,平台的發展潛力就是無窮的。

而在這些改進方案中,有很大一部分方案是對智能合約標準的提議。相較於區塊鏈對智能合約的支持,反而我更看重智能合約標準。如果你懂一些面向對象程序編程,那麼你一定會非常喜歡接口 Interface,因為它可以約束及規範具有相關性的一類行為。而智能合約標準也是類似的,可以說通過通用行為標準去引導智能合約的發展是一種捷徑,價值網絡的落地離不開智能合約標準的制訂。純粹的理論描述,可能無法帶給你特別深的感受,接下來我就用當前正火的一個智能合約標準 EIP-721 為例(721 就是提案編號,NFT 是提案的名稱),為你說明智能合約標準對價值網絡的影響。

這個標準的由來,全稱是非同質化代幣,簡稱 NFT。既然有非同質化代幣,那肯定有同質化代幣。所謂同質化代幣,指的就是互相可以替代,且可以進行拆分的貨幣。就比如人民幣,你手中的 100 塊跟我手裡的 100 塊的購買力並沒有什麼區別,而且我們還可以將 100 塊錢分成 2 個 50 或者 10 個 10 塊。而非同質化代幣則不一樣,每一個 NFT 都是獨一無二,且不可拆分的。你還記得前面我們 用到的房產抵押例子嗎,你會發現 NFT 似乎為此提供了解決思路。房產信息具有唯一性且不可複製、拆分,如果能夠通過 NFT 標記房產的所有權,那麼就實現了房產在虛擬世界的錨定,而一旦錨定關係成立,我們就可以在區塊鏈網絡中實現對房產的轉移,這個過程會像轉賬一樣方便。而且,NFT 的應用場景並不止於此,我們可以通過 NFT 完成多類資產的綁定,一張照片,一幅畫,一首歌,一段文字,一張門票等等,任何具有資產屬性的事物都可以將其登記成 NFT,例如 Twitter 的 CEO 就想通過 NFT 將其發布的第一條 Twitter 拍賣。

有了 NFT,我們才能夠有一種手段將虛擬與現實的價值錨定。當然這並不是說 NFT 是實現價值網絡的唯一手段,價值網絡的搭建是離不開所有智能合約標準的支持。但是,標準 的制定並不是一蹴而就的,首先市場上必定要先出現一款爆款應用,因其創新的模式引得大家爭相模仿,進一步粗暴的推動此類應用達到一個頂峰,隨之而來的是泡沫的破滅。而當市場情緒變得冷靜之後,有一些人會靜下心來思考泡沫背後的深層邏輯,從而抽象出應用背後蘊含的共性行為模式,進而將其總結成 EIP 提案,最終為未來類似應用場景提

供標準化解決方案。#

智能合約標準制定的不易,更凸顯了價值網絡的可貴。你也許已經迫不及待想要穿越到未來,領略價值網絡時代到底多麼先進。但別急,雖然現階段價值網絡還並不成熟,但其雛形已經初現端倪,那就是元宇宙,我們可以通過它窺探價值網絡。

元宇宙與價值網絡

如果你跟我一樣曾經都是愛看書的叛逆少年,那你一定看過玄幻小說。上初中的時候,我非常痴迷於網遊系列的爽文,被其中描繪的沉浸式遊戲座艙深深吸引,真心希望有生之年 能夠體驗一番。我一度以為這只是美好的幻想,但沒想到,元宇宙可能會將這一切變成現實我第一次聽說元宇宙這個詞,還以為是哪個中二少年起的名字。但了解以後才知道,其實是科幻小說《雪崩》中描繪的一個稱為元宇宙(Metaverse)的多人在線虛擬世界。 這一下子激起了我的興趣,元宇宙代表的是一個沉浸式的虛擬世界,玩家能在其中進行文化、社交、娛樂等活動。相較於傳統遊戲,元宇宙擁有可靠的經濟系統、虛擬身份與資 產、更強社交性、沉浸式體驗、開放內容創作等特點。可以說,在元宇宙中,除了物質是虛擬的,其他方面與現實世界無異。與區塊鏈技術一樣,元宇宙並不是單一技術構建的,而是由區塊鏈、遊戲、網絡和顯示四

大技術融合而成的虛擬世界。

區塊鏈技術為元宇宙提供了去中心化的資產交易平台,NFT/DeFi 等智能合約為玩家的虛擬資產提供承載的媒介;遊戲為元宇宙提供交互內容;5G 網絡為數據的傳輸提供可靠保障;

可以發現,如果拋開區塊鏈技術不談,元宇宙所代表的僅僅是一個比傳統更加逼真的沉浸式遊戲環境,還不能看作一個虛擬世界。但如果有了區塊鏈技術的加持,就能夠保障玩家 的虛擬資產及身份的安全,從而在這個世界中實現公開透明的資產交易,實現價值的轉移。這樣看來,區塊鏈才是元宇宙能夠成為虛擬世界的關鍵所在。

我們對元宇宙的痴迷,絕不僅僅是因為它為下一階段的遊戲行業指引了方向,更是因為元宇宙給現實世界的價值網絡提供可借鑒的思路。 探索元宇宙,其實就是在摸索價值網絡。可以這樣說,如同智能合約標準制定過程一樣,現階段的元宇宙就是我們期待的爆款應用,隨著其不斷發展,泡沫肯定隨之而來,而冷靜過後的抽象思考,終會為價值網絡的搭建提供標準化的解決方案。

總結#

沒有區塊鏈技術,智能合約仍舊只是個概念。而沒有智能合約加持的區塊鏈,在應用上就無法大展身手。為區塊鏈 “引薦” 智能合約的正是以太坊,而且以太坊不但是智能合約的伯樂,更為智能合約的推廣提供了標準化思路,可以說智能合約標準化是價值網絡真正落地的前提。NFT 為現實資產與虛擬價值的錨定提供可行的解決方案,實現了價值網絡落地中關鍵的一步。現階段,雖然離價值網絡還很遙遠,但我們卻可以通過元宇宙的發展進程去窺探價值網絡落地的思路。

區塊鏈是由區塊哈#

希前後關聯形成的鏈式結構,主要目的就是保持數據的持續完整性,讓區塊鏈在保持不可篡改特性的同時獲得可追溯特性。而數據歸檔是將區塊鏈從某歷史區塊開始,將之前的數據清理掉,但隨後的區塊還保持原

有的順序不變,因此數據歸檔的本質是在保持不可篡改的前提下犧牲部分可追溯性。但如果我們能在將區塊歷史數據清理以後,還提供一種方式將被歸檔的區塊再次讀取出來,那數據歸檔其實是一個比較優秀的解決方案。

如果我只是一位比特幣的持有者,我只關心我的餘額以及歷史交易記錄,其他的信息我一概不關心。因此我並不需要因為這一小小的需求去同步 350G 的存量數據,這些數據對我 來說並沒有什麼意義。但對於某些大型的節點來說,它就可以同步歷史數據,並以此數據作為生產資料,對外提供相關服務,比如挖礦的礦工節點以及區塊鏈瀏覽器背後的節點。公鏈普遍採取的就是這 種節點角色分類的方案。

image

比特幣網絡現在有大概 10000 個全節點,由它們維護完整的區塊鏈數據,而持幣者只需要在手機上運行一個錢包節點就可以進行交易。可以發現,雖然節點角色區分是緩解存儲冗 余的一種有效手段,但這是以犧牲去中心化特性作為前提的,從某種程度來說,這也是一種妥協。

解讀了兩種不同的存儲冗余的解決方案,可以發現我們無法從根源上解決存儲冗余的問題,只有通過不同的技術手段緩解數據的增長。聯盟鏈以犧牲區塊鏈可追溯性作為突破 口,而公鏈以犧牲去中心化為前提。另外,其實我們還可以有另外一種辦法解決存儲冗余,那就是減少數據量,減緩數據增長的趨勢。比如在區塊鏈上存儲的是原始數據的哈希,而不是數據本身。當然,這只是一種業務層面的解決方案,并不是一個技術維度上的辦法

量子計算威脅

說完關於存儲冗余的問題,我們再看看另一個大家津津樂道的問題,那就是量子計算對區塊鏈的威脅。我們普遍覺得,量子計算機一旦成熟,以比特幣為首的區塊鏈系統就會面臨 崩潰,因為量子計算機的算力與經典計算機相比,不可同日而語。但事實真的是這樣嗎?為了更好地幫你理解這個問題,我覺得有必要先為你科普一下什麼叫量子計算。當然,我無法為你去解釋疊加態 / 量子糾纏等複雜特性,因為太高深了,所以我只能通過一個從《科學聲音公眾號》借鑒過來的例子幫助你理解。想像一下,如果讓你使用 1 只手,你可以同時表示出幾個數字呢?毫無疑問,你只可能 同時表示出 1-10 這 10 個數字中的一個,而這也正是我們使用經典計算機存儲數據的基本規則,同一時間一個比特位只能存儲一個二進制數,要麼是 0,要麼是 1。而如果讓你將你的手揣入口袋,請問如果讓你將手從口袋裡拿出來,那麼你這只手有可能表達出多少數字呢?答案肯定是 10 種可能,而且在你沒將手拿出來前,數字是不確定的。例子說完了,從這個例子就可以看出經典計算機與量子計算機存儲數據的差別,一個是存儲具體的值,而另一個是存儲值的概率。

什麼是存儲值的概率呢?其實就是把值的所有可能性疊加在一起存儲。比如 5 比特位的經典計算機,同時只能表達一個數字,而同樣是 5 比特位的量子計算機則可以同時表示個數字,二者有著 32 倍性能的差距,而且存儲的效率也會隨著比特位的增多而成倍增長。而這還僅僅是量子計算機的存儲能力,只有強大的存儲能力還不足以體現出量子計算機對經典計算機的碾壓效應,更重要的是量子計算機的並行計算能力。怎麼形容這種並行計算的可怕呢?我還是用例子說明。假設現在你面前有 64 × 64 根水管分成兩列,其中只有一組水管可以聯通,那麼請問需 要多少次嘗試,我們才可以找到那唯一一組可以聯通的水管呢?如果按照經典計算機的思路,我們只有一組一組嘗試,左側列的第一根水管與右側列的第一根水管聯通,如果不行,保持左側列的第一根水管不變,將右側列水管換成第二個。這樣依次比較下去,直到找到可以聯通的兩根水管。極端情況下,我們需要嘗試 64 × 64 次才可以找到。而量子計算機則大不一樣,它可以同時表示 64 根水管,因此一次嘗試就可以找到那唯一匹配的結果。通過以上對量子計算機在存儲及計算兩方面的解讀,你是不是也對量子計算機時代的區塊鏈產生了某種擔心呢?不過要我說,這些擔心僅僅是杞人憂天,你相信嗎?這不僅是因為量子計算機還僅存在實驗室環境中,離真正的商業化還很遠,或許我們這一代人都不一定 能夠趕上。另一方面,量子計算機在發展,區塊鏈難道就會原地踏步嗎?這幾乎是不可能的,現階段,我們主要擔心量子計算機可以瞬間把以比特幣為首的、使用 PoW 共識算法的區塊鏈 的獎勵都挖完,從而讓其他礦工無幣可挖;或者使用量子計算機破解比特幣的公私鑰,盜取其他用戶的比特幣。

你可以停下來稍加思考,剛才說的擔心真的有道理嗎?其實在我看來也是多餘的。先不說現階段的量子計算機,它能否完成哈希計算或者破解非對稱加密算法,而且也這樣推理忽 略了區塊鏈協議的作用。我們以比特幣為例分析一下,你就懂了。

比特幣協議中就有這樣的規定:不管全網絡的算力如何變化,區塊的出塊速度應保持在平均 10 分鐘左右,如果出塊間隔較短,則會加大挖礦難度,如果出塊間隔較長,則會降低難度。而如果量子計算機加入挖礦,出塊間隔勢必變短,因此挖礦的難度會增加。即便增加的難度不足以難倒量子計算機,也不過是後續所有的區塊獎勵都由量子計算機獲得,瞬間 將比特幣挖光的情況並不可能出現。

再者,為什麼比特幣不能通過硬分叉的方式將現階段的密碼算法換成與量子計算機匹配的抗量子密碼呢?量子計算在發展,區塊鏈技術也不會原地踏步。我相信,車到山前必有 路,終歸會有解決之道。

智能合約安全#

最後,我想特別強調的一點是智能合約安全方面的遺憾相比前面兩個問題,或多或少都是因為技術本身或者其他威脅造成的,而智能合約安全完全是人的問題。

智能合約是軟件工程師基於以太坊等區塊鏈平台自主編寫的程序代碼。而我們都清楚,天底下幾乎不存在沒有 BUG 的軟件系統,智能合約當然也不例外。可以說幾乎每天都存在因 智能合約編寫不規範而造成的攻擊事件,不過是或大或小的差別罷了。就比如前面課程中提到的直接造成以太坊分裂的 The Dao 合約攻擊事件,我們在這裡可以列出該合約中有漏洞的代碼,其實邏輯很簡單。

  • function withdrawBalance() {

  • amountToWithdraw = userBalances[msg.sender];

  • if (!(msg.sender.call.value(amountToWithdraw)())) { throw; }

  • userBalances[msg.sender] = 0;

  • }

結合代碼我來給你做個解讀,這裡要表達的意思是,如果用戶需要提款,先給用戶打款再將用戶的餘額清空。然而打款這一步驟會遞歸調用該方法,因此邏輯一直卡在打款那一步,而用戶的餘額一直沒有被清空,悲劇就此發生。而其實解決方案也很簡單,將兩步動作調換順序即可。

image

所以,後續如果你有機會編寫智能合約,就需要時刻謹記要搞懂你寫的每一行代碼,否則有漏洞的智能合約對黑客來說就是一份誠意滿滿的饋贈。總結這一講我們通過三個例子,說明了區塊鏈技術雖然已經發展了十多年,仍然存在不成熟的地方。但問題的出現也僅代表著當前所處的困境,並不是無法改變,技術總是在不斷的迭代向 前,每一次的技術更新其實都是服務於實際問題的破解,當前的遺憾並不代表著後續無法美好。

目前的區塊鏈行業,個人認為市場在關注以下幾個方向

  • 1. 更強大的性能:比特幣轉賬成本越來越高,本質上是數據庫的性能越來越差。

  • 1. 真正解決更多實際問題:目前大家對區塊鏈認知僅限於比特幣,還沒有另一個現象級的應用。

  • 1. 更加易用:目前使用區塊鏈應用是有學習成本的,小白根本無法使用

區塊鏈 + 電商#

通過前面的解讀,我們已經對行業鏈這個概念建立了初步認識。接下來,我會從區塊鏈 + 電商這個角度,設想一下行業鏈到底要如何運作。開始具體內容前,我需要先給你打一剂 预防针,接下來的內容純粹是我自己的腦洞大開,而且在未來,也不太可能會出現去中心化電商行業鏈,畢竟牽扯面太廣。之所以還是要講,是因為區塊鏈的發展,或者說區塊鏈的推廣不能僅靠墨守成規,應該勇於去突破思維定式。希望你也一樣,不要被現實束縛。

電商行業鏈和傳統電商最主要的區別是什麼呢?用一句話概括,就是利用智能合約的標準化思路,規範電商行業流程。具體怎麼理解呢?我們可以將電商行業中的流程進行抽象,形成智能合約標準,每個標準可以有不同的實現,最終呈現的效果就是,電商行業的參與者可以任意組裝跟自己角色相關流程的不同智能合約實現。 舉個簡單的例子,用戶可以採用阿里的商品聚合服務進行商品的搜索並下單,使用微信支付進行付款,指定京東物流進行配送。聽到這裡,你是不是有些向往呢?為了給你更直觀的感受,我以書籍這類商品為例帶你展望下電商行業鏈的設計思路。現階段,在電商領域,區塊鏈應用做得最成功的案例無疑是商品追溯平台。利用區塊鏈技術的不可篡改及可追溯特性,可以實現對單個特定商品自原材料到用戶手中,整個生命周期全流程的追溯。我們可以基於商品追溯應用,順著追溯的思路,分析一下行業鏈的特點。

image

而這其中描述的書籍印刷的過程,我們就可以抽象出商品生產智能合約,如果你還記得智能合約章節中的NFT,就會發現其實已經有了實現路徑。商品的生產商在行業鏈的流程中,每生產一個商品,就將該商品對應的資產信息(包括但不限於商品基礎信息,比如資產編碼、出廠價格、分類等等)進行上鏈,之後商品就可以由此進入市場進行流通。這是行業鏈和現有商品生產模式最基礎的差異,現有商品生產基於流水線進行批次化生產,比如批量生產一萬冊書,每冊書的商品編碼可能都是一個。但在行業鏈上流轉的不是商品類別,而是一個個獨立的唯一商品,可以做到一物一码。 那這樣有什麼好處呢?行業鏈是價值網絡的前置階段,如果其上流轉的也是資產,也便於後續價值網絡的普及。所以簡單來說,行業鏈是特定行業的價值網絡,而價值網絡是所有行業鏈的集合。

渠道分發 出版社把書籍印刷出來以後,就可以根據不同的電商渠道分發不同數量的書籍。在行業鏈中,這一過程其實並不是必須的,這是為什麼呢?通過前對行業鏈的解讀可以發現,行業鏈其實是在弱化企業的存在感,也就是在淡化渠道的概念。渠道主要是為商品生產商與用戶間建立買賣的平台,而區塊鏈去中心化特性恰恰是在抑制中間商。

而在這個階段,我們可以抽象出商品分發智能合約,可以簡單的理解為批發。在鏈下,是將商品從生產商轉移到渠道商倉庫,而鏈上是將商品的所有權從生產商轉移到渠道商。但要注意,這裡要做到鏈下商品的倉儲周轉與鏈上所有權的協同轉移,什麼意思呢?行業鏈中的每件商品都是具備資產屬性的,並不能簡單以數量進行商品的調撥,而是鏈上的資產與鏈下的商品要匹配,否則就有串貨的風險。

在出版商將書籍資產信息上鏈以後,在行業鏈中的其實就有了該書籍的信息。不過對用戶來說,在商品種類繁多的行業鏈中,搜尋書籍無疑是大海撈針,因此就有必要抽象出商品聚合搜索智能合約標準,方便用戶瀏覽、搜索商品。此時平台的作用,就是基於聚合搜索合約,將行業鏈中的商品個性化地呈現給用戶。而用戶,也可以根據自己的需求定制合約,比如只關 注特定書籍類別。

看到這裡你可能有所疑惑,這似乎跟現在的電商平台區別不大,並沒有什麼新的體驗?那我們就用前面說的大數據殺熟這個問題來說明,目前電商平台之所以能夠殺熟,基本上是依靠用戶歷史購買記錄推斷出用戶的購買意願,再利用平台與用戶間的信息不對稱和用戶對平台的依賴性,使用戶在無形中被帶節奏,從而以較高的成本購買商品。而行業鏈支撐的電商平台則有所不同,首先用戶的歷史購買記錄屬於個人隱私,用戶可以使用智能合約對數據進行定向授權,在用戶未授權平台獲取這部分數據之前,平台無法提前得知用戶的購買傾向,進而也就無法進行商品推薦。 另外,關於商品的這部分信息在鏈上應該是公開的,任何人都可以查看,因此也就不存在平台與用戶間的信息不對稱。只是平台更有技術實力能夠將商品從繁雜的商品庫中聚合出來而已,而一旦用戶對平台的聚合服務不滿意,也可以隨時切換另一個智能合約實現,拋棄原有平台。也就是說,電商行業鏈對平台是苛刻的,但卻可以為用戶帶來較好的體驗。

書籍訂購 而在用戶找到想要的書籍後,就到了下單進行訂購支支付這一環。在這個階段,我們可以抽象出很多智能合約標準,比如庫存扣減合約,支付合約,物流合約等等。其實這些合約都從属于同一個訂單合約。從務邏輯分析,購買商品的本質就是用戶跟其他各參與方簽訂了合同協議,合約內容可以理解為如果商品所有權轉移給用戶,之後選擇某某物流公司送達以後,用戶就會把鎖定在合約中的貨幣按商品價格組成,分別釋放給平台,商家及其他參與方。通過剛才的講解,我簡要為你梳理了書籍生產到用戶訂購的過程,描述了我對於電商行業鏈生態的理解。描述的內容並不專業,你也不必過於糾結其中的細節,比如商品如何劃撥,又該如何退貨退款等等。你只需要理解,在電商行業鏈中,商品信息在同一條區塊鏈網絡中共享,電商平台的競爭逐步就表現為對鏈上數據的聚合、分類及差異化營銷。

  • 現階段具有某些業務往來的企業逐漸聯盟起來形成小範圍的聯盟鏈試點,一旦新型業務模式形成,勢必會有其他企業加入,小聯盟逐漸壯大,從而形成以核心企業為主導的業務聯盟鏈。

  • 而隨著核心企業業務聯盟進一步擴大,多個核心企業所圍攏的多條聯盟鏈也會因為業務需求、監管要求統一成一條超級行業鏈。其最終形態是業務流程的標準化以及實現的差異化,企業間的競爭,將會逐步變成擁有相同數據情況下的差異化服務競爭

image

ERC-20、ERC-721、ERC-1155、ERC-4626 代幣標準和可組合性#

ERC-20、ERC-721、ERC-1155、ERC-4626、ERC - 之類的,不知道各種以太坊代幣標準是什麼?為什麼這些標準很重要?有興趣了解哪些代幣標準都服務於什麼目的?想要了解整體情況?這個長推為你解答

image

  • 以太坊是一台世界計算機。它是由匿名和不受信任的節點組成的網絡所維護的共享資源;通過共識達成一致,並且在經濟上保障網絡的安全。以太坊網絡提供可信的中立性,任何人都可以在上面獨立和協作構建。

  • 應用程序編程接口(API)是一種不同程序進行通信和開發者進行協調的機制。開發者會儘可能地隱藏他們程序的內部工作。通信被最大程度地簡化和改進。

計算機科學基礎:API 解釋

從抽象(abstraction)的角度來說,API 是抽象在現實世界中的最常見的表現方式。一個 API 是一組定義好的規則,解釋了程序 / 應用如何與彼此進行通信。

舉個例子,我們設想一下,一個電商網站有一個價格機器人;用戶向價格機器人給出水果的特質,而機器人會返回一個價格信息。

為了用價格機器人整合信息,你需要給它一個對象(水果)信息,並接受一個價格。因此,首先需要打包所有的對象信息:fruit_a = [apple, red, 200g, harvested 3 days ago]

,我們需要將這些信息喂給價格機器人。首先,我們調

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