Bitcoin
TUM-BBSE notes and my own understanding
什麼是比特幣?
它是一個P2P的分散式交易網絡,目的就是希望能夠不要再依靠某個中心化的機構、組織來維持交易秩序,而是由所有參與的節點來維持。因此,它的設計具有:
Tamper-proof
Trust-free
Transparent
每個節點都能夠驗證每一個新的區塊、交易,以及current state
規則設計與現況
每 21萬個區塊,挖礦獎勵就會減半,從 50 BTC 開始,現在是 12.5 BTC
最終的最終會有 2100萬顆比特幣,不會更多了
現在平均每秒能跑 3-6 個交易,每小時能出 6 個塊
手續費單位:Satoshi/byte
基本資料結構
透過 prev: hash() 連結前一個區塊,透過 hash of merkle root間接連結該區塊內的所有交易紀錄。
Recap of Merkle Root 由下而上的hash, 所以只要掌握住root, 也就是最上層的地方,就可以掌握那一個區塊中的所有交易
nonce : 用於共識機制(consensus mechanism)
difficulty :用於控制區塊的產生速度,考慮最近兩週的產生速度和上一輪 2016 個區塊產生的速度,再進行相對應的調整,確保一個區塊仍然是每 10 分鐘產生一個。難度愈高,需要的算力也愈高,這代表著 target 也愈低(這樣範圍會愈縮愈小)
TX-0 : reward(transaction fee for miners), also the block height is hidden here, while it's also specified in the height field in the block header ⇒ coinbase transaction
創始區塊—Genesis block
根據source code, 沒有做任何交易,是以"獎賞(reward) - coinbase transaction"的形式發布的。
同樣也是根據原始碼,執行時會直接跳過創始區塊,所以裏頭的錢是無法進行交易的
前面是hash0
交易機制
一、分散式帳本keep status—俗稱 blockchain
Account-based ledger - NONO
根據每一筆交易不斷更新、追蹤每一個帳戶的balance, 最新的balance被稱為"world state"。再這樣的帳本設計中,帳戶可以轉帳任意金額,而不會去看這個帳戶的balance是否足以支付。而且持續追蹤每個帳戶balance非常耗時耗力。比如說在以太坊,每個帳戶的balance是跟著merkle tree被存在區塊中的。
Transaction-based ledger - 從找零機制理解
bitcoin源码解析 - 交易 Transcation (一)
以金流的角度去看,而非帳戶。
除獎勵以外,每一筆流出的交易都是在創造新的面額去"找零",每一筆流入的交易都是在處理掉舊的面額
Reward: 如果這筆交易是挖礦挖到了,那麼這筆交易就不會有流入,而是直接有新的幣被創造出來 - only Txout
編號:
#Tx[#Tx**out**], e.g. 1[1]第二筆交易的第二筆Txout會呈現樹狀圖 - 每"分裂"一次,就是一筆交易
Txin 通常是refer 到上一筆交易的某個Txout, 所以在
N[0]是input時,其實這個input所在位置是 Transaction N+1 and comes from the first output of Transaction N一筆交易中會有數個outflow, 包含剩下要留給自己的(餘額)都要做為outflow的其中之一send to change(零錢) address,逐漸累積成為unspent transaction outputs (UTXO)
針對這些UTXO,使用者可以consolidate (聚集成一筆),也可以數個parties集資變成一筆output
每一筆交易要嘛都成功,要嘛都失敗;每一筆交易中所有的input 和 output 總額會完全互相抵銷
Transactions are executed sequentially ( a classical database)
atomic
consistency preserving & checking whether the you do have this amount of money
integrity preserved
concurrency control
Txout 用於記錄現金流,並給這個交易上一個鎖(locking script)
Txin 則用於解開其對應的上一支 Txout 的鎖(unlocking script)
Burning money
If Txin > Txout, the transaction is valid ⇒ others can't be accessed by anyone else or as a reward to miners
Why burning money? like treasury, balance the supply of money in the market to manipulate the currency/stock price
二、組織運作&訊息傳播- Gossip Protocol
The basic network uses a peer-to-peer gossip protocol. Messages about new blocks or transactions are validated and then broadcasted. To prevent a second broadcast, the node keeps track of the transactions and blocks sent by itself.
How to find other nodes (bootstrapping)
IRC channel
hard-coded DNS service - point of attack
hard-coded seed nodes(connected with lots of nodes) (last resort)
Command-line provided addresses
Text-file provided addresses
addresses stored in a databased maintained manually(to be loaded after a restart)
How to sync the blockchain
How to send and receive transactions
send transactions after validating each transaction
receive transactions from wallet owners
How to send and receive blocks from neighboring nodes
腳色介紹
Wallet Owner(User)
wallet.dat同一錢包地址底下有多個不同的私鑰,而每個私鑰掌管著不同的UTXO,負責sending and publishing新交易給以下三者
Miner(Software) 礦工
主要任務就是透過不斷的增加顯卡、礦機等硬體設備去猜mining puzzle, 猜到了就取得記帳權,可以創造一個新區塊,並且會得到獎勵
當來自各個節點的用戶發出各種各樣的交易時,需要有人負責將這些進入memory pool的交易打包成一個個區塊,再發布到鏈上
收手續費:無固定數字,競價概念
Full node(Software) 完整節點
完整的帳本,負責verify every block it receives, 並作為新交易和區塊上鏈的總中繼站, validate and relay all transactions and blocks
Light node(Software)
可做為單一用戶的中繼站,負責verify單一用戶的交易是否正確被執行,等真的要發布到網路上時,仍然需要連接到full node。然而實際應用上幾乎沒有用到這個腳色。基本上 wallet owner 自己就是 light node, 自行驗證。
chainstate- LevelDB, where store UTXO of the whole systemmempool.dat- where stores all unconfirmed transactions (unconfirmed by other nodes)block.blk- where actual block is storedindex.db- where key hash and its corresponded location of the block on the disk
Management of keys are the main issue of a blockchain
Bitcoin 交易腳本
Bitcoin script
Bytecode - a sequence of instructions and data values, composed of operators of stack machine and operands to put on stack machine.
A transaction in Bitcoin doesn't specify directly the public key you're sending to, but the hash of public key(this is the exact identity)(P2PKH )
[scriptSig]()Why not developing a programming language for Bitcoin system? Unneccessary
三、實際運作(出塊、上鏈流程)
以「A主動轉帳給B的錢包地址」為例,
錢包持有者發起一支交易,使用私鑰產生數位簽章和手續費,寄給一個 full node
Full node/light node 驗證交易無誤,轉到 memory pool(transaction pool),並廣播到網絡中(此時還都是待確認交易
n/ unconfirmed) 1. 驗證方式:數位簽章是否能用公鑰解密,且用相同的演算法得到相同的哈希值 2. 交易內容驗證: 1. A屬於Txout, sender ; B 屬於Txin, receiver 2. A的轉帳內容中已經鎖定了B的錢包地址,因此A的腳本scriptPubKey提出了一些要求必須讓B的腳本scriptSig滿足,以驗證B就是該地址的所有者⇒`scriptPubKey` 是 locking script, `scriptSig` 是 unlocking script 3. `scriptSig` : 根據輸出腳本的要求,必須提供B的數位簽章及B的公鑰(地址所屬的那個) `<B_Signature> <B_publicKey>` 4. `scriptPubKey` : 根據 in 的提供,進行驗證 `OP_DUP OP_HASH160 <HASH_PK?> OP_EQUALVERIFY OP_CHECKSIG` <> -value, no <>-instruction 1. Compute and verify hash of public key through `OP_HASH160` and `OP_EQUALVERIFY` 2. Verify the signature through `OP_CHECKSIG` using the 2 values provided by `scriptSig` 3. Push true/error礦工們(其他節點們)收到廣播,
確認交易無誤,開始打包區塊,進行挖礦(猜nonce/solve puzzle),爭取這一區塊的記帳權。取得記帳權者(最快完成PoW的節點)負責將交易批量打包成為一個個區塊(傾向選擇手續費高的交易優先打包),並廣播給其他節點,讓其他節點驗算
正式上鏈,等待數次交易確認(通常六次): 交易第一次被打包進區塊上鏈後,完成一次確認,該區塊的上頭產生又一個新的區塊,完成第二次確認…..以此類推,一般來說,完成6次以上的確認後,交易可以被視為幾乎不可逆的。
ledger update respectively - your transactions won't be valid if you don't update your ledger
沒有取得記帳權的礦工們(節點們)的區塊就成了孤兒,要打散回到mempool
礦工取得該區塊所有的手續費以及額外 reward 作為獎勵
Bitcoin Script 應用 — MultiSig Address
Escrow — 單次付款
創造一個 N/M multi-sig address, 將錢轉到那個地址,接收者簽名取錢,escrow本人不簽名參與
→ 缺點: 不取錢的話那個錢直接卡在該地址中出不來
Micropayments — 儲值扣款 (預扣)
Sender 創造一個 N/N multi-sig address, 將最終要付的錢先轉到那個地址
每消費一次,就再創造一筆支付從第一次以來的累計消費金額 &找零給自己的N/N multi-sig 的交易,保持不簽名
直到最後一次是全額,接收者再簽名取錢
→ 缺點: 不簽名取錢的話那個錢直接卡在該地址中出不來
locktime 優化 Micropayments
locktime 優化 Micropayments利用
locktime欄位:在真正轉帳至 N/N multi-sig address 之前,先要求收款者寫一筆交易,當超過locktime時間並且此金額還沒有被支付時,從 MultiSig Address 中將該筆金額全數退給付款者接著付款者再將錢轉到 MultiSig Address 進行原 Micropayments 流程
比特幣的儲存
It's all about storing and managing secret keys.
要考慮三個方向: 安全性、方便性和易取得性,主要分為hot storage和cold storage. 前者較為方便,可以立刻取得並使用,通常存在PC或手機中;後者是離線存取,通常需要時間激活,更加安全但不太方便。舉例而言,可以存在硬體設備(如USB),紙上,brain wallet,或是讓第三方交易所幫你儲存你的比特幣,私鑰則仍然掌握在你手上,但這樣的方式除了只能在該交易所上進行交易以外,也較難防止駭客竊取你的比特幣。
引入新區塊 - Bootstrapping nodes
PoW 工作量證明 = 挖礦
Facilitates search puzzle. (強化 search puzzle)
我認為並非一個具體的機制,而是一個概念:算力愈高,愈容易取得獎勵,愈容易出塊。這樣的機制促使過度無謂的能源消耗、軍備競賽、極高的投資成本、以及更高的攻擊成本( 51% attack )。這也促使礦工們的身份在區塊鏈中保持匿名。
挖礦 - Search Puzzle 應用
一種針對該系統的獎勵機制,其實就是之前在討論 hash functions 時的其中一種應用 — Search Puzzle
我們可以大概理解為將版本號、上一頁的哈希值、交易地址、更新時間、當前難度與一個隨機數進行 SHA-256 函數運算。
SHA-256 函數運算(Secure Hash Algorithm 256)可以將任何長度的字符串,透過加密得到一個 64 位 16 進制的數。
任務:猜出 nonce
目標:hash ( latest block's hash || latest transaction data || nonce) ≤ target
這個 hash function 通常是 SHA-256
target - 256 bit hash value shared by all nodes
difficulty - target愈低 (前導 0 愈多個),difficulty 就愈高 https://en.bitcoin.it/wiki/Difficulty
Formula: two weeks/the time last 2016 blocks took = F
If F > 1 → 最少難度要增加 0,25
If F < 1 →最多難度可增加 4
Coinbase transaction — 取得獎勵的那筆交易,所以只有 Txin , 沒有 previous Txout
內容物:區塊高度(比特幣而言)和任意 100 bytes 的交易 input (
scriptSig)
Mining pool 礦池
動機:隨著挖礦難度上升,單人愈來愈難以靠自己的算力挖到幣,因此礦工們決定集資一起挖礦,組成礦池
礦池由 pool manager 管理(是機器)
Pool manager ( Tx0 ) 會先針對每個區塊高度提出 block prototype ,並記錄每個礦工的貢獻度(算力),最終根據貢獻度分配得到的獎勵
算力 = hash rate:每秒運算的 hash 數量
Protocol update 協議更新流程
Design
是改到哪一個層面?
Layers
Consensus layer
Peer service layer
API/ RPC layer
Applications layer
Hark fork 以前不OK的現在OK了 (更寬鬆)
Soft fork 以前OK的現在不OK了 (更嚴苛)
Signaling
Miners vote
每個提案會提供一個 reference implementation ,編號上則是會有一個 32bit 的 version field (29 for the proposal, 3 for the version). 每個作者在其中挑選一個 bit, start time and end time.
如果這個礦工支持這個提案,就去更新成這個提案,這時候他這個節點的軟體會用相對應的 bit 去發出訊號以示支持
Acceptance
Results:
Accepted
新版本超過 95% (1916 blocks/2016 blocks) 的支持率
Rejected
沒有到達以上門檻,礦工們被拒絕之後可以選擇以下
Chain split - Ethereum
當支持度有到達 50%, 才可以分裂,否則會難以成功(因為主要的算力不在他們這裡)
Double Spend 雙花 — UTXO
Txout 實際上由 UTXO 組成,而交易中所有用到的 Txin 會全數轉為 UTXO,無論是給別人還是給自己。一個UTXO 選入區塊後只能被兌換一次, 這樣可以避免鏈上的雙花攻擊;但未被選入區塊前是可以無限次使用的,因此這個部分,根據白皮書規定,就是搶快 — 先上塊被確認的那個交易就先成功。
Day25|現實中的區塊鏈(2):Bitcoin與Ethereum的交易架構 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
Replay Attack 重放攻擊
問題: 有交易在兩個鏈上都可以使用,因此有節點惡意在上面重復發送相同的交易 e.g. "轉帳3個幣給自己"
發生情況: Hard fork
解決方案
在新分叉的交易上做註記,和舊交易做出區別
官方設定安全協議
Attack
51% Attack
當某個人的算力已經達到 51% 時,就可以為所欲為,任意選擇對自己有利的交易上鏈,因為每一個區塊都是它挖出來的,他握有打包交易的權利。這樣可以排除異己
Selfish-mining Attack
有兩種情況:
已經連續挖到兩個塊,按捺著不上鏈,等出現某一塊時,立刻上鏈,孤立該塊,就可以讓真理站在你這邊:)
只挖到一個區塊,等某個區塊出來時立刻也上鏈,讓大家選擇,這時候有 alpha 的機率被選中
Last updated
Was this helpful?