我試圖實現一個類似於比特幣的簡單加密貨幣,只是爲了深入瞭解它到代碼級別。我們如何證明比特幣區塊總是可以解決的?
我知道一個比特幣區塊包含前一個區塊的散列,許多交易和求解者的獎勵交易。
礦工基本上在該候選塊上運行SHA256並結合隨機數。只要散列結果的第一個特定數字是零,我們說這個塊已經解決了,我們將結果廣播給整個網絡來要求獎勵。
但我從來沒有見過任何人證明一個塊是可以解決的。我想這是由SHA256保證?因爲解決方案的大小是固定的,所以在嘗試足夠的輸入之後,你保證能夠達到每個哈希結果?但是你怎麼能證明塊的解決方案分佈是均勻的(統一的),這樣你確實可以覆蓋所有的散列結果呢?
現在,假設一個塊總是可以解決的,我可以假設使用64位的隨機整數足以解決它嗎?怎麼樣32位?或者我必須使用無限位整數?
例如,在basiccoin項目:
爲工作證明的代碼如下:
def POW(block, hashes):
halfHash = tools.det_hash(block)
block[u'nonce'] = random.randint(0, 10000000000000000000000000000000000000000)
count = 0
while tools.det_hash({u'nonce': block['nonce'],
u'halfHash': halfHash}) > block['target']:
count += 1
block[u'nonce'] += 1
if count > hashes:
return {'error': False}
if restart_signal.is_set():
restart_signal.clear()
return {'solution_found': True}
''' for testing sudden loss in hashpower from miners.
if block[u'length']>150:
else: time.sleep(0.01)
'''
return block
此代碼隨機量之間的數[0,10000000000000000000000000000000000000000]作爲開始點,並且那麼它只是增加一個接一個的值:
block[u'nonce'] += 1
我不是一個python程序員,我不知道python如何處理整型的類型。沒有處理整數溢出。
我想用C++實現類似的東西,我不知道什麼樣的整數可以保證一個解決方案。
我不確定我是否理解你的問題,但密碼散列輸出中的偏見很小,以至於在實際應用中它是微不足道的。所以你可以考慮有50%的可能性,即密碼散列的任何一位爲0.前兩位爲零的概率爲25%,前三位爲零的概率爲12.5%等。「塊」不問題:概率不會改變。關於使用64位整數,我看不出它是如何工作的,如果我沒有弄錯比特幣的難度,我寫這已經需要比64位的第一位全部爲零... – TacticalCoder 2014-10-24 19:01:11
謝謝你的回覆。關於整數,我不是在問散列結果(是的,它大於64位)。我正在討論哈希函數(這是塊加上一個隨機數)的輸入。 – 2014-10-24 21:18:18
這是一個很好的問題。據我所知,你在問:「誰能證明總會有一個隨機數導致哈希≤難度?」 – Geremia 2015-03-10 02:49:27