Sha256

雜湊算法的測試案例在哪裡?

  • March 31, 2016

RFC4231為 SHA256 提供了幾個不同的 gozintas 和 gozoutas 集的測試案例。我正在尋找與比特幣探勘算法中實現的 SHA256 雜湊類似的東西。


根據給出的答案,這是一個非常簡單的 Python 測試。請注意,生成的摘要必須在檢查之前反轉,因為 256 位摘要顯然是首先返回的最低有效位。

#!/usr/bin/python
import hashlib
GENESIS_BLOCK = \
   '0100000000000000000000000000000000000000000000000000000000000000' + \
   '000000003BA3EDFD7A7B12B27AC72C3E67768F617FC81BC3888A51323A9FB8AA' + \
   '4B1E5E4A29AB5F49FFFF001D1DAC2B7C01010000000100000000000000000000' + \
   '00000000000000000000000000000000000000000000FFFFFFFF4D04FFFF001D' + \
   '0104455468652054696D65732030332F4A616E2F32303039204368616E63656C' + \
   '6C6F72206F6E206272696E6B206F66207365636F6E64206261696C6F75742066' + \
   '6F722062616E6B73FFFFFFFF0100F2052A01000000434104678AFDB0FE554827' + \
   '1967F1A67130B7105CD6A828E03909A67962E0EA1F61DEB649F6BC3F4CEF38C4' + \
   'F35504E51EC112DE5C384DF7BA0B8D578A4C702B6BF11D5FAC00000000'
GENESIS_HASH = \
   '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f'
def check_hash(block = GENESIS_BLOCK, blockhash = GENESIS_HASH):
   '''
   check that the calculated hash matches what Bitcoin expects

   >>> check_hash()
   True
   '''
   blockheader = block.decode('hex')[:80]
   header_hash = hashlib.sha256(blockheader).digest()
   check_hash = hashlib.sha256(header_hash).digest()
   return check_hash[::-1].encode('hex') == blockhash

if __name__ == '__main__':
   print check_hash()

首先,比特幣使用 SHA256d。

其次,我能想到的最好的測試案例是創世塊

GetHash()      = 0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
hashMerkleRoot = 0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
txNew.vin[0].scriptSig     = 486604799 4 0x736B6E616220726F662074756F6C69616220646E6F63657320666F206B6E697262206E6F20726F6C6C65636E61684320393030322F6E614A2F33302073656D695420656854
txNew.vout[0].nValue       = 5000000000
txNew.vout[0].scriptPubKey = 0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704 OP_CHECKSIG
block.nVersion = 1
block.nTime    = 1231006505
block.nBits    = 0x1d00ffff
block.nNonce   = 2083236893

CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1)
 CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
   CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73)
   CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
 vMerkleTree: 4a5e1e

引用自:https://bitcoin.stackexchange.com/questions/11076