為什麼說私有鏈沒公信力?以林務局「獨裁」區塊鏈為例
這篇文章以林務局的「臺灣林產品生產追溯系統」當成活教材,說明為什麼有人會說私有區塊鏈(private blockchain)的安全性不如公共區塊鏈(public blockchain)。
公鏈與私鏈
公共區塊鏈與私有區塊鏈的概念,類似於公有土地(例如公園)與私有土地(例如住家)。前者無須准入(permissionless),也就是不必經過誰的許可,任何人都可以隨時進入公園。後者則須要經過同意才能進入。
在區塊鏈領域裡,也是同樣的區分方法。
公鏈指的是人人都可以像是進入公園一樣,不須要任何人的許可,就可以成為資料(或交易)的記錄方。反過來說,私鏈則是要經過管理者的許可,才能獲得在區塊鏈上寫入資料的資格。
人們聽過的絕大多數區塊鏈,例如比特幣區塊鏈(Bitcoin)、以太坊區塊鏈(Ethereum)都屬於公鏈。這些公鏈是由網路上互不認識的網友們為了獲得加密貨幣挖礦獎勵,所共同營運的區塊鏈系統。因此,他們也被稱為礦工(miner)。
下圖就是我在寫文章當下,全球有 14,543 個比特幣節點(礦工)在共同維護比特幣這套區塊鏈的營運。顏色越深的地方,就是礦工分佈越密集的地方。這一萬多名礦工們仰賴共識機制,來共同決定哪些交易會(或不會)被記錄到區塊鏈上。
如果駭客送出一筆惡意(或錯誤)交易企圖破壞系統,其他節點就會發現這筆交易資料有問題,並拒絕這筆交易被寫入區塊鏈。換句話說,礦工之間會相互制衡。
但這篇要討論的林務局區塊鏈,則屬於私鏈。
它就不是由網路上的礦工共同營運,而是由單一個政府單位或是承包廠商來營運。私鏈沒有加密貨幣挖礦的誘因機制,也就不會有礦工想要加入營運區塊鏈的行列。只有單一記帳方的區塊鏈,最大的問題就在於球員兼裁判。
最極端的例子,就像這次的林務局區塊鏈,甚至連記帳方是誰都沒有公開(可能只有林務局或建置廠商自己)。如果記帳者自己送出錯誤的交易,也沒有其他人可以制衡,儼然就是鏈上的「獨裁」系統。
獨裁體制看似很有效率,因為不需要說服別人。但缺乏制衡機制,最終的問題就是體制出錯也渾然不覺。林務局區塊鏈的「獨裁」系統也有一樣的問題。
林務局的問題
下圖是林務局發包給廠商打造的「臺灣林產品生產追溯系統」首頁。用戶必須先點擊「查詢」,才能看到系統裡面目前已經登錄過哪些林產品的交易紀錄。
根據林務局的系統發包文件,政府之所以想要建置這套追溯系統,是想整合林產品的買賣雙方交易資料,並將產品在供應鏈中的完整流向紀錄在區塊鏈上。
最理想的狀況是,消費者可以透過掃描林產品(例如原木傢俱)上的二維碼,就能透過溯源系統找到這塊木材最初是從哪個林場砍伐、經過哪些處理,最終才會變成眼前的這個林產品。
這和標示肉品的原產地一樣。不同的是林務局希望將溯源資料記錄在區塊鏈上(避免資料遭到竄改),而不是一般的資料庫裡。但問題是,誰要竄改木材的溯源履歷?
之前我寫過一篇文章,指出沒人想去竄改木材生產履歷。之前我到林務局錄 podcast 訪談的時候,科長也親口證實目前台灣木材在市場上的價格並沒有比較高。既然沒人想竄改木材的生產履歷,為什麼還要以區塊鏈建構一套防竄改的系統?
不只林務局建置系統的出發點就有問題,連建置好兩年的區塊鏈系統,現在使用起來仍是漏洞百出。其中,最嚴重的兩大問題分別是:
- 資料在前台(林務局網站)、後台(區塊鏈)不一致
- 區塊鏈本身的區塊編號順序錯亂
這兩個問題的嚴重程度,堪比計算機連 1+1=2 的簡單運算都會出問題,遑論更複雜的功能。以下分別討論。
資料前後台不一致
以「臺灣林產品生產追溯系統」第一頁最後一筆資料,產品追溯碼 1303000028 為例。
林務局網站裡寫的是這筆林產品溯源資料會被寫在區塊編號 1526492 這個區塊裡面,而且交易 hash(資料流水號)是 0xb0b1e1ef42bab7e925c1dd3896e15ef4ad9e9b6b973f0d08c5b019c88cd2a131。
但實際上,點入區塊編號 1526492 卻顯示沒有紀錄任何一筆資料(Transactions 數量為 0)。
用筆記本來比喻,這就像一筆編號叫做0xb0b1e1ef42bab7e925c1dd3896e15ef4ad9e9b6b973f0d08c5b019c88cd2a131 的資料說它被記錄在筆記本上的第 1526492 這一頁。
但實際上,人們翻到 1526492 這一頁卻發現根本是一片空白,沒有任何紀錄在上面。這就是林務局系統的資料前台(林務局網站)、後台(區塊鏈資料)不一致問題。
這不是特例。大家有興趣的話還可以在產品溯源碼 1303000029、2005000025、2005000013 找到一樣的問題。認真找的話,你可能會發現錯誤率相當高,隨便都可以抓到 bug。
如果你已經覺得這套系統有夠扯,更誇張的還在後頭。
區塊編號順序錯亂
區塊鏈顧名思義就是在軟體工程上,把一個個相互獨立的區塊「鏈」起來。用筆記本來比喻的話,每個區塊(block)就像是活頁筆記本的內頁,而且會有頁碼從 0 開始。而鏈(chain)則像是活頁筆記本的扣環,讓每個區塊環環相扣。
業界的常識是,區塊的編號越小,代表資料時間越久遠。區塊的編號越大,代表資料時間越接近現在。區塊編號由小到大,是區塊鏈的基本常識。沒想到,林務局這套區塊鏈的區塊編號卻連最基本的由小到大逐漸遞增都做不到,而是區塊編號會隨便亂跳。
下圖是產品溯源碼 1303000161 的頁面。這筆林產品的溯源資料,是記錄在區塊編號 10366643 裡面。
實際點入區塊編號 10366643 則會發現,這個區塊的時間戳記是在 2020 年的 11 月 23 日,距離我寫文章的 2021 年 12 月 28 日已經是 13 個月之前。
但問題就在於,在我寫文章當下 2021 年 12 月 28 日晚上 7 點 35 分的區塊鏈上的最新區塊,才產生到編號 10029426 而已。
略懂區塊鏈的人,肯定能一眼看出這套系統的問題之大。
既然現在的區塊編號才到 10029426,為什麼 13 個月前的區塊編號就會寫到 10366643 ?除了區塊鏈系統錯亂,我想不到第二個原因來解釋這個靈異現象。
連區塊編號都會錯亂,誰還敢相信區塊鏈系統上的資料是不是正確?區塊鏈上面記載的都是有價資產,如果可以隨便系統錯亂,也就完全失去使用區塊鏈記錄資料的意義。
林務局私有鏈的問題
這起事件呈現出林務局私有區塊鏈的兩大問題:
- 私有鏈沒人制衡
- 林務局自己也不懂區塊鏈
如果同樣的問題出現在公有鏈,我相信那個區塊鏈的幣價早就直接歸零。畢竟這種資訊錯亂的系統,誰敢把錢放在上面?私有區塊鏈只有林務局自己在記帳,即便錯了也沒人發現,這就是「獨裁」的最大問題。
其次,根據區塊鏈紀錄,這套系統已經錯了至少一年以上。但林務局自己恐怕根本不知道區塊鏈正確運作該是什麼樣子,也就難以找出廠商做出來的系統錯在哪裡。我相信私鏈、公鏈各有其用途,也都有其缺點。
這篇文章只是以林務局的系統為例,指出私有鏈可能會產生出的問題。如果大家能幫忙林務局這套系統 debug 找出更多問題,或是在留言區確認這些問題的存在,相信都能讓政府更嚴肅的面對、正視這些花費人民納稅錢建出來的問題系統。