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間接連結該區塊內的所有交易紀錄。

Cryptographic Basics

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) 礦工

    1. 主要任務就是透過不斷的增加顯卡、礦機等硬體設備去猜mining puzzle, 猜到了就取得記帳權,可以創造一個新區塊,並且會得到獎勵

    2. 當來自各個節點的用戶發出各種各樣的交易時,需要有人負責將這些進入memory pool的交易打包成一個個區塊,再發布到鏈上

    3. 收手續費:無固定數字,競價概念

  • 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 system

  • mempool.dat - where stores all unconfirmed transactions (unconfirmed by other nodes)

  • block.blk - where actual block is stored

  • index.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的錢包地址」為例,

  1. 錢包持有者發起一支交易,使用私鑰產生數位簽章和手續費,寄給一個 full node

  2. 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
  3. 礦工們(其他節點們)收到廣播,確認交易無誤,開始打包區塊,進行挖礦(猜nonce/solve puzzle),爭取這一區塊的記帳權。

  4. 取得記帳權者(最快完成PoW的節點)負責將交易批量打包成為一個個區塊(傾向選擇手續費高的交易優先打包),並廣播給其他節點,讓其他節點驗算

  5. 正式上鏈,等待數次交易確認(通常六次): 交易第一次被打包進區塊上鏈後,完成一次確認,該區塊的上頭產生又一個新的區塊,完成第二次確認…..以此類推,一般來說,完成6次以上的確認後,交易可以被視為幾乎不可逆的。

  6. ledger update respectively - your transactions won't be valid if you don't update your ledger

  7. 沒有取得記帳權的礦工們(節點們)的區塊就成了孤兒,要打散回到mempool

  8. 礦工取得該區塊所有的手續費以及額外 reward 作為獎勵

Bitcoin Script 應用 — MultiSig Address

Escrow — 單次付款

創造一個 N/M multi-sig address, 將錢轉到那個地址,接收者簽名取錢,escrow本人不簽名參與

→ 缺點: 不取錢的話那個錢直接卡在該地址中出不來

Micropayments — 儲值扣款 (預扣)

  1. Sender 創造一個 N/N multi-sig address, 將最終要付的錢先轉到那個地址

  2. 每消費一次,就再創造一筆支付從第一次以來的累計消費金額 &找零給自己的N/N multi-sig 的交易,保持不簽名

  3. 直到最後一次是全額,接收者再簽名取錢

→ 缺點: 不簽名取錢的話那個錢直接卡在該地址中出不來

locktime 優化 Micropayments

  1. 利用 locktime 欄位:在真正轉帳至 N/N multi-sig address 之前,先要求收款者寫一筆交易,當超過 locktime 時間並且此金額還沒有被支付時,從 MultiSig Address 中將該筆金額全數退給付款者

  2. 接著付款者再將錢轉到 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:

    1. Accepted

      新版本超過 95% (1916 blocks/2016 blocks) 的支持率

    2. Rejected

      沒有到達以上門檻,礦工們被拒絕之後可以選擇以下

    3. 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

有兩種情況:

  1. 已經連續挖到兩個塊,按捺著不上鏈,等出現某一塊時,立刻上鏈,孤立該塊,就可以讓真理站在你這邊:)

  2. 只挖到一個區塊,等某個區塊出來時立刻也上鏈,讓大家選擇,這時候有 alpha 的機率被選中

Cryptographic Basics

Premine

Last updated

Was this helpful?