什麼是區塊鏈 (Blockchain)? 可以取代資料庫嗎?


區塊鏈 (Blockchain) 是近幾年來很熱門的話題,似乎沒有跟區塊鏈扯上關係就太落伍了。但是也因為太熱門了,所以很多奇怪的說法就出現了,變成為了區塊鏈而區塊鏈。

到底什麼是區塊鏈? 他可以做什麼? 他不是什麼? 區塊鏈是否可以取代資料庫? 我們將仔細的來解析。

什麼是區塊鏈 (Blockchain) ? 

根據維基百科,區塊鏈是藉由密碼學與共識機制等技術建立與儲存龐大交易資料區塊串鏈的點對點網路系統。

以上的說明對於不了解區塊鏈的人來說,肯定聽了還是不會理解什麼是區塊鏈。

什麼是區塊鏈? 簡單來說,區塊鏈就是符合以下幾個特色的網路系統 :

(1) 把資料儲存在一個儲存單位中,然後各儲存單位再串聯起來。

(2) 這個儲存單位就稱為區塊,串聯各區塊的方式就是透過密碼學與共識機制等技術。

(3) 資料儲存的方式不是集中儲存在資料中心,而是分散在網路系統的各個節點,屬於去中心化(Decentralized)的網路系統。

雖然已經將維基百科的解釋用比較白話的方式來表示,但是似乎仍舊還不夠白話。

我們舉個例子來說明 : 假設朋友向你借了$10,000元,寫了一張借據,如果這張借據不見了,朋友向你借了$10,000元的事實就消失了。但是如果這張借據複製了100份,分別給100個朋友持有,借據會消失或是被竄改的機率就降低很多。

以上的方式,就是把借據去中心化了,不再只儲存於一個地方,而是分散到很多地方。如果你借錢出去的借據很多張,就把各個借據串聯起來,並把串聯起來的借據複製很多份,分散給各個朋友保存。

但是以上借據的處理方式,還是有漏洞,如果朋友幫你保存的借據,被竄改了怎麼辦? 朋友幫你保存的借據怎麼知道是經過你確認的借據? 要解決這個問題的方法,就是密碼學與共識機制。

因此要了解什麼是區塊鏈,需要先知道幾個名詞 : 密碼學、共識機制、去中心化、點對點。

點對點 (Peer-to-Peer) : 簡稱P2P,是無中心服務器,依靠用户羣(peers)交換訊息的互聯網體系,它的作用在於減低以往網路傳輸中的節點,以降低資料遺失的風險。點對點就是不再需要中間人的方式,例如傳統購物是工廠先送貨到商店,然後消費者到商店購買,商店的角色就是中間人,點對點的方式就是消費者直接對工廠,捨去商店這個中間人。

去中心化 (Decentralization) : 相對於「中心化」而言的新型態架構。去中心化就是資料不再集中於資料中心,而是分散到各個網路的節點。

密碼學 (Cryptography) : 透過數學將訊息進行處理,以確保訊息安全的科學。區塊鏈會用到的密碼學技術有兩大類,非對稱式加密(Asymmetric cryptography)以及哈希函數(Hash)。

共識機制 (Consensus) : 在短時間內完成對交易的驗證和確認的機制。區塊鏈的共識機制也有兩大類,Proof-of-Work(POW)Proof-of-Stake(POS)

以下影片解釋[共識機制] : 


如果還不是很清楚,來看看這個解釋[區塊鏈]的影片說明 :


所以什麼是區塊鏈? 區塊鏈就是一個去中心化的分散式網路系統,以密碼學及共識機制來確保資料的安全性、不可竄改性、及可信賴性。

還有匿名性呢? 當然匿名性也是目前其中之一的特性,但是當某個區塊鏈的應用不需要匿名性,其實也是可以的。所以匿名性並不算是區塊鏈的必要條件。


區塊鏈的比特幣不是可以匿名交易嗎?

在比特幣官網上這篇 Protect your privacy,就提到「Bitcoin is often perceived as an anonymous payment network. But in reality, Bitcoin is probably the most transparent payment network in the world. At the same time, Bitcoin can provide acceptable levels of privacy when used correctly.」

他說 : 比特幣通常被認為是匿名支付網路,但是其實他可能是世界上最透明的支付網路,同時,比特幣如果正確使用,能提供可以接受程度的隱私權。

這個意思就是說,某種程度上比特幣使用方法對的話,他是匿名支付網路,但是如果使用方法不對的話,其實他是很透明的支付網路。

例如這個比特幣位址的交易連結,你看到這些資訊 : 


這個地址的交易資料以及餘額,都很透明的可以查詢,我們知道總共交易123次,目前餘額是 BTC 0.26352208。

所以,上面說「比特幣可能是世界上最透明的支付網路」,但是這個比特幣錢包是誰的? 不知道。

上面又說「比特幣如果正確使用,能提供可以接受程度的隱私權」,正確使用的意思是你不要讓別人知道這個比特幣錢包是誰的,就能提供可以接受程度的隱私權。

當您進行比特幣交易時,您的錢包地址和交易明細會被記錄在區塊鏈中。只要您的錢包地址和您的身份之間沒有關聯,您的交易將保持匿名,但是任何人都看得到。

但是如果你的比特幣地址與你的身份建立了關聯,例如你公開比特幣地址讓別人可以付錢給你。從那時候開始,你在區塊鏈上做過的所有交易被聯繫起來,你的隱私權就不保了。

因此比特幣官網建議每次交易使用不同的錢包,並且不要把人跟錢包的連結資訊公開,比特幣就是一個既「透明」又「匿名」的支付網路。

以下可以看到各種虛擬幣的隱私權比較,比特幣不保證隱私權,但是比特幣私幣 (BTCP)則提供隱私權,其他提供隱私權的虛擬幣還有 : 普維幣(PIVX)、門羅幣(Monero)、大零幣(Zcash)等。



所以話又說回來,當區塊鏈應用在企業的資訊系統上,「透明」與「匿名」的特性是看你如何應用的,例如你要把區塊鏈當成投票應用,你是可以設計成「不記名投票」,但是又具有透明的「防止作弊」功能。

區塊鏈到底長什麼樣子?

這個展示可以更清楚區塊鏈的樣貌 : https://andersbrownworth.com/blockchain/blockchain

如下圖,區塊鏈就是將區塊與區塊串聯起來,區塊2有個欄位(Previous Hash)指向區塊1的Hash,然後區塊3的Previous Hash再指向區塊2的Hash,如此一直下去。


上圖的Block就是區塊編號,Nonce就是該區塊的隨機數,Data就是該區塊的資料,Prev就是指向前面區塊的Hash,而區塊的Hash就是該區塊的哈希函數值。

什麼是隨機數(Nonce)? 什麼是哈希函數值? 區塊的資料要放什麼?

首先要解釋一下哈希函數(Hash),他是一個數學函數,假設Hash(x)=y,我們輸入x之後,會得到y,同樣的x會得到相同的y,但是你無法從y反推x是什麼?

例如比特幣 (Bitcoin) 使用的哈希函數叫SHA256,你可以透過線上的SHA256來感受一下 :


當你輸入 1,你會得到 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b

但是你無法從後者,去反推輸入是什麼?

SHA256(1) = 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b

SHA256的輸出是一串64位元長度的16進位的字串,並且不管輸入的長度多長,輸出永遠都是64位元長度的16進位字串。

上面Block 1區塊的Hash值就是把「區塊編號」、「Nonce」、「Data」串起來當成輸入,經過SHA256之後的輸出。也就是 ... 

SHA256(區塊編號+Nonce+Data) = Hash

當SHA256(1+1+空白) = bac6d67daf63c7a06bab569adeadab130d332ed4c870da314d87f6f1b4c8a409

SHA256(1+2+空白) = 6ee6b0c4aa8e6aaa369dfaee1379a59cec8797e7fc8ad1a358d57e1a87a1466d

一直累加Nonce到11316

SHA256(1+11316+空白) = 000015783b764259d382017d91a36d206d0600e2cbb3567748f46a33fe9297cf

你會發現當Nonce累加到11316時,輸出字串的前導出現0000,這四個零是這個展示區塊訂的,他規定當Nonce數值讓Hash出現0000,表示已經完成採礦,也就是得到正確的Hash字串。

以目前正式的加密貨幣來說,比特幣需要找到可以出現17個前導零的Nonce,乙太幣 (Ethereum) 是要找到11個前導零的Nonce,而且乙太幣使用不同的哈希函數 ~ Keccak-256。

其實Hash結果要有多少前導零,其實也不是重點,因為這只是一個「規則」範例,各個不同的區塊鏈可以有自己的「規則」。

這是Keccak-256的線上展示 ~ https://emn178.github.io/online-tools/keccak_256.html

所以你應該有觀察到,當「區塊編號」、「Nonce」、「Data」任何資料有改變的時候,區塊就變成粉紅色,並且Hash也不再維持四個前導零,表示這個區塊已經不正確了,後面的區塊也就全部串接不起來了。除非全部重新Mine去找到新的Nonce,並且後繼的區塊也要重新Mine一次。當然,實際運作中的區塊要全部找到新的Nonce,幾乎是不可能的事情,因此要變動區塊鏈中的資料也就「不太可能」發生。

之所以說「不太可能」發生,而不說「不可能」發生,是因為還是有機率發生,只是機率非常低。

現在知道什麼是Nonce(隨機數)的意義了,他就是挖礦要找的數值,讓哈希函數可以產生固定位數的前導零,至於要幾個零,就看這個區塊鏈的規定。當然越多前導零,挖礦就越困難。

那麼資料的部分要放什麼呢? 就看這個區塊鏈的功能怎麼規定,以比特幣來說,就是放交易資料,乙太幣來說可以是交易資料,也可以是智能合約之類的code。

以Python來模擬區塊鏈

我們現在以Colab跑Python來進行三個模擬 :

(1) 模擬哈希函數 https://andersbrownworth.com/blockchain/hash


這個模擬把Nonce輸入哈希函數,看看要得到四個前導零,需要哪個Nonce數值才符合? 結果得到88484,也就是要從Nonce=1一直試到88484次,才得到四個前導零的輸出字串。

(2) 模擬區塊 https://andersbrownworth.com/blockchain/block


這個模擬把「區塊編號」、「Nonce」、「Data」輸入哈希函數,看看要得到四個前導零,需要哪個Nonce數值才符合? 結果Data是空白的情況下,Nonce得到72608。

(3) 模擬區塊鏈 https://andersbrownworth.com/blockchain/blockchain


這個模擬產生三個區塊如下 : 

共識機制POW和POS有何不同呢?

PoW = Proof-of-Work 工作量證明機制就是讓大家在找出Nonce的過程中,看誰最快找到。

我們上面說過Nonce隨機數,就是找到後可以滿足形成區塊鏈。因此礦工就看誰的算力強,誰就有優勢,所以PoW機制就會讓大家很耗費資源。

PoS = Proof-of-Stake 持有量證明機制就是看誰持有較多的幣,就有更多的機會得到獎勵,所以你可以抵押加密貨幣來得到挖礦的機會。

比特幣與乙太幣就是使用PoW的代表,而乙太幣2.0就是使用PoS的代表。

另外還有一種DPoS (Delegated Proof of Stake 代理持有量證明),跟PoS類似,主要分別在於每位持幣人有權投票選出代理節點,由得票最多的若干節點負責生成區塊。DPoS引入了民主機制,持幣量少的人亦能參與投票,決定之後能生成區塊獲取獎勵的節點,以實現去中心化的目的。

關於PoW與PoS更多參考 : https://rich01.com/what-is-crypto-pos-0/


區塊鏈在企業系統上的應用有哪些?

區塊鏈在[農業]上的應用 : 

以上影片我們看到農產品的區塊鏈履歷,其實就是產銷履歷用區塊鏈技術來做。

區塊鏈在[供應鏈]上的應用 :

區塊鏈在[智能合約]上的應用 :


區塊鏈在[遊戲平台]上的應用 :


以各種應用來看,也都是利用區塊鏈的特性來應用,例如資料的不可竄改性、資料的透明性等。這些應用也沒有要將區塊鏈取代資料庫。


區塊鏈可以取代資料庫嗎?

既然區塊鏈可以安全的儲存資料,那麼可以取代資料庫嗎? 答案應該是 : 不會。

這篇文章"What Is a Blockchain?"提到 : 「A blockchain is a distributed database that is shared among the nodes of a computer network. One key difference between a typical database and a blockchain is how the data is structured.」

他說區塊鏈是一個分享在電腦網路節點的分散式資料庫,與傳統資料庫最不同的是資料的結構不同。

這樣的說法也沒有錯,區塊鏈技術「可以」做成分散式的資料庫,但是他的「結構」與「功能」與傳統資料庫不同。

目前來說,區塊鏈與傳統資料庫是可以互補,但是無法取代。因為區塊鏈有傳統資料庫做不到的事情,傳統資料庫也有區塊鏈做不到的事情。

這篇文章"以資料庫思維理解區塊鏈",對於區塊鏈與資料庫的比較說明的不錯,我們引用來討論區塊鏈是否可以取代資料庫的問題。

他說「區塊鏈這個東西的本質和資料庫技術非常相像,很多機制使用資料庫的理念去理解會非常直觀準確」。

沒錯,就是因為兩者很像,又有人以分散式資料庫來形容區塊鏈,所以很多人會認為區塊鏈就是資料庫,就會造成誤解。

最後這篇文章的結論是 : 「資料庫技術與區塊鏈技術的融合其實是大勢所趨」。

區塊鏈與資料庫可以融合嗎?

在網路上有很多關於區塊鏈與資料庫的討論,我們來看一下這篇討論"對於區塊鏈是分佈式數據庫的說法,有疑惑,區塊鏈不支持常規數據庫的檢索的吧?"。

原提問人說區塊鏈無法執行類似SQL語法,因此認為區塊鏈不是資料庫。這個說法其實是誤會資料庫的定義,因為不是可以執行類似SQL語法才是資料庫。資料庫是可遵循一套規範來產生、儲存及操作資料,就可以稱為資料庫,因此說區塊鏈不是資料庫,也不算正確。

有個CovenantSQL值得來研究一下,他宣稱是一個基於區塊鏈的 SQL 數據庫,也就是資料庫技術與區塊鏈技術的融合,我們研究後再來跟大家報告了。CovenantSQL參考資料 : 區塊鏈上的數據庫:CovenantSQL

再來看看這個 Blockchain-based database : 

The Blockchain-based database is a combination of traditional database and distributed database where data is transacted and recorded via Database Interface (also known as Compute Interface) supported by multiple-layers of blockchains. The database itself is shared in the form of an encrypted/immutable ledger which makes the information open for everyone. 

區塊鏈為基礎的資料庫,是一個傳統資料庫與分散式資料庫的組合,其資料交易及儲存以介面支援在多層的區塊鏈。這個資料庫本身是以加密無法竄改的帳本方式來分享,使得資訊對所有人開放。

這裡也提到,區塊鏈本身與傳統資料庫比較,並沒有查詢的功能。所以區塊鏈為基礎的資料庫,就是要具備傳統資料庫與區塊鏈的特性。

另外一個整合區塊鏈與資料庫的還有BigChainDB (中文參考 : 這裡),他是一個去中心化的資料庫,並且具備區塊鏈的特性。並且BigChainDB後續由IPDB Foundation接手整合,顯示整合各路資源的願景。

所以融合之後的區塊鏈資料庫,會對企業資訊系統帶來什麼影響呢? 就拭目以待了。


張貼留言

0 留言