[course] 不可錯過的時代趨勢:從自學區塊鏈到專家!
此篇為課程 不可錯過的時代趨勢:從自學區塊鏈到專家! 之筆記整理,非原創內容,資料來源可見下方連結與文後參考資料。
基本名詞與知識
幣
區塊鏈上的幣可以分成 Coin 和 Token:
- Coin 指的是改區塊鏈上的原生貨幣,像是比特幣或以太幣
- 一個區塊鏈只會有一種原生貨幣,又稱做同質化代幣(Fungible Token)
- 除了直接拿來交易外,也可以用來支付區塊鏈上的服務,例如執行智能合約需要支付以太幣
- Token 則是開發者在區塊鏈上創造的貨幣
- 一個區塊鏈上可以有多個不同的 Token,例如非同質化代幣 NFT(Non-Fungible Token)就是一種 Token
- 可以使用智能合約來創造 Token
- 除了可以用來支付外,也可以由開發者自訂附加功能
區塊(Block)
在區塊中會紀錄交易資訊,其中區塊內會包含:
- 上一個區塊的哈希值(Prev_Hash):目的是確保上一個區塊的資料沒有被竄改
- 當下時間(Timestamp):記錄區塊被確認的時間,並可用來作為各區塊間的排序
- 數筆交易資料(Tx_Root)
- 隨機數(Nonce):由礦工產生的隨機數,可用來確保區塊內的資料並沒有被竄改
區塊的概念很像是 Linked List 這種資料結構中的 Node。
// 範例:一個區塊的資料結構
{
"size": 43560,
"version": 2,
"previousblockhash": "00000000000000027e7ba6fe7bad39faf3b5a83daed765f05f7d1b71a1632249",
"merkleroot": "5e049f4030e0ab2debb92378f53c0a6e09548aea083f3ab25e1d94ea1155e29d",
"time": 1388185038,
"difficulty": 1180923195.25802612,
"nonce": 4215469401,
"tx": [
"257e7497fb8bc68421eb2c7b699dbab234831600e7352f0d9e6522c7cf3f6c77",
//... many more transactions omitted ...
"05cfd38f6ae6aa83674cc99e4d75a1458c165b7ab84725eda41d018a09176634"
]
}
區塊鏈(Blockchain)
將多個區塊以線型的方式連接成一個鏈,即稱作區塊鏈。可以進一步參考 Blockchain Demo 這個網站。
區塊鏈簡單來說就是記錄交易的去中心化帳本(distributed ledger)。
地址
在區塊鏈中使用的是非對稱加密,因此會有一組獨特的公鑰和私鑰:
- 使用公鑰來產生「地址」,地址也就是在區塊鏈上的身分
- 「地址」 + 「私鑰」 = 「錢包」
在非對稱加密中,我們將機密的內容使用公鑰加密、私鑰解密。公鑰可以給任何人,但私鑰是解密用的,因為不能外流。
冷錢包與熱錢包
冷錢包:
- 不能與公開網路接觸
- 可能可以另外上鎖
- 壞處是使用上不方便,且一旦遺失就再也找不回來
熱錢包:
- 與網路連接,使用上方便
- 壞處是可能受到攻擊
節點(Node):區塊鏈的參與者
比特幣是一個點對點的網路(Peer-To-Peer, P2P)
節點的數量決定該區塊鏈的去中心化程度
節點可以分成
節點種類 錢包 完整區塊鏈 挖礦工具 網絡工具 備註 範本節點(Reference Client) V V V V 包含節點的所有功能 全節點(Full Node) V V 願意無償提供服務 輕節點(Lightweight SPV Wallet) V V 使用服務,但僅願意付出較少,例如,錢包 礦工節點(Mining Nodes) 含部分區塊鏈 V V 參與的目的是為了賺錢,目的就是挖礦(認證每一筆收到的交易,產生區塊後發布,以獲得獎勵) - 錢包:讓節點可以持有與轉送貨幣
- 完整區塊鏈:可以查詢所有區塊鏈發生的事
- 挖礦工具:當有交易出現時,可以進行挖礦來產生新的區塊,以維護網絡的安全性
- 網絡工具:當有交易轉送到持有網絡工具的用戶手上時,該用戶即有義務要轉送給周圍的親友
留意區塊(block)和節點(node)的差異,區塊是礦工在挖的東西,而節點是網絡上的每一個可被連結的單元。
挖礦(Mining)
由於區塊鏈並沒有中心化的伺服器來處理交易,因此需要麻煩全世界的人一起來幫忙做這件事,並提供比特幣作為報酬,也就是說,挖礦是去中心化驗證區塊的機制:
- 成功挖到礦的機率非常小,但「第一個」挖礦成功的人即可獲得比特幣
- 挖:耗費電腦資源、電力和時間來驗證區塊
- 礦:驗證區塊後獲得的比特幣
挖礦就像是「比特幣系統出一道數學題,看哪一個礦工可以先解出這道題目」。
實際上來說,就是根據提供的交易資料(data),算出能產生合法(特定開頭)Hash 的隨機數(Nonce)。只有第一個成功找到該隨機數的人能獲得比特幣作為獎勵:
礦池(Mining Pool)
由於挖礦需要強大的運算能力,但如果只有一般的電腦,又想參與挖礦過程的話,其中一種方式就是和其他人一起合作挖礦,這種結合許多人來一起挖礦,挖到後互相分潤的情況,就稱作「礦池」。
哈希雜湊(Hash)
輸入資料後,透過 Hash function 能夠得到「固定長度」的結果(哈希值)
- 能用 input value 得到 hash value,但從 hash value 很難回推 input value
- 相同的 input value 會得到相同的 hash value;不同的 input value 亦不會有相同的 hash value
- hash value 的長度是固定的
透過哈希雜湊的特性,可以:
- 將資料做摘要
- 包含機密資料:因為很難從 hash value 反推一開始的 input value
- 確保資料完整性(沒有被竄改):只要 input value 被改變,必定會得到不同的 hash value
透過調整雜湊值的條件,可以影響挖礦的難易度(例如,雜湊的前幾碼需要符合幾個 0 作為開頭)。比特幣使用的雜湊函式時 SHA256(Secure Hash Algorithm 256)。
礦工實際在做的事情就是看 Nounce 要帶入多少時,能成功讓經過雜湊後的到的 hash value 是合法的
Hash(block) = hash value // 新的 hash value 必須要是合法滿足特定套件的
三角悖論(Triangular Dilemma)
任何區塊鏈主鏈都只能滿足下述三個條件中的其中兩個:
- 安全(security)
- 效率(efficiency):每秒能完成的認證交易
- 去中心化(decentralization):每個人都能參與、當節點並進行決策
越安全可能導致步驟越繁瑣,進而導致效率下降,同時可能限制了去中心化的程度(不是任何人都能加入與進行決策),其中比特幣和以太坊選擇了「安全」與「去中心化」,犧牲效率,因此每秒能完成認證的交易量(transaction per second)非常低。
以太坊(Ethereum)與智能合約(Smart Contract)
又被稱做第二代比特幣,且概念類似世界電腦,任何在鏈上的事情都需要由全世界參與的節點來共同決定(去中心化)。和比特幣主要的目的是在貨幣支付不同,以太坊可以完成各種程式邏輯,因此可以處理更多處理貨幣交易以外的事。
以太坊 v1.0 最大的問題在於 TPS(transaction per second)過低,因此未來的 v2.0 或其他的鏈都試圖解決以太坊的這個問題。
在以太坊上可以運行智能合約,雖然稱做智能合約(Smart Contract),但實際上智能合約並不智慧,也不像合約,而是可以在「合約」上定義好「一系列不能被更新的程式邏輯」讓其他人來執行。
在以太坊上:
- Get:單純查看區塊鏈上的資訊不需要 Gas(手續費)
- Set:修改區塊鏈上的資訊、發布交易需要 Gas
- 部署智能合約需要消耗 Gas
以太坊上的智能合約主要透過是 solidity 這個語言來撰寫。
實際的流程類似這樣:
- 使用 solidity 撰寫智能合約
- 部署撰寫好的智能合約,部署後會取得該合約與區塊鏈上的地址
- 可以對合約地址執行「發布交易(set)」或「查閱資訊(get)」的動作
所謂的「發布交易」並不表示實際上又貨幣上的交易,只是單單把某一個變數的值做修改也算是執行交易,因此這個交易的概念比較像是程式上 transaction 的概念。
其他
- ICO(Initial Coin Offering):相對於 IPO(Initial Public Offering)的說法,指的是區塊鏈項目的募資方式。股票市場是透過發行股票來進行募資,而虛擬貨幣的市場則是透過發行虛擬貨幣來達到募資的效果,讓支持該公司的人能夠先以較低的價格購買該公司發行的虛擬貨幣,待未來實際上到交易所(股市)後,讓大家可以自由買賣。
- STO(Security Token Offering):ICO 本身沒有任何法律保障,但 STO 是有監管機構介入,和真實資產有實質關聯後才開發行。
- 去中心化(Decentralization)
- 目前 99% 以上的交易量都是透過中心化交易所進行
實作
透過以太坊示範如何建立節點
以太坊的節點分為全節點(full node)和輕節點(light node),其中全節點需要消耗極大儲存空間,若單純只是想和區塊鏈互動,使用輕節點即可。
輕節點不能挖礦,但廣播交易(網絡工具),需要的話可以回頭參考「節點的分類」。
安裝 geth
Installing Geth @ Go Ethereum
# 透過 homebrew 安裝 geth
brew tap ethereum/ethereum
brew install ethereum
使用 geth
$ geth --syncmode "light" # 以輕節點的方式同步以太坊的節點
啟動後找到並複製 IPC Endpoint:
# 進入 Geth JavaScript console
# geth attach <IPC endopint url>
$ geth attach /Users/pjchender/Library/Ethereum/geth.ipc
> web3.eth.syncing # 檢視同步狀況
> web3.personal.newAccount() # 創建帳戶/錢包地址(可以不輸入密碼)
# "0x3788618647c580920ba24775a153d9c47fb0ba01"
> web3.eth.accounts # 檢視帳號/錢包地址
# ["0x3788618647c580920ba24775a153d9c47fb0ba01"]
使用 SHA256 加密資料與檔案
示範如何使用 Mac 中內建的工具 shasum 來做雜湊
# 確認電腦已經有裝工具
$ which shasum
# hash 字串
$ echo -n "hi" | shasum -a 256
# hash 一個檔案
$ shasum -a 256 "file.txt"
echo 如果沒有加上 -n
的話,預設會在最後加上換行符號。
參考資料
- 不可錯過的時代趨勢:從自學區塊鏈到專家! @ hahow