跳至主要内容

[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)VVVV包含節點的所有功能
    全節點(Full Node)VV願意無償提供服務
    輕節點(Lightweight SPV Wallet)VV使用服務,但僅願意付出較少,例如,錢包
    礦工節點(Mining Nodes)含部分區塊鏈VV參與的目的是為了賺錢,目的就是挖礦(認證每一筆收到的交易,產生區塊後發布,以獲得獎勵)
    • 錢包:讓節點可以持有與轉送貨幣
    • 完整區塊鏈:可以查詢所有區塊鏈發生的事
    • 挖礦工具:當有交易出現時,可以進行挖礦來產生新的區塊,以維護網絡的安全性
    • 網絡工具:當有交易轉送到持有網絡工具的用戶手上時,該用戶即有義務要轉送給周圍的親友
提示

留意區塊(block)和節點(node)的差異,區塊是礦工在挖的東西,而節點是網絡上的每一個可被連結的單元。

挖礦(Mining)

由於區塊鏈並沒有中心化的伺服器來處理交易,因此需要麻煩全世界的人一起來幫忙做這件事,並提供比特幣作為報酬,也就是說,挖礦是去中心化驗證區塊的機制:

  • 成功挖到礦的機率非常小,但「第一個」挖礦成功的人即可獲得比特幣
  • 挖:耗費電腦資源、電力和時間來驗證區塊
  • 礦:驗證區塊後獲得的比特幣
提示

挖礦就像是「比特幣系統出一道數學題,看哪一個礦工可以先解出這道題目」。

實際上來說,就是根據提供的交易資料(data),算出能產生合法(特定開頭)Hash 的隨機數(Nonce)。只有第一個成功找到該隨機數的人能獲得比特幣作為獎勵:

mine

礦池(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 這個語言來撰寫。

實際的流程類似這樣:

  1. 使用 solidity 撰寫智能合約
  2. 部署撰寫好的智能合約,部署後會取得該合約與區塊鏈上的地址
  3. 可以對合約地址執行「發布交易(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

# 進入 Geth JavaScript console
# geth attach <IPC endpoint 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 的話,預設會在最後加上換行符號。

參考資料

Giscus