2014-10-21 41 views
2

我試圖實現一個類似於比特幣的簡單加密貨幣,只是爲了深入瞭解它到代碼級別。我們如何證明比特幣區塊總是可以解決的?

我知道一個比特幣區塊包含前一個區塊的散列,許多交易和求解者的獎勵交易。

礦工基本上在該候選塊上運行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++實現類似的東西,我不知道什麼樣的整數可以保證一個解決方案。

+1

我不確定我是否理解你的問題,但密碼散列輸出中的偏見很小,以至於在實際應用中它是微不足道的。所以你可以考慮有50%的可能性,即密碼散列的任何一位爲0.前兩位爲零的概率爲25%,前三位爲零的概率爲12.5%等。「塊」不問題:概率不會改變。關於使用64位整數,我看不出它是如何工作的,如果我沒有弄錯比特幣的難度,我寫這已經需要比64位的第一位全部爲零... – TacticalCoder 2014-10-24 19:01:11

+0

謝謝你的回覆。關於整數,我不是在問散列結果(是的,它大於64位)。我正在討論哈希函數(這是塊加上一個隨機數)的輸入。 – 2014-10-24 21:18:18

+0

這是一個很好的問題。據我所知,你在問:「誰能證明總會有一個隨機數導致哈希≤難度?」 – Geremia 2015-03-10 02:49:27

回答

0

但是,您如何證明塊的解決方案分佈是均勻的(統一的),以便您確實可以覆蓋所有散列結果?

SHA256是確定性的,所以如果您重新提供txns,它將始終提供相同的256哈希值。 客戶端節點保留merkle樹中的所有txn和散列值,以便網絡客戶端傳播並驗證最長的塊鏈。

merkle樹是記錄以前塊的散列的基本數據結構。 從那裏可以跟蹤來自原始(成因)區塊的哈希確認鏈。

相關問題