-
Notifications
You must be signed in to change notification settings - Fork 1
Bitcoin
- Bitcoin 電子貨幣 (Bitcoin: A Peer-to-Peer Electronic Cash System)
- 英文: Bitcoin
- 貨幣符號: 英文縮寫為 BTC 或 XB
- 例: 100 BTC = 100 個比特幣
- 比特幣的產生, 每隔四年會調整一次獎勵貨幣數量
- 目前的比特幣總數: Total Bitcoins
-
Controlled supply
- first 4 years: 10,500,000 coins
- next 4 years: 5,250,000 coins
- next 4 years: 2,625,000 coins
- next 4 years: 1,312,500 coins
- 第一個四年, 採礦獎勵為 50 BTC, 又約每十分鐘產生一個區塊
- ((60 * 24 * 365 * 4) / 10) * 50 = 10512000 即第一個四年產生的比特幣總數
- 比特幣的單位
- 1 BTC = 1 比特幣
- 0.01 BTC = 1 cBTC = 1 分比特幣 (Bitcent)
- 0.001 BTC = 1 mBTC = 1 毫比特幣 (mbit, millibit, bitmill)
- 0.000001 BTC = 1 μBTC = 1 微比特幣 (ubit, microbit)
- Satoshi, 比特幣的最小面額
- 1 Satoshi = 0.00000001 BTC
- 採礦: 將待確認的交易資料放到區塊中 (全球帳本)
- Client 取出區塊鏈最後一個區塊內容, 計算 hash 值
- 從廣播中, 將未記錄在區塊中的交易, 逐筆驗證, 並放入到的區塊
- 任意猜一個 nonce
- 將前一個區塊的 hash 值, 未記錄的交易資料, nonce, 計算一個 SHA-256 的雜湊值
- 如果雜湊值的前幾個數具有連續 n 的 0, 表示解決難題, 找到新的合法區塊
- 將找到的新區塊以及找到的 nonce 廣播出去, 讓其他節點也能夠驗證
設計機制:
- Public key
- Hash
- Merkle tree
- Blockchain
- Proof-of-Work
- Double spending 解釋
- Mining in Creating Network Consensus on the Blockchain
- Softfork/Hardfork
特點
- 去中心化
- 全世界流通
- 專屬所有權 (私鑰)
- 低交易費用
- 沒有隱藏成本
- 比特幣不是完全匿名
- 具實驗性
- Just Enough Bitcoin for Ethereum 簡潔運作摘要
- Ethereum: Bitcoin Plus Everything
- Ethereum white paper
- Bitcoin fee
- 51%攻击的成功概率和时间
- 比特幣的祕密
- 學習比特幣
- XBT.HK
Bitcoin 指系統協定, bitcoin 是貨幣單位
Since Bitcoin is both a currency and a protocol, capitalization can be confusing. Accepted practice is to use Bitcoin (singular with an upper case letter B) to label the protocol, software, and community, and bitcoins (with a lower case b) to label units of the currency.
So, the accepted usage in your example would be "3 bitcoin" and the "Bitcoin protocol".
必須透過採礦 (Mining) 解決一個工作證明 (PoW), 當礦工找到一個有效的區塊後, 傳遞至分散式網路, 等到至少有 6 個確認 (~1 hour), 即可確認這個區塊是合法的. 工作證明的難度, 建構在密碼學與機率的基礎上, 掌握 51% 以上的計算能力, 只是說明攻擊者成功竄改區塊鏈的機率較大. 而工作證明的高難度, 保證了區塊的合法性, 確認主要是驗證該礦工是否真的解出難題, 1 個確認其實已足夠, 但因為在分散網路下, 區塊傳遞有延遲, 可能同時有兩個礦工一起解開難題, 或是有 Selfish Mining 的問題存在, 因此多個確認較為保險, 鏈越長越難竄改.
交易內容進行兩次 SHA256 的結果
- 在一個荒島上, 如果只有一個人, 他有一只太陽能手錶, 那麼他就是荒島上唯一的時間標準, 他也沒必要和其它人對時
- 在一次軍事行動之中, 長官要求隊員在2014年7月1日早上10時正發動攻擊, 時間以長官的手錶為準. 因此隊員需要先和長官對時
- 在商業上, 張三和李四簽訂合約, 於2014年7月1日早上10時正前必須完成交易. 因於雙方關係平等, 他們協定以香港天文台的時間為準
- 在這個論壇發言所顯示的時間, 都是是論壇主機時間為準, 不受發言者電腦時間的影響
在上述的例子, 都有一個中心化的時間標準. 中心化的好處是容易管理, 但缺點是如果這標準出錯, 甚至刻意發出錯誤時間, 所有依賴這標準的人都會出錯.
然而Bitcoin是去中心化的, 其中一個後果就是沒有人能成為時間標準. 當一個礦工挖出一個有效區塊, 這區塊需要數秒甚至數分鐘才能傳播到整個網絡, 所以要核實區塊的真實產生時間是不可能的, 我們只能相信礦工所聲稱的時間, 也就是區塊的timestamp; 但timestamp的時間有可能是超前於真實時間的, 因此Bitcoin協議容許後來的區塊timestamp先於之前的區塊. 但無論如何, 一個區塊的timestamp必須大於過去11個區塊timestamp的中位數. ( 詳見: https://en.bitcoin.it/wiki/Block_timestamp )
這做法確保了只要大部份礦工是誠實的, 區塊的時間大致上會和真實時間相符; 即使個別礦工不當地用了過大的timestamp, 後來的礦工都有機會修正. 如果硬性要求後來區塊的時間必須大於上一區塊, 只要一個惡意礦工就能操控了整個區塊鏈的時間.
但請注意, 須然後來區塊的timestamp可以小於之前的區塊, 但區塊出現的先後次序卻是不會改變的: 這是因為每一區塊必包括上一區塊的hash, 而這個hash只有在上一區塊找出來後才會知道. 也因為如此, 不論timestamp是什麼, 交易的先後次序是由區塊的先後次序所決定.
計算Bitcoin地址, 需要多種運算, 首先是一次ECDSA, 然後是一次SHA256, 最後是一次RIPEMD160. 論計算量, SHA256和RIPEMD160差不多, 但ECDSA卻遠超這兩者. (檢查碼的運算並非必須, 所以不用考慮.)
為方便估計, 我們假設計算一個私鑰需要3倍SHA256的計算量 (這是一個極保守的假設)
此刻的挖礦總算力約為150,000,000,000,000,000 hash/s, 即1.510^17 hash/s. 由於挖礦需要計算兩次SHA256, 也就是每秒運算310^17次SHA256. 由於以上假設計算一個私鑰需要3倍SHA256的計算量, 所以以現在挖礦總算力可以每秒運算10^17個私鑰
假設我們擁有現有總算力的一百萬倍, 那代表每秒可以運算10^23個私鑰
假設該系統運行10^10秒, 即317年, 那一共可以運算10^33個私鑰, 即2^110. 相對於總數2^256個私鑰, 2^110仍然是小得可以忽略, 所以可以省去有關修正
現假設我們的目標是FBI擁有144,000BTC的地址: 1FfmbHfnpaZjKFvyi1okTjJJusN455paPH. 在以上條件下, 317年成功的概率是:
1-((1-2^-160)^(10^33))
即6.842*10^-16
在香港, 中六合彩頭獎的概率是1.0737*10^-7; 也就是在317年內成功的機會, 比連中指定兩次六合彩更困難
現在世上一共有71億人, 即7.1*10^9. 假設每人擁有1,400個有結餘的地址, 則一共有約10^13個地址, 即2^43
在以上條件下, 317年成功的概率是:
1-((1-2^-117)^(10^33))
即0.006.
雖然0.006聽起來很大, 但請留意以上都要基於非常保守的假設, 而且需要連續工作317年, 才有千分之六的可能性成功. 就算成功了, 還有很大機會是找到0.01BTC以下的地址, 投入的資源將遠遠大於可能的得益.
因此只要ECDSA, SHA256, 或RIPEMD160不出現漏洞, 要暴力破解一個隨機產生的地址是絕不可能做到的
Bitcoin, 及所有由Bitcoin啓發的山寨幣, 本質都是一個單向性的產權記賬系統. 例如:
- A擁有1個幣, 他轉移給B
- 之後B又把這1個幣轉移給C
- C把這1個幣分割為三份, 其中0.3個幣給D, 0.4個幣給E, 0.3個幣給自己
- E把他的0.4個幣分割為兩份, 其中0.1個給D, 0.3個給自己
- D現在共有0.3+0.1個幣, 他重新融合再分割, 0.05個給A, 0.35個給自己
單向性的意思, 就是後來的步驟, 都必須依賴所有之前的步驟. 如果例子中的第3步是無效的, 那麼就連第4, 5步都會有如從未發生一樣; 也就是說, 如果第3步是無效, 結果就是C擁有從第2步得來的1個幣, ADE一無所有.
一般來說, 有效的交易, 必須有正確的數碼簽署, 而且該交易輸入的幣在區塊鏈上有紀錄而且還沒有被花. 如果例子中的第3步的數碼簽署錯誤, 那麼E就不會在區塊鏈紀錄上擁有0.4個幣, 所以第4步也是無效, 也令第5步無效. 如果第2步已記在區塊鏈上, A就不再擁有任何幣, 他嘗試再花他的1個幣也不會成功.
BTER的情況, 是這樣的
- 很多用戶通過不同地址把幣發給BTER
- BTER把這些幣都放到同一地址NXT-LSC3-VB9T-2W3V-BH7FB
- 黑客得到地址NXT-LSC3-VB9T-2W3V-BH7FB的密鑰, 把所有幣發到自己的地址NXT-8WJ7-8A2H-MBYN-3W9K4 (https://nxtblocks.info/#section/txid/5930851748280200080)
所有交易, 在技術上都是有效的, 當然亦已經記在區塊鏈上.
現在有些人說: "我討厭交易c, 我認為那是無效的交易". 請記著, 交易c是技術上有效的交易, 有些人討厭這個交易, 可能是為了道德原因, 也可能是為了私利 (自己有很多錢在BTER), 但一定不是技術原因.
他們既然認為交易c是無效的, 那麼他們也必定認為記載著交易c的區塊209886號 (https://nxtblocks.info/#section/blockId/11441067699374044604)是無效的, 因為有效的區塊內所有交易都必須有效. 如果他們認為209886號區塊是無效的, 那麼也必定認為這區塊以後的所有區塊是無效.
現在NXT開發者就提供了一個新版本, 宣佈交易c是無效的, 讓用戶自行決定是否跟隨. 跟隨這版本的, 就會認為區塊鏈在209885號就斷了, 那麼礦工就會在這之上另挖一個不含交易c的209886號區塊, 黑客在這個新的區塊鏈上是一無所有的. 如果支持新版本的礦工多於舊版本, 他們最終就會超越舊版本, 成為最長的區塊鏈, 那麼就連舊版本都會認為黑客是一無所有, 因為這個新區塊鏈在舊版本眼中都是有效的.
如果支持新版本的礦工少於舊版本, 舊版本就會繼續堅持承認黑客擁有NXT, 新版本就會堅持認為黑客不擁有NXT. 區塊鏈就會出現硬分叉, 會有兩種NXT同時流通. 視乎你用的是哪一版本, 就會看到不同的產權紀錄. 這時候唯一方法就是新版本用戶要投降, 放棄自己的分叉, 接受交易c是有效的.
(註: NXT不叫自己做挖礦, 不過這不是重點)
回滾的意思, 就是把技術上有效而且已確認的交易, 人為地宣佈無效, 在特定位置另挖一個區塊鏈以趕上原有的區塊鏈. 這情況在Bitcoin發生過兩次, 兩次都是技術理由; 特別是是第一次, 如果不回滾, Bitcoin已經完蛋了. 也多次有人提出過技術以外的理由要回滾, 當然沒有實行, 因為這會嚴重損害Bitcoin的交易不可逆轉性.
Bitcoin的第一次回滾:
https://bitcointalk.org/index.php?topic=822.0
在2010年8月15日, 第74638號區塊出現了一個奇怪交易, 兩個輸出竟然都有92233720368.54277039 BTC (922億), 遠超BTC的設計總量2100萬. 原因是Bitcoin有漏洞, 當兩個輸出的總值加起來出現溢出 (Overflow), 被視為負數. 由於當時的代碼只會檢查輸出總值是否小於輸入總值, 這個"負總輸出"的交易就被視為合法, 並被接納在74638號區塊內. 當時Satoshi還在, 他要求礦工()先停止挖礦, 然後以原來的74637號開始以修正版本挖礦. 但由於並非所有礦工都立即更新, 要直到第74691號區塊, 新鏈才趕過舊鏈, 即是有53個區塊被浪費了, 沒及時更新的礦工一共損失5053=2650BTC的獎勵. 沒有紀錄顯示有任何人對這2650BTC的損失作出過賠償, 但以當日Bitcoin價格只有0.064美元計算, 這只是總值170美元左右.
(*) 額外歷史知識: 第一個礦池發現的區塊, 是於2010年12月16日由Slush礦池 ( https://mining.bitcoin.cz/ ) 找到, 因此第一次回滾發生之時, 應該全部都是個人礦工.
Bitcoin的第二次回滾:
https://bitcointalk.org/index.php?topic=152030.0
2013年2月19日, bitcoind 0.8 推出. 其中一個大變動, 是以LevelDB取代Berkeley DB用以紀錄區塊鏈資料. 2013年3月11日, 運行0.8的Slush礦池找到了一個有1700多個交易的225430號區塊. 這區塊理論上是合法的, 但0.7或以前的版本所使用的Berkeley DB不能正確處理, 因此網絡出現分叉: 運行0.8的, 也就是大部份礦工, 視這個較大的225430號區塊為合法, 而且一直在其之上挖礦, 成為最長的鏈; 0.7或以前的, 視這個較大的225430號區塊為非法, 因此所有隨後的都是非法, 他們找到另一個只有797個交易的225430號區塊 ( https://blockchain.info/block/00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932 ), 並繼續挖礦. 因此兩個版本之間, 互不承認對方
當時的解決方法, 是決定回歸到0.7的區塊鏈, 放棄0.8區塊鏈. 原因是0.7的區塊鏈只要夠長, 0.8都會承認; 但無論0.8的區塊鏈有多長, 0.7或以前的版本都不會承認, 這會置舊版本用戶於很危險的情況, 因為他們看不到新版本(也就是最多人承認)的情況, 收到的Bitcoin可能已經一文不值
各大礦池立即轉向0.7的分叉, 最終225462號趕過了0.8分叉, 有32個0.8分叉的區塊被浪費了, 不算手續費涉及了800BTC的獎勵. 事件引致價格大幅波動, 由$47下跌至最低$36.65, 所以總損失約值30000多美元. 這次的損失由Gavin從Bitcoin Faucet的餘款作出賠償: https://blockchain.info/tx/c931f1aa9f0d211dca085342ec472e77b538b55980a2c7b0ff9fab9a20a9acd2
另外, 在分叉的時候, 有人成功雙花了211.9093BTC (約10000美元). 他首先發了211.9093BTC給OKPAY, 交易在0.8分叉上確認後, OKPAY把$9800打到該用戶的BTC-E賬戶. 然後該用戶發現他這個交易原來並不在0.7分叉上出現, 因此他另發一個交易, 把相同的Bitcoin發給自己, 並成功在0.7分叉上確認. 由於0.7分叉最終勝出, OKPAY便白白失去了211.9093BTC. 雖然該用戶的行為是實驗性質, 而且事後也還款給OKPAY, OKPAY還是決定不再接受Bitcoin存款了. 事件顯示任何回滾必須要非常小心的進行, 否則可以帶來很不良的後果.
- Proof-of-Stack
- Proof-of-Work
無論是POS還是POW, 本質上都是當區塊鏈出現分叉, 決定哪一個是有效的方法. 總的來說, POS把這個權力給予持幣者, POW把這個權力給予運算者
通常支持POS的講法, 是節省能源, 以及持幣者應有權決定貨幣的命運. 我認為這在原則上沒有錯, 但純POS系統有嚴重缺憾. POW的算力同一時間只能為一條區塊鏈挖礦, 如果有礦工要為兩個不同的分叉挖礦, 他只能分散他有限的算力. 但POS卻不同, 只要是持幣者, 就可以同時為無數個互相矛盾的區塊鏈挖礦, 甚至可以在花幣後, 倒過來攻擊最長的區塊鏈以取回已花的幣, 例如:
- 在123號區塊時共有100個幣, A擁有60個, B擁有40個.
- A把60個幣轉給B(交易X); 當交易X進入124號區塊確認後, B付了若干貨物給A.
- 由於在123號區塊的紀錄上, A仍然擁有60個幣, 他可以另尋一個不含交易X的124號區塊. 而且因為他擁有大多數的幣, 他可以更快延長對自己有利的分叉.
- 結果B財貨兩空
如果Bitcoin一開始是一個純POS系統, Satoshi作為0號區塊的擁有人, 也就是說他當時是100% Bitcoin的擁有人, 他可以隨時把我們累積了多年的區塊鏈完全消滅.
為了防止這個問題, PPC就採用了中心化的檢查點(checkpoint), 也就是開發者會定時公佈哪個是最長的區塊鏈, 這當然是非常不理想.
NXT則用了另一策略, 就是在若干區塊出現後, 節點就會拒絕回滾. 這做法好一點, 但有機會無意中造成硬分叉.
我本人的看法, 較理想的做法是以POW為骨幹, 由POS輔助, 可以由軟分叉做到.
There's basically 3 types of double spends you can perform with bitcoins:
- A regular double spend race is when you send out two competing transactions - one paying the merchant and one paying yourself say. In principle it's hit-and-miss as to which transaction wins (though you can put larger fees onto the transaction to yourself to try and bias it in your favour). Any client would be able to see the double spend taking place, and a single confirm is enough to prevent it. A Finney attack is when you mine a block but before you publish the block to the world you quickly try and spend some of the inputs elsewhere. Once you've spent the inputs you then release the mined block, which effectively makes the unconfirmed transaction void. This attack requires mining resource and very fine timing. It's (mostly) thwarted by 1 confirm.
- A 51% (or near 51%) attack is where the attacker has a large amount of mining resource available. He sends a transaction over the network and in private builds up an alternative blockchain with a competing transaction. You wait for n confirms, but as long as his chain is longer than the public chain he can at any point release his private chain to the public undoing your transaction. The risks for the attack are that this attack is probabilistic - he can't know that his chain will be longer after n confirms, he just has to get lucky.
- The way the maths works out, the bigger n is, the less likely this attack will succeed (unless the attacker has > 50% hashing power, hence why it's a magic number). There's nothing magical about 6, it's just a number that was suggested early on. The problem with this attack, apart from the vast computational resources involved, is that while he's building up his private blockchain, he's not earning income from mining. So this attack is expensive and only worth it for large (huge!) transactions.
It's worth noting that right now near 51% attacks are entirely theoretical. I don't believe one has ever been performed in practice, even for small n. For that matter I'm not aware of any deliberate Finney attacks either.