我正在尝试实现类似于比特币的简单加密货币,只是为了深入了解代码级别。
我理解比特币块包含前一个块的散列,许多事务和解算器的奖励事务。
该矿工基本上在该候选区块上运行SHA256并结合随机数。只要哈希结果的第一个特定数字为零,我们就说这个块已经解决,我们将结果广播到整个网络以获得奖励。
但我从来没有见过有人证明一个块可以解决。我猜这是由SHA256保证的吗?因为解决方案大小是固定的,在尝试足够的输入后,您可以保证每个哈希结果都能达到?但是你怎么能证明一个块的解决方案分布是均匀的(统一的),所以你确实可以覆盖所有哈希结果?
现在,假设一个块确实总是可以解决的,我可以假设使用64位的随机整数足以解决它吗? 32bit怎么样?或者我必须使用无限位整数?
例如,在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,1000000000000000000000000000000000000000000]之间的数字作为起始点,然后它只是逐个增加该值:
block[u'nonce'] += 1
我不是python程序员,我不知道python如何处理整数的类型。没有处理整数溢出。
我正在尝试用c ++实现类似的东西,我不知道什么样的整数可以保证解决方案。
答案 0 :(得分:0)
但是如何证明块的解决方案分布是均匀的(统一),以便您确实可以覆盖所有哈希结果?
SHA256是确定性的,所以如果你重新使用txns它将始终提供相同的256个哈希。 客户端节点将所有txn和哈希值保留在merkle树中,以便网络客户端传播并验证最长的块链。
merkle树是记录先前块的哈希值的基本数据结构。 从那里可以跟踪来自原点(genesis)块的哈希确认链。