常見問題

通用問題

問:區塊鏈是誰發明的,有什麼特點?

答:區塊鏈相關的思想最早是比特幣的發明者-中本聰(化名)在論文中提出(但沒有明確定義)作為比特幣網絡的核心支持技術。自那以後,區塊鏈技術逐漸脫離比特幣網絡,成為一種通用的可以支持分佈式記賬能力的底層技術,具有去中心化和加密安全等特點。

問:區塊鏈和比特幣是什麼關係?

答:比特幣是基於區塊鏈技術的一種數字現金(cash)應用;區塊鏈技術最早在比特幣分佈式系統中得到應用和驗證,確保了比特幣系統在 2009 年上線後,在完全自治情況下可以正常運轉。

問:區塊鏈和分佈式數據庫是什麼關係?

答:兩者定位完全不同。分佈式數據庫是解決高可用和可擴展場景下的數據存儲問題;區塊鏈則是在多方(無須中心化中介角色存在)之間提供一套可信的記賬和合約履行機制。

問:區塊鏈有哪些種類?

答:根據部署場景公開程度,可以分為公有鏈(Public Chain)、聯盟鏈(Consortium Chain)和私有鏈(Private Chain);從功能上看,可以分為以支持數字貨幣為主的數字貨幣區塊鏈(如比特幣網絡)、支持智能合約的通用區塊鏈(如以太坊網絡)、面向複雜商業應用場景支持權限管理的分佈式賬本平臺(如超級賬本)。

問:(公有鏈情況下)區塊鏈是如何保證沒有人作惡的?

答:區塊鏈並沒有試圖保障每一個人都不作惡,每個參與者都默認在最長的鏈上進行擴展。當某個作惡者嘗試延續一個非法鏈的時候,實際上在跟所有的“非作惡”者進行競爭。因此,當作惡者超過一半(還要保持選擇一致)時,在概率意義上才能破壞規則。而代價是一旦延續失敗,所有付出的資源(例如算力)都將浪費掉。

問:區塊鏈的智能合約應該怎麼設計?

答:首先,智能合約類似其它應用程序,在架構上即可以採取 monolithic 的方式(一個合約針對一個具體商業應用,功能完善而複雜),也可以採取 microservice 的方式(即每個合約功能單一,多個合約一起構建應用)。 選擇哪種模式根本上取決於其上商業應用的特點。從靈活性角度,推薦適當對應用代碼進行切分,劃分到若干個智能合約,儘量保持智能合約的可複用性。

問:如何查看 PEM 格式證書內容?

答:可以通過如下命令轉換證書內容進行輸出:openssl x509 -noout -text -in <ca_file>;例外,還可以通過如下命令來快速從證書文件中提取所證明的公鑰內容:openssl x509 -noout -pubkey -in <ca_file>

問:已知私鑰,如何生成公鑰?

答:對於橢圓曲線加密算法,可以通過如下命令生成公鑰:openssl ec -pubout -outform PEM -in <private_key>

問:如何校驗某證書是否被根證書籤名?

答:已知根證書文件 和待驗證證書文件 情況下,可以使用如下命令進行驗證:openssl verify -CAfile <root_cafile> <ca_to_verify>

問:為何 Hash 函數將任意長的文本映射到定長的摘要,很少會發生衝突?

答:像 SHA-1 這樣的 Hash 函數可以將任意長的文本映射到相對很短的定長摘要。從理論上講,從一個很大的集合映射到一個小的集合上必然會出現衝突。Hash 函數之所以很少出現衝突的原因在於雖然輸入的數據長度可以很大,但其實人類產生的數據並非全空間的,這些數據往往是相對有序(低熵值)的,實際上也是一個相對較小的集合。當然,這個集合自身可能比輸出的結果要大,但這個衝突的概率遠沒有輸入是全空間集合時那麼誇張。

比特幣、以太坊相關

問:比特幣區塊鏈為何要設計為每 10 分鐘才出來一個塊,快一些不可以嗎?

答:這個主要是從公平的角度,當某一個新塊被計算出來後,需要在全球的比特幣網絡內公佈。臨近的礦工將最先拿到消息並開始新一輪的計算,較遠的礦工則較晚得到通知。最壞情況下,可能需要數十秒的延遲。為儘量確保礦工們都處在同一起跑線上,這個時間不能太短。但太長了又會導致每個交易的“最終”確認時間過長,目前看,10 分鐘左右是一個相對合適的折中。另外,也是從存儲代價的角度,讓擁有不太大存儲的普通節點可以參與到網絡的維護。

問:比特幣區塊鏈每個區塊大小為何是 1 MB,大一些不可以嗎?

答:這個也是折中的結果。區塊產生的平均時間間隔是固定的 10 分鐘,大一些,意味著發生交易的吞吐量可以增加,但節點進行驗證的成本會提高(Hash 處理約為 100 MB/s),同時存儲整個區塊鏈的成本會快速上升。區塊大小為 1 MB,意味著每秒可以記錄 1 MB/(10*60)=1.7 KB 的交易數據,而一般的交易數據大小在 0.2 ~ 1 KB。

實際上,之前比特幣社區也曾多次討論過改變區塊大小的提案,但都未被最終接受。

問:以太坊網絡跟比特幣網絡有何關係?

答:以太坊網絡所採用的區塊鏈結構,源於比特幣網絡。基於同樣設計原理上,以太坊提出了許多改善設計,包括支持更靈活的智能合約、支持除了 PoW 之外的更多共識機制(尚未實現)等。

超級賬本項目

問:超級賬本項目與傳統公有區塊鏈有何不同?

答:超級賬本是首個面向聯盟鏈場景的開源項目,在這種場景下,參與賬本的多方存在一定的信任前提,並十分看重對接入賬本各方的權限管理、審計功能、傳輸數據的安全可靠等特性。超級賬本在考慮了商業網絡的這些複雜需求後,提出了創新的架構和設計,是首個在企業應用場景中得到大規模部署和驗證的開源項目。

問:區塊鏈最早是公有鏈形式,為何現在聯盟鏈在很多場景下得到更多推崇?

答:區塊鏈技術出現以前,中心化的信任機制可以實現很高的性能和便捷的監管,但一旦中心機制出現故障,則導致系統的信任前提發生破壞。區塊鏈技術可以提供無中介化情況下的信任保障。公有鏈情況下,任何人都可以參與監督,可以實現信任的最大化,但隨之而來帶來包括性能低下、缺乏監管等問題。

聯盟鏈在兩者之間取得了平衡。非中心化的聯盟共識,讓系統可信任度以指數形式增加;同時,聯盟形成的信任前提,可以在不影響信任的情況下實現更優化的性能,並支持權限管理。這對複雜應用場景特別企業場景可以提供更好的支持。

問:採用 BFT 類共識算法時,節點掉線後重新加入網絡,出現無法同步情況?

答:這是某些算法設計導致的情況。掉線後的節點重新加入到網絡中,其視圖(View)會領先於其它節點。其它節點正常情況下不會發生視圖的變更,發生的交易和區塊內容不會同步到掉線節點。出現這種情況,可以有兩種解決方案:一個是強迫其它節點出現視圖變更,例如也發生掉線或者在一段時間內強制變更;另一種情況是等待再次產生足夠多的區塊後觸發狀態追趕。

問:超級賬本 Fabric 裡的安全性和隱私性是如何保證的?

答:首先,Fabric 1.0 及往後的版本提供了對多通道的支持,不同通道之間的鏈碼和交易是不可見的,即交易只會發送到該通道內的 Peer 節點。此外,在進行背書階段,客戶端可以根據背書策略來選擇性的發送交易到通道內的某些特定 Peer 節點。更進一步的,用戶可以對交易的內容進行加密(基於證書的權限管理)或 Hash 處理,同時,只有得到授權的節點或用戶才能訪問到交易。另外,排序節點無須訪問到交易內容,因此,可以選擇不將完整交易(對交易輸入數據進行隱藏,或者乾脆進行加密或 Hash 處理)發送到排序節點。最後,所有數據在傳輸過程中可以通過 TLS 來進行安全保護。許多層級的保護需要配合使用來獲得不同層級的安全性。

實踐過程中,也需要對節點自身進行安全保護,通過防火牆、IDS 等防護對節點自身的攻擊;另外可以通過審計和分析系統對可疑行為進行探測和響應。

Last updated