知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
首先說明區塊鏈中提到的賬本與記賬等等詞彙是與會計無關的詞彙。
我們傳統理解的賬本是指二位表格,記錄某年某月產生的費用。
時間 | 用途| 金額 -----------+-----+----- 2018-05-02 | 借 | 500 2018-05-10 | 還 | 500 2018-05-15 | 借 | 500 2018-05-20 | 借 | 500
如果賬目比較多,可以拆賬,將不同分類的賬目,放到特定賬本中。另外二位表格可以通過時間索引或者分類索引等等,快速找到一筆賬目。
區塊鏈是怎麼記賬的?
+----------------+ +----------------+ +----------------+ +----------------+ | blockNumber 0 | | blockNumber 1 | | blockNumber 2 | | blockNumber 3 | | hash: 0x1 |<--- | hash: 0x2 | <---| hash: 0x3 | <---| hash: 0x4 | | parent:0x0 | | parent:0x1 | | parent:0x2 | | parent:0x3 | +----------------+ +----------------+ +----------------+ +----------------+ |時間:2018-05-02 | |時間:2018-05-10 | |時間:2018-05-15 | |時間:2018-05-20 | |用途:借 | |用途:借 | |用途:借 | |用途:借 | |金額:500 | |金額:500 | |金額:500 | |金額:500 | +----------------+ +----------------+ +----------------+ +----------------+
區塊鏈可以理解為是傳統賬本的行列矩陣做這轉換,每個事件收尾相連指向上一個區塊地址形成鏈狀,區塊鏈不能通過分類拆分賬本,所有賬目全部在一個鏈條上。
什麼是分散式記賬?上面鏈狀的資料結構將保存在所有的區塊鏈節點上,形成分散式集群,這就是分散式記賬。
雖然區塊鏈解決了分散式記賬,但是也有很多弊端。我說過互聯網上很多關於區塊的文章都是臆想,紙上談兵,他們根本沒有實操經驗。
下面我們講講區塊鏈賬本存在的問題
區塊鏈不能鍵索引,無法快速搜索區塊中的數據,必須依賴區塊鏈以外的中心化技術,例如搜索引擎,資料庫。例如 etherscan.io 就是將以太坊上的區塊重新入庫,借助資料庫實現數據檢索。
區塊鏈只能順序檢索,中心化賬本我們彙總賬目只需做 sum 求和操作,而區塊鏈必須從 blockNumber 0 開始一次向後讀取,運算成本極高。
所有賬目均在一個鏈上,不同分類混在一起,彼此相連。
+----------------+ +----------------+ +----------------+ +----------------+ | blockNumber 0 | --> | blockNumber 1 | --> | blockNumber 2 | --> | blockNumber 3 | --> 時間軸 +----------------+ +----------------+ +----------------+ +----------------+ |時間:2018-05-02 | |時間:2018-05-10 | |時間:2018-05-15 | |時間:2018-05-20 | |分類:A | |分類:B | |分類:A | |分類:A | |金額:500 | |金額:500 | |金額:500 | |金額:500 | +----------------+ +----------------+ +----------------+ +----------------+
無法歸檔
中心化資料庫,可以歸檔一段時間內的數據,歸檔數據是冷數據,几乎不會再查詢,這樣一來中心資料庫中的數據量減少,剩下的熱數據處理起來非常快。我們有很多技術處理歸檔數據,將歸檔數據備份到存儲介質上的解決方便有很多,也非常成熟。例如壓縮,去重複等等,以減少存儲成本開銷。
而區塊鏈從誕生之日起到今日所有數據必須放在熱數據區。任何新增節點都必須從區塊0開始同步,並且保持每日同步到最新區塊,否則將無法交易。區塊一直在膨脹,隨時區塊鏈的普及,交易量猛增,總有一天將不堪重負。
例如BTC(比特幣) 安裝錢包後,需要從92年的0區塊開始同步,至少需要一周的時間,並且占用你硬碟203G的空間。
ETH(以太坊)採用 fast 模式也需要200G的磁碟空間同步一周左右。就算採用最新的 light 模式,同步過程中經常出現中斷,沒有peers節點,斷斷續續,體驗極度不好。
區塊鏈沒有事務處理
因為區塊鏈是首尾相連的,只能在尾部添加新區塊,區塊無法修改,所以區塊鏈無法做事務處理。
Block 0 -> Block 1 -> Block 2 -> Block 3 -> Block 4
試想一下上面的 Block 2 回滾會怎樣?如果 Block 2 回滾,Hash 值產生變化,後面所有區塊都作廢。所以區塊鏈無法實現事務處理。
超級賬本(Hyperledger Fabric)記不了帳
Hyperledger Fabric 中文名稱叫超級賬本,這個翻譯坑害了無數人。 Hyperledger Fabric 跟賬本沒有任何關係。
實際工作中我使用 Hyperledger Fabric 實現了類似以太坊ERC20代幣的功能,發行一個代幣後將發行金額寫入一個總賬,然後從總賬中項其他賬號轉賬,用戶消費後將金額從用戶轉會總賬。
問題來了,因為超級賬本沒有事務處理,也無法串列執行每一筆操作,當並發執行的時候,賬目出現混亂。
區塊鏈無法將一組業務邏輯放到事物中執行。這樣在實際的開發中我們只能依賴應用層,只能在應用層上實現事物鎖的功能。由於區塊存儲在多個節點上,共識時間無法預計,不知道 stub.PutState(非同步寫入)執行完成的具體時間,無法達到100%無誤。對於財務數據來不得半點馬虎,我還是決定放棄這個功能,專為傳統資料庫。
所以超級賬本記不了
TPS:Transactions Per Second(每秒傳輸的事物處理個數)
1. 區塊鏈是非同步執行,你無法知道什麼時候才能完成這筆交易,無法實現瞬間到賬。
2. 交易阻塞
蛋疼的 gas 費用
總結:用區塊鏈記賬很蛋疼。