比特幣挖礦算法具體是什么?
需要以下參數
1、block的版本version
2、上一個block的hash值: prev_hash
3、需要寫入的交易記錄的hash樹的值: merkle_root
4、更新時間: ntime
5、當前難度: nbits
挖礦的過程就是找到x使得
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
上式的x的范圍是0~2^32, TARGET可以根據當前難度求出的。除了x之外,你還可以嘗試改動merkle_root和ntime。由于hash的特性,找這樣一個x只能暴力搜索。
一旦你找到了x,你就可以廣播一個新的block,其他客戶端會驗證你的block是否合法。如果你的block被接受,由于每個block中的第一筆交易必須是將新產生25個比特幣發送到某個地址,當然你會把這個地址設為你所擁有的地址來得到這25個比特幣。
比特幣從開始到現在的每一筆交易記錄都保存在網絡上,整個比特幣網絡維護的一個巨大的交易記錄文件(現在大約12G)。 這個文件的更新周期平均是10分鐘,新加入的交易記錄叫做一個block,而這個碩大的文件由一串block組成,叫做block chain.
為什么是25個比特幣?
這是規定。最初是50個比特幣,每產生剩下比特幣的一半,這個所得就會減半,這樣最終能產生的比特幣總量趨近于2100萬。如果你現在仍然聲稱挖到了50個比特幣,這是不會被其他客戶端接受的,這個block就算白挖了。
怎么保證更新周期平均是10分鐘?
TARGET越小,解出x的難度就越大,每產生2016個block(約14天),網絡會根據這段時間產生新block的平均間隔調整之后的TARGET。
是不是計算速度最快的人總是先解出來?
不是。你總是想把挖礦所得據為己有,所以每個人在計算時,發送挖礦所得的地址是不一樣的,這樣merkle_root就不同,也就是說每個人是從不同的初始狀態開始求解的。
同時解出來怎么辦?
block chain會出現分叉,部分客戶端接受了A,部分接受了B,直到某個分支變得更長,所有人就會選擇這個更長的分支。如果你挖出來的不幸沒有被選中,你的挖礦所得就無效了。
既然選更長的分支,那我用很低的難度去求解怎么辦?
客戶端在眾多分支中找到符合當前難度且最長的。
這些計算浪費了嗎?
如果你要把一筆錢花兩次,你需要這么做。挖到一個新的block,但是藏著不廣播,并繼續挖礦。找到商家A,支付比特幣,讓網絡上的其他人挖到block并寫入這筆交易記錄。找到商家B,支付比特幣,寫入自己挖的block。如果你能搶先挖到兩個block并廣播出去,所有人會以你這個更長的分支為當前的block chain,商家A收到的比特幣就不被承認了。這樣攻擊成功的概率取決于你計算hash的速度。整個網絡的計算力足夠高的話,這樣的攻擊或者成功率極低,或者成本極大。