疫情期間,大家盡量避免有所謂的「連結」(至於是什麼樣的連結我們就不討論了😅)。一旦事物連結在一起通常就很難去破壞...。
說到連結,今天想跟大家來看一看所謂的區塊鏈(Blockchain),以及常常一起提到的比特幣(Bitcoin)。
如果不是因為工作或是本身興趣/投資的話,是否像我一樣長期以來一直似懂非懂(其實就是不懂),但又想稍微了解一下這些聽起來很夯的名詞?
先說,我不是Blockchain或是Bitcoin的專家,所以如果有需指正的地方請不吝指教 🙂。
比特幣(Bitcoin)
首先從比特幣開始說起吧。比特幣是所謂的虛擬加密貨幣(Cryptocurrency),就像一般的貨幣,但只能透過電子的方式進行交易(比較像信用卡的概念),沒有像鈔票或硬幣這種實體。
它有身為貨幣的價值,因此也有匯率可用來交易其他國家的貨幣(一個比特幣在我寫這篇文章的時候價值約39,900美金)。
Bitcoin是在2008年被一個(或是一群)署名Nakamoto Satoshi(中本聰?)的人所發明的,更詳細的故事可參考Wiki。先說,我們不會評論比特幣或是其他加密貨幣的投資價值,純粹是以學習的角度來認識這些科技跟機制。
為什麼會有比特幣?
重點是,為什麼會想到Bitcoin這種東西呢?
來看個百分之百虛構的比喻吧~😎
有個遙遠的國家叫撒錢國,喔,不是....是沙前國。這個國家的人民使用沙前幣在做買賣交易。人民每天辛勤工作賺沙前幣,並將錢存在銀行,過著知足和平的的生活。
然而,沙前國的王子好賭成性,有一天在賭場輸了好多錢。沙前國王子面對巨大的負債,靈機一動,叫央行印很多很多的沙前幣給他用。然後,又叫銀行的高層竄改帳戶的資料庫把他的戶頭的錢加倍。
結果,人民發現東西越來越貴,手邊的錢可以買的東西越來越少,錢的價值越來越薄 😢。
這時,為了阻止沙前國的中央權力暴走,有個人叫王聰聰有了一個想法:
「我們不能讓政府或銀行這種特定機構來管理我們的錢!我們要全民監督,大家一起管😡!」
「要怎麼大家一起管?一直以來都是銀行在幫我們做記帳啊。」人民問。
王聰聰想到一個辦法:「我們來創造一個叫比比幣的錢💲,這種錢的所有交易紀錄都是線上公開透明,大家隨時都可以看到所有的交易紀錄。」
「而且,為了不讓有心人士有機會竄改任何一筆交易紀錄,交易紀錄之間用密碼來做連結。這些密碼還不是一般的密碼,而是利用交易紀錄內容產生的密碼,因此一旦內容有變,產生出來的密碼就對不上了。」
「那交易發生的時候,總要有人來認證吧?如果有人故意用同一筆錢重複交易怎麼辦?沒有中央機構要如何來防止這件事?」人民問。
「這樣吧,我們開發一道機制讓大家一起參與認證,想要認證的人必須解開一道艱難的數學問題。這個數學問題必須要花很多很多的時間跟精力。然後,每次有一筆交易完成後,所有人都會得到一份拷貝。這樣一來,不但可以增加壞人想竄改資料的難度,也利用認證來確保資料的正確。解開數學問題的人就有資格將交易紀錄加入資料庫,作為獎賞,他可以分到一些比比幣!」王聰聰說。
大家接受了王聰聰的想法,而且相信這個比比幣是有交易價值的,於是比比幣就開始在沙前國流行起來。而且還傳開到其他王國,越來越多人為了賺比比幣而去參與交易認證過程(解數學題)。...The End
OK,上面的故事簡單的提到了幾個重點...
傳統的貨幣,也就是錢💰的概念,是透過政府及銀行這樣的中央權力機關來管理(英文稱之為Centralized)。但是,有固定的人或團體來管,就會產生舞弊的可能。
像比特幣這樣的加密貨幣,沒有特定的人或團體來管理(稱之為Decentralized)。所有的紀錄都是公開透明的,基本上是所有人一起平等參與監督的概念(這樣的一個網絡稱為Peer to Peer Network)
交易紀錄儲存的方式,是利用特殊的演算法(稱之為hash)根據紀錄內容做出一串密碼,每個交易紀錄都有一個欄位指向上一筆交易紀錄。因此形成一個鎖鏈的概念,駭客沒辦法輕易去竄改其中任何一筆交易紀錄。(每筆交易紀錄稱之為Block。這個就是所謂Blockchain的資料結構)
交易的認證是由解開數學問題的人來擔任,稱之為Proof of Work,作為報酬,他可以拿到一些比特幣。這也就是所謂的挖礦(Mining )⛏。
Blockchain機制
接著上面的比喻及重點,我們現在終於來到了Blockchain。讓比特幣這樣的概念能夠實現,靠的就是Blockchain這個技術。
Blockchain是一種資料庫。透過hash函數將每一筆資料(Block)加密,而且每一筆資料中含有指向前一筆資料的hash。所有的資料就像被鎖鏈串在一起的資料結構。
每一個Block通常擁有下面幾個主要的屬性:
timestamp:紀錄發生的時間
transaction/data:主要的資料內容(例如sender, receiver, 數量等)
previous hash:上一個block的hash值
hash:block本身的hash值
儲存在Blockchain裡的資料非常難被更改。如果今天其中一個Block被改變,就會使hash值被改變,造成鎖鏈的不連貫。
除非,你把所有的Block的hash都重新算過一遍來產生新的連結 😱。
而Blockchain為了確保有這樣的事不會發生(真的是小心再小心),透過Proof of Work這樣的機制(記得我們剛剛說的解數學難題),讓產生一個新的block這件事變的很困難,更遑論將所有的blocks全部更改!
大家聽過所謂的比特幣挖礦(bitcoin mining)吧?
挖礦這個名字說實在話是蠻誤導的,其實它真正的目的就是將block加到blockchain的認證過程。需要用到大量的電腦計算,透過不斷的嘗試(trial and error)來解題,因此被稱為挖礦,這個過程消費相當多的電力⚡️。
Python模擬
接下來作為參考,我們試試看用Python來模擬簡易版Blockchain的過程,順便幫助我們理解 🙂。
參考來源:https://www.activestate.com/blog/how-to-build-a-blockchain-in-python/
首先來定義Block的class:
Block的基本構成是交易內容(transactions),交易時間(timestamp),上一個block的hash。至於nonce我們等一下會再討論。
make_hash的method,在物件生成時還不會用到。這個會等到Proof of Work成功後才會產生,等一下會再看到。
接下來是重點的Blockchain的class:
Code有點長,基本上幾個重點就是:
_create_genesis_block:在Blockchain生成時,自動產生第一個始祖block
add_transaction:將交易紀錄裝入待認證的list
mine:處理待認證資料主要的認證過程,透過Proof of Work(解題)得到的答案(hash)將成為新的block的hash
add_block:將block加入blockchain。在此之前會當中會確認之前的hash是否符合
接下來定義Proof of Work:
這裡的Proof of Work就是模擬解題的過程,例如說:
題目的破關條件是block的hash值的前兩碼為"0"。
根據目前的block內容,用.make_hash來計算出初期hash值。
如果算出來的hash值不符合破關條件,將.nonce增加1 (藉此來改變hash值)
重複上述(3)直到符合破關條件
這裡我們再加一個小幫手功能讓我們可以檢視整個blockchain:
OK!萬事具備,接下來就是執行blockchain的過程了!
這裡我們單純將新的交易內容加入blockchain的物件中,然後用.mine()來做交易的認證並加入blockchain。
利用get_chain,我們看到blockchain裡現在有兩個blocks。除了第一個初始的block(genesis block),我們還加了一個新的block。這個新的block有previous_hash指向第一個block。有看到nonce是220嗎?在這裏代表這一個block試了220次才破關。
我們可以利用同樣的過程不斷將新的交易加入blockchain,形成延續的鏈鎖,並確保資料的安全性及不可變性!
結論
今天透過了比特幣簡單的了解一下blockchain的技術,內容涵蓋了:
什麼是比特幣
為什麼是比特幣
Blockchain的機制
利用Python模擬Blockchain
現在我們知道,Blockchain技術主要解決是中央權力機構所帶來的問題(decentralization)。優點是去除人為的因素造成的舞弊。但缺點是效率不好,又很費電⚡。
今天,除了加密貨幣外,Blockchain也被應用在各個產業及公司,可參考這篇文章。
如果大家有興趣想了解更多關於Blockchain或比特幣的話,可以參考以下連結:
希望有幫助到有興趣的朋友喔!
Commentaires