※ [本文轉錄自 Soft_Job 看板 #1IbUyXNc ]
作者: StubbornLin (鍵盤創業家) 看板: Soft_Job
標題: [技術] Bitcoin運作基本原理
時間: Wed Nov 27 21:09:36 2013
Bitcoin講了這麼多,很多人認為不安全什麼的
但其實可能不太瞭解它是怎麼運作的
正好我有研究一點點過,就嘴砲寫一篇解釋一下部份的運作原理
首先可以參考這篇
http://yowureport.com/?p=5358
他大略的方式解釋得蠻清楚的,只是技術細節沒寫清楚
細節呢,Bitcoin有一種最基本的資料結構單位叫做Block
https://en.bitcoin.it/wiki/Blocks
它大略含了這些資訊,例如像這樣
- 隨機值 (Random nonce)
- 難度值
- 上一個Block的hash值
- 礦工獎勵:
- 簽屬 10 BTC 給 Marry
- 簽屬 15 BTC 給 Julia
- 合法的交易資料:
- 交易1 John 簽屬 5 BTC 給 Tom
- 交易2 Tom 簽屬 0.5 BTC 給 Jimmy
...
實際的Block都是透過P2P交換 所以是完全公開的 可以到這個網站看看
http://blockexplorer.com/
每隔不多久就會又有新的Block被產生 我們隨便挑一個出來看
http://goo.gl/RF9yrD
Transactions 那裡就是收錄合法的交易資料,可以看見第一行
Generation: 25 + 0.59209676 total fees
這個就是礦工獎勵,剩下的就是合法的交易資料
所以簡單來說這就是一本帳冊,礦工就是造出這本帳冊的人
他可以簽屬25BTC + 所有交易費用的總合 給他指定的人
進入重點,所以帳冊要怎樣造,好像這樣聽起來隨便都可以造
但其實不是,一個合法的Block,要在P2P網路上被所有的節點認可
必需符合一條件,簡單的來說,就是整個Block產生出來的Sha256值
要小於難度值
SHA256(Block data + Random nonce) < 難度值
SHA256算出來的長度就是256bits,也就是32Bytes長
這是一個很長的數字範圍,難度值並不是一個很長的數字
而雜湊函數算出來的數值一般都視為亂數且無法預測的數值
因此,產生合法的一個Block唯一的方法,就是大量代入不一樣的Rnadom nonce
暴力一直去試,直到產生一個Block的SHA256 Hash值小於難度值
這樣的一個block才會被P2P上的所有節點認可
當你產生這樣一個block其實我們就叫做挖到礦了
那個難度值會自動 每週依照上週的平均產出速率
去調出一個當初就設計好的速度,因此當越多人挖
這個值會自動調整出一個更難挖的 更小的難度值來
這裡講到的獎勵金25BTC其實也會隨著時間變動
它設計隨著時間 越到後面挖礦的BTC獎金越少
最初其實是 50BTC的 只是時間到了現在變25了
它來控制發行總量 當然到最後會沒有獎勵
但透過收集交易費用 最後還是有人願意挖
而每個block都有一個往上一個block的hash值
所以整個形成一個往前audit的hash chain
有時會出現短時間內出現兩個合法的block來自同一個parent的情況
就是產生分支 (branch) 這時會看哪個chain花的運算資源最多
那個才會被承認 這樣一來要惡搞就很困難
而交易是透過非對稱加密,每個戶頭都是一把公鑰
透過每個人私鑰去數位簽章 就可以把你有的BTC簽給收款人的公鑰
接著把簽章的資料廣播到P2P網路 最終被某個礦工收錄在block裡
如此一來整個P2P網路就認可你有那筆錢
嗯? 你說 那好 我身為礦工 挖到礦的獎勵規訂是25而已
但我偏要把它設成999999 不行嗎? 當然可以
只是那個block因為不符規則會被視為無效的
嗯? 你說 那當我挖到礦時造假的交易收錄在block裡 我明明一毛錢都沒有
卻轉帳給我另一個戶頭 9999999 BTC
沒用 你沒足夠的餘額去簽那轉帳 一樣被視為無效的block丟掉
嗯? 你說 那我如果當個惡搞礦工 專門產生不收錄交易的block讓交易無法進行呢?
沒用 你得和全世界貪婪的礦工們競爭 他們用的可都是ASIC等級的設備在挖的
嗯? 你說那我如果挖到礦了 把難度值惡搞一下 變超簡單呢?
沒用 難度值如果不照原先設計好的規則變動 你這個block一樣被視為無效
嗯? 你說你造一個惡搞的block廣播出去呢? 沒有用
見到你這不合格的block的節點就會直接忽視 當垃圾丟掉
嗯? 那你說 好 假設我有100BTC 我在短時間內簽兩筆100BTC分別給不同人呢?
喔... 這就有可能有效了 如果收到的人只驗數位簽章 不等一下子
讓有礦工收錄的話 他可能就真的以為收到這筆錢了 但等過一陣子之後
第一筆交易被收錄 第二筆就會被視為無效的丟掉
因為有這種可能 所以其實只要等五到十分鐘 確認有被收錄
這攻擊就無效了
挖礦這整個遊戲就像是在丟骰子一樣 全球一起參賽
看誰先骰出小於指定數值的骰 大約每五分鐘開出一輪
開出一個hash值就是丟一次骰子 看誰丟骰子的速度快
現在職業礦工都是靠 ASIC特制硬體在挖的
你CPU、丟一次、十次 他可能已經丟一千次一萬次了
所以現在難度已經非常高 在有利可圖的情況下
經過三年的時間全球的礦工瘋狂挖的情況下
還能正常運轉 其實就表示要攻破或惡搞是非常有難度的
至少就理論和三年實戰看來 至今是非常可靠的
寫得有點亂 有空的話再聊其它細節 有想到什麼可能的攻擊手法可以討論看看
或許我可以回答得上 那至於信不信有沒有那個價值 是不是騙局就免了
談技術就好 反正我認為信的人信 不信的人還是不信囉 科科