# Bitcoin TL;DR ###### tags: `Study` `Blockchain` :::danger 本區討論僅作為本人吸收後的摘要,故只會有大略描述,詳細內容仍得看藍色連結。 ::: --- ## 查詢關鍵字 `P2PK` `P2SH` `Pruning` ## 相關討論 :::success ::: ## 什麼是 Pay-to-Script-Hash ? ### 太多自己看: :::info * https://learnmeabitcoin.com/glossary/p2sh * https://en.bitcoin.it/wiki/Pay_to_script_hash ::: ## What is Lightning Network ? :::info * https://en.wikiversity.org/wiki/Revocable_Sequence_Maturity_Contracts * https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts * https://github.com/moneybutton/yours-channels/blob/master/docs/yours-lightning.md * [密碼龐克](https://cypherpunks-core.github.io/markdown/resources/resources-ln/) ::: ### Revocable Sequence Maturity Contracts (RSMC) * 屬於一種 Bitocin 上特殊的 script ,可以允許 sender 在一定時間後退款,或者在收送雙方同意的情況下花費,算是一種合同。 * 下方為 Bob 要轉帳給 Alice 的範例之 `scriptPubkey` : ``` OP_IF 144 OP_CECKSEQUENCEVERIFY OP_HASH160 <Bob's public key hash> OP_EQUALVERIFY OP_CHECKSIG OP_ELSE 2 <Alice's public key><Bob's public key> 2 OP_CHECKMULTISIGVERIFY OP_ENDIF ``` * Bitcoin 中,要確認一筆 UTXO 是否可以花費,需要看其 `scriptSig`+`scriptPubkey` 的計算結果是否為 `True` 。 * Bob 可以再經過 144 個區塊高度後,透過提供 `scriptSig`=`<sig><publicKey><public key>` 來使用這筆 UTXO 。 * 計算如下 : | Stack | Script |Descript| | -------- | --------|-------| | `<sig><publickey><publickey>` | `144 OP_CECKSEQUENCEVERIFY OP_HASH160 <Bob's public key hash> OP_EQUALVERIFY OP_CHECKSIG` |檢查是否 超過 144 個區塊了| | `<sig><publickey><publickey>` | `OP_HASH160 <Bob's public key hash> OP_EQUALVERIFY OP_CHECKSIG` | 將 public key 做 hash | | `<sig><publickey><publickey_hash>` | `<Bob's public key hash> OP_EQUALVERIFY OP_CHECKSIG` | 比較兩者的 hash 是否相等 | | `<sig><publickey>` | `OP_CHECKSIG` | 檢查簽章是否正確 | |`True`||成功| * 同樣的, Alice 與 Bob 可以一起提供各自的 signature 來使用此 UTXO 。 ### Hash Time Locked Contracts (HTLS) * Hash Lock : * 讓不同鏈之間可以達到跨鏈交易。 * 保有 **Atomic swaps** 的特性。 * 需要 **Timeout** 以避免卡住。 * 速度緩慢,交易確認至少需要 6 個區塊。 ![](https://i.imgur.com/qbAC0fl.png) * HTLS 用於 lightning network 間的 p2p channel : ![](https://i.imgur.com/o4CN4fk.png) ## Merkle Tree 在 SPV 裡是如何被驗證 ? :::info * http://countchu2.blogspot.com/2017/03/bitcoin-block-merkle-tree.html ::: * 輕節點只會儲存區塊鏈上的 block header ,並且透過 SPV 來證實「某筆交易的存在性」。 * SPV Proof 的要件有 Merkle Tree hash 、 transaction 與 transaction 在 Merkle Tree 中的 index 。 * SPV Proof 的流程 : (Merkle Tree hash 存在 Block header) 1. 輕節點將 `(transaction, block header)` 交給全節點來請求驗證該交易使否存在。 2. 全節點確認存在後,將 `(transaction, Merkle Path)` 交還給輕節點。 3. Merkle Path 即是輕節點做 SPV Proof 時所需的東西,例如: transaction index 、 subling hash 等。 4. 輕節點由於**不信任且不必信任全節點**,所以還會再用 SPV Proof 來檢查該交易是否存在於該 Merkle Tree 。 ## Bitcoin 挖礦成功後如何給予礦工獎勵 ? :::info * https://blog.cex.io/bitcoin-dictionary/coinbase-transaction-12088 * https://bitcoin.stackexchange.com/questions/40655/coinbase-transactions-100-block-cooldown-period ::: * 每個挖出來的區塊的第一筆交易就是給予礦工的獎勵,稱為 ==Coinbase transaction== 。礦工之後可以使用此交易的 Output 進行花費。 ![](https://i.imgur.com/UkUeyM4.png =600x) * Coinbase transaction 的 Output 在沒有==被 100 個區塊給驗證==之前是無法花費的,為的是避免 reorganization 的發生。 * 挖礦獎勵會隨著每 210,000 個區塊砍半,目的是為了避免通貨膨脹。 ## 什麼是 Bitcoin 的擴容方案 Segregated Witness ? * https://hackmd.io/@ofAlpaca/segWit ## Bitcoin 只有 Majority 是不夠的 :::info * https://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf ::: * 本論文提出了一個 **selfish mining** 的策略。 * 由於自私挖礦的礦工所擁有的算力是少數,因此**無法一直讓私鏈維持在最長鏈**。 * 為了將其他誠實礦工的算力給分散,所以惡意礦工會選擇性地發布一些私鏈的區塊讓他們接,令他們**浪費算力在不會成為主鏈的區塊上**。( Bitcoin 的 reorganisation 是兩個 ? ) * 這時惡意礦工就有機可乘,可以將自己過去挖好的區塊公佈出去,**使誠實礦工切換主鏈**。 * 根據論文內容,最後證實只要超過整體 $1/3$ 的惡意礦工就可以攻擊成功,換句話說,需要至少 $2/3$ 的誠實礦工才可以防止。 * 當至少有 $1/4$ 以上的惡意礦工在 selfish-mining 時就可獲利。 * ==誠實礦工只有 Majority 是不夠的==。 ## 為何 Bitcoin 要設定平均每 10 分鐘出塊 ? :::info * [Bitcoin wiki FAQ](https://en.bitcoin.it/wiki/Help:FAQ?source=post_page---------------------------#Why_do_I_have_to_wait_10_minutes_before_I_can_spend_money_I_received.3F) * https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time/ ::: * 主要目的是為了避免當區塊產生後,其餘礦工仍浪費算力在產出舊的區塊上。 * 令 $t$ 為 Block transmit time (區塊傳到其他所有礦工所需時間) , $T$ 為 Block interval (區塊產生平均時間), `Stale rate` 也就是礦工浪費算力的比率是 $t/(T+t)$ 。 * Bitcoin 設定平均 10 分鐘出一區塊,為的就是減少礦工浪費算力,同時也盡量避免造成分支的產生 (fork) 。 * 假設 $t$ 為 1 秒, $T$ 也為 1 秒,那此系統的 `Stale rate` 為 $0.5$ ,換句話說,任何礦工都有 50% 的概率是在做白工的。 * 因為一旦有人算出了第一個合法區塊,那其他人做的都會被忽略掉。 * 倘若把 $T$ 提高至 24 秒,那 `Stale rate` 變為 $1/(24+1)=0.25$ ,任意礦工就只剩下 25% 的機率在做白工。 ## 為何 Bitcoin 要以 6 個區塊作為確認 ? :::info * https://en.bitcoin.it/wiki/Confirmation * https://bitcoin.org/bitcoin.pdf ::: * 以統計角度來講, 6 個區塊的確認可以使 double-spending attack 的成功機率降到 0.1% 。 * 詳細看 bitcoin paper 的 section 11 裡的實驗。 * 前提是當惡意攻擊者的算力不足全網的 30% ,如果惡意攻擊者的算力提升了,那確認區塊數也需要增加以維持相同的安全性。 * 6 個區塊的確認以大數來說會需要 60 分鐘, 60 分鐘是接近 99.7% 都可以挖出區塊。 ![](https://i.imgur.com/2KSoKfz.png =500x) ## Bitcoin Reclaim Disk Space :::info * https://bitcoin.org/bitcoin.pdf > Section 7, Recaliming Disk Space ::: * 由於 Bitcoin 是 UTXO-based 區塊鏈,已經被花費 (spend) 後的交易即可被刪除,對系統不再有影響。 * Block header 都只存 root hash ,交易的資料都是放在 block header。所以基本上 data pruning 都是對 block body 來做。 * 如下圖,在刪除 transaction 0~2 之後,只需要留下其相對應的 Merkle tree hash 即可,交易本身可刪去。 * 「實線」為儲存在 block 裡的內容。 * 「虛線」為透過計算所得到的資料。 ![](https://i.imgur.com/DMMzXAP.png) ## Bloom filter on SPV proof :::info * http://countchu2.blogspot.com/2017/03/spv-nodebloom-filter.html * https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki ::: * 一般錢包 (SPV node) 要驗證餘額,通常有三種方式: 1. 下載所有區塊鏈的資料後自己查看。 2. 錢包將記載的 UTXO 全部交給 full node 來查找。 3. 錢包透過 bloom filter 記錄 UTXO 後再交由 full node 查找。 * SPV node ,可能也是 wallet ,會記載目前使用者的 UTXO ,透過這些 UTXO 產生 bloom filter 後將其交給 full node , full node 會使用此 bloom filter 去篩選區塊鏈上的交易。最後 full node 會在將==通過 bloom filter 且尚未被花費的交易==回傳給 SPV node 。 * bloom filter 會有 false positive 的狀況發生,所以回傳回的 UTXO 不全然是 SPV node 的,故可以保障一定程度 SPV node 的隱私。