爲何自定義密碼學原語對在區塊鏈上的開發相當重要?

區塊鏈是一個基於密碼學、經濟學和網絡科學的新技術。對於通常的大衆來講,其中的密碼學並非一門容易親近的學科,甚至是上面提到的三個學科中,你們以爲最有距離感的學科。但身處區塊鏈圈的朋友們必定會經常聽到「區塊鏈是一部 Trust Machine」這樣的說法,或者有人會說在區塊鏈的世界裏是「In Math we Trust」,可見密碼學對於區塊鏈技術來講是根基同樣的重要存在。 git

好了,那麼問題來了:github

  • 區塊鏈究竟在哪些地方用到密碼學呢?
  • 密碼學爲何對區塊鏈技術相當重要?

區塊鏈的哪些地方用到了密碼學?

首先,若是你是一個區塊鏈用戶,可能在你房間裏的某個角落,會有一張紙條,上面抄着十二個不知道怎麼來的單詞,有的人還有不少張,甚至有些大 holder 會把這十二個英文單詞刻在鋼板上,而後鎖進保險箱裏。 算法

是的,爲何這十二個助記詞,或者像一長串亂碼般的私鑰可以表明你對資產的全部權呢? 編程

這背後的原理其實就是密碼學。 安全

咱們的密鑰、地址和錢包都是經過密碼學去實現,利用非對稱加密技術——橢圓曲線算法(ECC)能夠驗證某人持有的私鑰是不是吻合某個公鑰,經過這個方式咱們能夠證實這我的是不是這筆加密資產的持有人,由於除了擁有私鑰的人以外,其餘沒有該私鑰的人是沒有辦法解鎖這筆資產的。 網絡

咱們在此用比特幣舉例私鑰、公鑰和地址生成的原理,一個比特幣錢包中包含一系列的密鑰對,每一個密鑰對包括一個私鑰和一個公鑰。私鑰一般是一個隨機選出的 256 位的數字。基於私鑰,咱們就可使用 secp256k1 標準的橢圓曲線這個單向密碼函數產生一個公鑰。基於公鑰,咱們又可使用一個單向哈希函數 SHA256 和 RIPEMD160 生成比特幣地址,再經過 Base58 check 編碼將比特幣地址變成如今這較爲簡潔的形式。而像咱們比較經常使用的助記詞,則是經過基於 BIP 39 標準而生成的隨機英文單詞。若是沒有私鑰或助記詞的人,是沒法使用這筆加密資產的。函數

image.png

比特幣的公鑰和地址的生成過程工具

(圖取自精通比特幣) 性能

當咱們有了能夠配對的密鑰對後,能夠在各類類型的錢包或者客戶端上作驗證,確認資產的全部權,而且經過這個客戶端來進行各類資產的使用。例如最簡單 BTC 轉帳,或者再進階一點的用某個錢包去簽署智能合約的交易:好比用 Metamask、imToken 或者 Alphawallet 等錢包裏的 ETH 去購買加密貓,或者在 DeFi 的平臺上面進行借貸,以及用 Uniswap 交換某些 ERC20 Token 等。 學習

除了轉帳等基本的驗證外,如今甚至某些平臺的身份驗證均可以用公私鑰來作登陸驗證,或者經過驗證你是某筆資產的全部人來進行各類權益的證實。簡單來講,公私鑰驗證系統背後的密碼學就是用戶想暢遊區塊鏈世界的通行證

在區塊鏈中,還有另一個不可忽視的密碼學使用場景,就是區塊中的交易排序以及 Merkle Tree 等決定區塊排序的過程。比特幣就是將每筆交易用 SHA256 算法進行加密,在這裏加密算法確保了區塊鏈的安全性,以及幾乎不可能被篡改的特性。光是在這兩個比特幣的基礎使用場景中就都用到了密碼學,因而乎甚至還有許多人在猜想,中本聰多是個密碼學大佬,纔可以把密碼學在這個點對點的現金系統中使用的淋漓盡致。

固然,除了在區塊的生成和公私鑰驗證這兩大區塊鏈的核心功能上能夠發揮用途以外,密碼學在隱私保護甚至擴容等方面均可以派上用場。

如今的公鏈如何使用密碼學?

  • Wow,這是一條新的公鏈嗎?
  • 那它有沒有錢包啊 ?
  • 又要多一組新地址和抄一組新的助記詞了。。。

若是一個用戶真的願意本身好好地保管本身的資產,也勤於投資不一樣的公鏈,我相信他們必定也會有相似的經驗和好幾組不一樣的助記詞或私鑰。但到最後,他們可以保存好的,可能只剩下那些最主要的持倉資產,有些人甚至忘記備份某些資產的助記詞。

長期下來,區塊鏈資產管理的問題也致使區塊鏈的門檻愈來愈高。因此一些錢包爲了解決這個問題,已經提出了不少的優化方案。有些錢包甚至能夠作到一個身份錢包的單一助記詞,能夠管理多種資產等功能,但仍然有許多組不一樣的地址必需要由用戶來作管理。這樣的問題對於不少新公鏈而言可能更爲嚴重,由於若是用戶要去經過他們的網頁或手機錢包,去嘗試鏈上的應用,用戶就會增長許多管理公私鑰的成本,更況且他們不像郵箱的密碼同樣能夠任由用戶本身定義,既不滑順也不香。

但爲何區塊鏈會有這樣的限制?

這樣的限制是由於目前許多的公鏈,都將不少密碼學原語的使用場景寫入了共識層,所以在這些公鏈中,像公私鑰簽名、客戶端驗證,以及區塊生成的哈希和經常使用的加密算法,基本上都是鑲嵌在共識層中的。例如地址所使用的驗證、交易使用的簽名等,其實都寫在底層協議中,所以會變得很是難以改動。另外,許多公鏈的虛擬機性能都不足以支持靈活的密碼學原語部署,所以對於這樣的公鏈而言,若是底層的虛擬機不預先支持某個密碼學原語,那麼基於該密碼學原語的場景可能很難直接被開發者使用。

若是要更動,惟一的辦法就是硬分叉!

拿以太坊爲例,以太坊的共識層寫入了哪些密碼學的場景呢?

除了區塊的加密簽名和 Merkle Tree 的哈希外,還有交易簽名和客戶端的驗證。若是有任何人想要在這些點上作改動,例如將以太坊公私鑰的哈希算法 keccak-256 換成其餘簽名算法,那麼惟一的辦法就是提一個 EIP (Ethereum Improvement Proposal),而後等待、祈禱這個提案被排入硬分叉之中。由於寫在協議層的內容,就是全網的全部用戶都必須聽從的規則。

然而硬分叉每每須要很是長的時間,以 EIP 152 爲例,這是一個 2016 年就提出的提案,但願將簽名算法 BLAKE2 加入以太坊中,但直到 2019 年末的伊斯坦布爾提案中才被加入到升級的內容當中,整整歷時 3 年之久

從剛纔 EIP 152 的例子中咱們還會發現另外一個限制,那就是在以太坊上若是要使用虛擬機不支持的密碼學原語,幾乎是不可能的。由於對於以太坊虛擬機而言性能是一大限制,光是簡單的運算,就可以消耗大量的 gas。

所以咱們若是回顧以太坊上歷次的分叉,就能夠發現從家園(HomeStead)的硬分叉升級開始,以太坊就不斷地把全部可能經常使用到的密碼學原語,例如 sha256 hash、ripenmd160hash 等持續的經過預編譯(precompiled)的方式,加入到底層的虛擬機中。這點在拜占庭(Byzantium)或者伊斯坦布爾(Istanbul)的升級中也能夠看到。以太坊經過硬分叉的形式,來預編譯密碼學原語以及這些密碼學原語運算的 gas 訂價。

若是不經過預編譯合約在節點先進行實現,那麼許多簽名算法的智能合約部署將花費很是很是高的 gas 費,致使其根本沒法部署。例如 EIP 19六、 EIP 197 之因此被採納,就是預見了 zkSNARK 須要大量的 gas 進行鏈上的運算。所以預先將這些加密算法,如橢圓曲線加法、乘法和配對驗證等編譯進了底層的 EVM 中,好讓這些計算成本能夠節省下來。因此,咱們能夠說在以太坊上除了已經作了預編譯的簽名算法外,其他的加密算法基本上是沒辦法使用的。

上述這些固化的密碼學使用方式,對於開發者而言是一個很大的限制。

因爲交易和客戶端的簽名驗證都被寫入共識層,所以驗證工具和流程都必須按照規定的加密算法進行。例如在比特幣或以太坊中,若是咱們要建立一個帳戶,那麼咱們依舊須要管理一組新的密鑰對。

對於想要帶來良好用戶體驗的開發者而言,這樣會產生不少的限制,而且須要經過其餘方式,去彌補固化的底層設施帶來的不友善的用戶體驗。好比在建立助記詞以後,咱們能夠在某些錢包中使用 FaceID(如 imToken),好比在 ABC Wallet 中,用戶起初只須要靠像手機裏的六字驗證碼就可以登入,等你真的以爲你須要把私鑰或助記詞導出了,再進行導出和備份。

這些都是開發者試圖提高用戶體驗所想出來的好辦法,但對於每一條新的公鏈,密鑰對管理的本質都是須要有一組新地址和密鑰,這個問題是一直存在的。

上述的公私鑰驗證方式不夠靈活的問題,在比特幣、以太坊等較爲先發的公鏈上或許還不明顯,由於他們已經有既有的用戶,這些用戶也被折磨習慣了。但對於近期興起的公鏈而言,若是還存在和先前公鏈一樣的進入摩擦成本,那麼就是給用戶設置了障礙,也會影響開發者是否想要在這個公鏈上開發的意願。

一個對用戶有學習成本的公鏈,在獲取用戶上就存在着先天的壁壘,即便這些公鏈有其餘的亮點,可能對於開發者而言,也不會那麼有吸引力,由於他們知道不少的用戶可能都被這些不友善的用戶體驗給嚇走了。

另外,密碼學原語不可以靈活使用的問題,影響的層面還不止於公私鑰的保存。對於開發者而言,若是之後他們想用更先進的密碼學原語來保證隱私及安全,同樣會面臨到底層的虛擬機能不能部署,以及支持簽名驗證的挑戰。固然還會影響目前你們討論的很熱的話題:跨鏈,由於不一樣的鏈使用的密碼學原語也會有所不一樣,在虛擬機驗證交易時就會遇到這個難題,這也是爲何目前許多同構跨鏈的解決方案(Cosmos / Polkadot )可行,但對於異構跨鏈的方案卻停滯不前的緣由。

Nervos 的設計有何不一樣?

在 Nervos CKB 中,除了交易排序外,沒有其餘硬編碼的密碼學原語,資產全部權的驗證是經過 cell 中的 lock script 來作驗證,其中的驗證規則和使用的密碼學原語都是能夠自定義的,所以幾乎全部的密碼學原語均可以被開發者靈活的使用。

套用一句 Nervos 研究員 Cipher 老師的話來講,就是:「在 CKB 上除了最基礎的交易排序之外,其他都是應用層的內容。」這讓開發者擁有了很是大的開發彈性,去進行各式各樣的開發,例如更自由的帳戶驗證方法等。

由於在基於 RISC-V 的 CKB-VM 中,要求的就是一套可以符合 RISC-V 編碼的驗證規則而已,開發者有不少可以自由揮灑的空間。下圖能夠看出 Nervos 和其餘能夠支持智能合約的公鏈在靈活度上的差別,應用層的內容表示的是能夠去作自定義的,協議層表明的是須要通過「分叉」才能改動的內容。

1591691785720.jpg

以目前 Nervos 的 Grnats 團隊 Lay2 爲例,爲何他們開發的 pw-sdk 可以用以太坊的地址,甚至是 ENS 來接收 CKB?是由於在 CKB 上,地址是開發者能夠任意把玩的應用層內容。理論上只要鏈上有已經有驗證規則的 cell 和非對稱加密的加密算法庫,這種地址生成規則就可以被驗證。例如咱們能夠把以太坊的 Keccak-256 (SHA-3)的簽名算法和驗證規則和比特幣的 SHA-256 都部署在鏈上,那麼將來的其餘開發者就能夠用 cell deps 進行調用。

也所以,任何的開發者將來若是想在 CKB 上 ,爲他的資產添加更先進的加密算法作爲解鎖的規則,是徹底可行的。由於任何人均可以部署各類密碼學原語庫在 CKB 上,而且能夠經過優化去節省存儲空間以及減小驗證所需的 cycle 去下降部署的成本,讓任何先進的密碼學原語不用等到硬分叉也可以被使用。

在 CKB 上可能看見的區塊鏈將來:直逼互聯網的用戶體驗

基於靈活的密碼學原語,咱們能夠說在將來,不少互聯網上用戶很是習慣的驗證規則,也徹底可能被寫成 RISC-V 能夠讀取的形式,而且被部署到鏈上,例如 PGP Key 驗證或者指紋解鎖等功能。若是在鏈上有一個可以對應他們所使用的驗證標準的腳本,而且有能夠支援這種驗證的可信環境,那麼如此方便的使用方式在將來是真的可能實現的。

再更深刻一點地看,將來的應用層,會有更多的場景會使用到密碼學的各類算法。

近兩年在分層擴容的領域(Layer 2),除了原先的閃電網絡、狀態通道以及其餘的側鏈解決方案以外,又出現了一種新興的密碼學擴容應用:Rollup,也就是利用簽名算法來壓縮交易。

目前在 Rollup 上最主流的壓縮交易的方式是零知識證實 (zkp),也就是所謂的 zkRollup。將來若是在 Rollup 上有其餘更先進的零知識證實解決方案,或者利用其餘去簽名算法(如 BLS 等),對於 CKB 而言,只要開發者能夠想到低成本的實現方法,均可以直接讓 CKB-VM 驗證,而不須要經過硬分叉。由於這並不涉共識層的內容,並且 CKB-VM 相較於 EVM 而言也更加地高效。目前安比實驗室也在開發在 CKB 上可以使用的零知識證實庫,將來可供開發者任意使用。

另外,CKB 由於能夠支持靈活的密碼學原語,也在區塊鏈跨鏈資產轉移方面,比其它的公鏈有更大的先天優點進行來自不一樣鏈的交易驗證,讓 CKB 更有機會完成異構跨鏈的資產流通與轉移。

打從中本聰的比特幣白皮書問世開始,區塊鏈就是一個能夠在中心化的環境下用密碼學去證實共識的新技術,這是在互聯網上沒法完成的事情。但要大規模的使用區塊鏈,咱們要作的不是讓用戶在體驗上委曲求全,而是像 Lay2 團隊的 Frank 說的那樣:「咱們須要一個可以有能力去支持開發者‘開門迎客’的基礎設施」,讓區塊鏈不會由於底層設施的不靈活,而成爲少數極客或圈內人的玩物。

公鏈若是可以靈活的支持各類密碼學原語,讓開發者能夠有更高的彈性,那麼就更能夠跳過「教育用戶」的這個緩慢的過程。由於就和互聯網同樣,雖然如今你們都是無網不歡的人,但對於純粹的 C 端用戶而言,他們依舊不須要知道互聯網到底分了幾層,或者 P2P 網絡是怎麼回事。

一樣的,區塊鏈的純 C 端用戶在使用區塊鏈技術時也不須要知道區塊鏈的底層知識,咱們要作的是打造一個能夠擁有互聯網體驗,又有區塊鏈的憑證,以及安全和去中心化等加成效果的基礎設施,而具備高度編程靈活性的 Nervos CKB 正在這條道路上奮勇向前。

感謝 Lay2 的知縣,SECBIT 的志鵬,史迪仔等人對本篇文章的意見和啓發

Source:


相關文章
相關標籤/搜索