本文轉自:http://blog.codinglabs.org/articles/bitcoin-mechanism-make-easy.html
首先,基於保密印章機制,沒有人能偽造他人身份進行付款,因為編碼生成器在打印編碼時會核對所有交易單的保密印章,印章和付款人不一致會拒絕打印。
而且誠實的礦工也不會承認不合法的交易(如某筆交易付款方余額不夠)。
所以只有一種可能的攻擊行為,即在收款人確認收款后,從另一條分支上建立另外的交易單,取消之前的付款,而將同一筆錢再次付款給另一個人(即所謂的double-spending問題)。下面同樣用一個例子說明這個問題。
先假設有一個攻擊者擁有10個比特幣,他准備將這筆錢同時支付給兩名受害者A和B,並都得到承認。
第一步,攻擊者准備從受害者A手里買10比特幣的黃金,他簽署交易單給受害者A,轉10個比特幣給受害者A。
第二步,這筆交易在最新的賬簿頁中被確認,並被各個挖礦小組公告出來。受害人A看到公告,確認比特幣到賬,給了攻擊者10個比特幣等值的黃金。
第三步,攻擊者找到賬簿,從包含剛才交易的賬簿頁的前一頁做出一個分支,生成更多的賬單頁,超過剛才的分支。由於此時剛才攻擊者制造的分支變成了主干分支,而包含受害者A得到錢的分支變成了旁支,因此挖礦組織不再承認剛才的轉賬,受害者A得到的10比特幣被取消了。
第四步,攻擊者可以再次簽署交易單,將同一筆錢支付給受害者B。受害者B確認錢到賬后,支付給攻擊者等值黃金。
至此,攻擊者將10個比特幣花了兩次,從兩名受害者那里各購得等值黃金。攻擊者還可以如法炮制,取消與受害者B的轉賬,將同一筆錢再支付給其他人……
關於這種攻擊,中本聰給出的解決方案是,建議收款人不要在公告掛出時立即確認交易完成,而是應該再看一段時間,等待各個挖礦小組再掛出6張確認賬簿,並且之前的賬簿沒有被取消,才確認錢已到賬。
中本聰解釋道,之前設定變態的編號規則,正是為了防御這一點。根據前面所述,生成有效賬簿頁不是那么簡單的,要花費大量的人力反復試不同的幸運數字,而且過程完全是碰運氣。如果某賬簿頁包含你收到錢的確認,並且在后面又延續了6個,那么攻擊者想要在落后6頁的情況下從另一個分支趕超當前主分支是非常困難的,除非攻擊者擁有非常多的人力,超過其他所有誠實礦工的人力之和。
而且,如果攻擊者有如此多人力,與其花這么大力氣搞這種攻擊,還不如做良民挖礦來的收益大。這就從動機上杜絕了攻擊的形成。
比特幣會一直增加下去,豈不是會嚴重通貨膨脹
中本聰說,這一點我也想到了。前面忘了說了,我給礦工組織的操作細則手冊會說明,剛開始我們協議每生成一頁賬簿,獎勵小組50個比特幣,后面,每當賬簿增加21,000頁,獎勵就減半,例如當達到210,000頁后,每生成一頁賬簿獎勵25個比特幣,420,000頁后,每生成一頁獎勵12.5個,依次類推,等賬簿達到6,930,000頁后,新生成賬簿頁就沒有獎勵了。此時比特幣全量約為21,000,000個,這就是比特幣的總量,所以不會無限增加下去。
沒有獎勵后,就沒人做礦工了,豈不是沒人幫忙確認交易了
到時,礦工的收益會由挖礦所得變為收取手續費。例如,你在轉賬時可以指定其中1%作為手續費支付給生成賬簿頁的小組,各個小組會挑選手續費高的交易單優先確認。
礦工如果越來越多,比特幣生成速度會變快嗎
不會。中本聰解釋,雖然可以任意加入和退出礦工組織,導致礦工人數變化,每個礦工也會拿到一個編碼生成器,不過我已經在編碼生成器中加入了調控機制,當前工作的編碼生成器越多,每個機器的效率就越低,保證新賬簿頁生成速率不變。
雖然每個人的代號是匿名的,但如果泄露了某個人的代號,賬簿又是公開的,豈不是他的所有賬目都查出來了
確實是這樣的。例如你要和某人交易,必然要要到他的代號才能填寫交易單。因為收款人一欄要填入那人的代號。不過中本聰說可以提供無限制的保密印章,建議每一次交易用不同的保密印章,這樣查賬簿就追查不到同一個人的所有賬目了。
答疑完畢。
說明
本文用通俗比喻的方式講解了比特幣的運行機制。有幾點需要說明:
- 為了便於理解,我做了很多簡化,因此有些機制細節和實際的比特幣可能不完全相同。但總體思想和關鍵原理是一致的。
- 由於很多計算機世界的東西(如公鑰體系、網絡傳輸)在現實世界中並沒有特別好的對等物,所以故事里難免有一些生硬和不合常理的細節。
- 本文描述的是比特幣網絡本身的技術原理和運作機制,當在如Mtgox這種買賣市場中進行比特幣交易時,市場做了中間代理,並不遵從上述機制