比特幣原理
賬本如何驗證——Hash
假如有這樣一個賬本,賬本的數據分別存在王二、張三、李四、趙五的電腦上,每個人都記錄一份數據。
那麼,萬一張三偷偷將自己的餘額修改了,比如改成300
那麼網絡中如何判別出張三修改後的假數據呢
哈希函數
Hash(原始信息) = 摘要信息
- 同樣的原始信息用同一個哈希函數總能得到相同的摘要信息
- 原始信息任何微小的變化都會哈希出面目全非的摘要信息
- 從摘要信息無法逆向推算出原始信息
假如說有這樣一個賬本
會包括賬本序號、記賬時間、交易信息
對這樣一個賬本記錄進行Hash之後就可以得到一個摘要信息,即787635A
如果有修改的假數據,那麼其哈希值會發生很大的變化
然後對序號、時間戳、Hash值、交易記錄保存下來就形成了一個區塊
區塊
序號、時間戳、Hash值稱爲區塊的頭
此時,如果來了第二個賬本
記賬時間比剛纔那個推遲了10分鐘
比特幣的記賬時間是每十分鐘記一次
再對這個賬本進行哈希的時候會加入第一個賬本的哈希值
第二個賬本也會形成一個區塊
然後由此類推,就會產生第三個塊、第四個塊......第n個塊
這就是形成了區塊鏈
然後每個節點在覈對數據的時候,只需要覈對最後一個區塊的摘要信息。如果最後一個區塊的摘要信息能對上,說明整個區塊鏈的賬本是正確的。
賬戶所有權問題
比特幣是點對點交易的,如何在沒有第三方銀行的參與下,確定賬戶的所有權呢?
賬戶是用一個地址來表示的。轉賬的過程是把比特幣從一個地址轉移到另外一個地址,賬本上是不保存任何個人信息的
這樣一條信息就是一個轉賬記錄,如果誰能用這個地址進行支付,誰就擁有這個賬戶的所有權
一個地址(一個賬戶)有一個對應的私鑰,誰擁有這個私鑰,誰就能用這個地址進行支付
所以私鑰一定要保管好,如果私鑰泄露了的話,比特幣就有可能會丟失
不像銀行一樣丟失了我們可以重置密碼,私鑰泄漏的話沒辦法重置或者去找
比特幣地址(賬戶)和私鑰是非對稱的關係,私鑰經過兩次哈希運算之後就可以得出比特幣的地址,地址不能反推私鑰
非對稱加密技術——交易簽名
如何在不泄露私鑰的情況下來證明我們擁有某個地址的私鑰 ?
你在交易的時候如果要亮出私鑰給別人看,那麼私鑰就泄露了
通過非對稱加密技術——交易簽名
簽名過程
①對原始交易記錄進行hash運算得到摘要信息
②用私鑰對摘要信息進行簽名運算
③簽名運算之後付款的節點就會向相鄰節點進行廣播。
廣播內容會包含交易的原始信息、交易的簽名信息。
當節點收到廣播並且驗證通過之後,會向與自己相鄰的節點進行廣播,直到廣播到整個網絡
驗證過程
簽名和驗證是逆運算
其他節點收到廣播信息之後就會開始來驗證,驗證簽名的信息是不是付款方用私鑰對原始信息簽名產生的
可以看作,付款人的地址是公鑰
簽名的過程是對摘要進行加密的過程,驗證是一個解密的過程
隱私和安全的優勢
整個賬戶裏面是沒有個人信息的。即使我的地址上有1w個比特幣,也沒有任何人能夠知道這個比特幣是我的,而我依然可以用來支付
在銀行卡里的錢,如果銀行認爲來路不明,我們的賬戶就可能會被凍結。比特幣系統中沒有這個問題
爲什麼記賬-挖礦
記賬就是把交易的記錄、時間、賬本序號等信息進行Hash打包的過程
記賬的過程叫做挖礦
自然,記賬的過程是需要消耗計算機計算資源的
那麼節點爲什麼要參與記賬呢?完成記賬的節點可以獲得系統一定數量的比特幣獎勵的。這個獎勵其實也就是比特幣的發行過程。
記賬是有獎勵的,每次記賬是先發行一定數量的比特幣到記賬的賬戶
這樣的話就會出現大家都去爭相記賬。所以,要有具體的規則來限制大家進行記賬
- ①一段時間內只有一人可以記賬成功
- ②通過解決密碼學難題(即工作量證明)競爭獲得唯一記賬權
- ③其他節點複製記賬結果
挖到礦的節點,會在交易中添加一筆給自己轉賬的交易,即挖礦獎勵
我們之前講的是
爲了保證一段時間內只有人可以記賬,提高了記賬的難度
要求Hash計算得到的結果必須要以n個0開頭
通過改變隨機數的值不斷嘗試
這是一個真實的區塊,512884號區塊。這個區塊的哈希值是以18個0開頭
哈希值是16進制字符串,得到一個0的概率是1/16,所以如果要得到18個0的話,需要16^18=4,722,366,482,869,645,213,696的計算量,需要投入巨大的計算資源,包括電力
目前已經沒有獨立的礦工去挖礦了, 現在都是礦工聯合起來組成礦池進行挖礦
並且,我國由於電力成本比較低,相對收益更高,所以中國的算力佔據了整個網絡的一半以上
共識機制
如果兩個節點同時完成工作量證明,用誰的區塊?
區塊鏈中無第三方仲裁機構裁決,所以引入了共識機制
共識機制就是大家共同遵守的規範和協議
共識機制認可累計工作量最大的區塊鏈
這樣大家在挖礦的時候都會去選擇工作量最大的區塊鏈然後去延長它
共識機制最終的目的是要保證比特幣不停的在工作量最大的區塊上運轉,每次都選擇最長的鏈去挖礦
將累積了最大工作量的區塊鏈稱爲主鏈
分叉解決
不同礦工在幾乎同時同時挖了一個礦,打出了兩個包 3458A和3458B,然後立刻在網絡上進行廣播,先是傳給鄰近的節點
有的節點會先收到3458A,有的節點會先收到3458B
收到A塊的就會把A塊添加到主鏈上,收到B塊的會把B塊添加到主鏈上。隨後收到的另一個會作爲備用鏈保存
這樣就出現分叉了
此時兩條鏈會競爭,但是總會有一方搶先發布工作量證明,比如是B塊
然後下一個3459B再產生了之後,在網絡上給廣播,之前保存3458A的區塊在收到3459B之後就會將3458B這個鏈條作爲主鏈了