我有一个函数产生block
,其中包含一些数据:
def new_block(self, proof, previous_hash=None):
...
block = {
'message': 'New Block Forged',
'index': len(self.chain) + 1,
'transactions': self.current_transactions,
'proof': proof,
'previous_hash': previous_hash, or self.hash_block(self.chain[-1]),
'timestamp': response.tx_time or time(),
}
self.chain
是块所在的块列表。 previous_hash
(前一个块的哈希值)被传递给函数,并创建一个时间戳。不要过多担心实际数据的细节(那里可能有些错误,但它与hash()
函数的关系比数据的内容更多)
接下来,我对块进行哈希处理,然后将其添加到块中:
block['hash'] = self.hash_block(block)
hash_block
函数如下所示:
@staticmethod
def hash_block(block):
block_string = json.dumps(block, sort_keys=True)
return hash(block_string)
这个函数创建了一个完全不同的哈希,而不是它所具有的下一个块(连接到前面的块的最后一个块的哈希,在链上,与块中的previous_hash
不匹配然而,他们使用相同的功能:
这一行:
'previous_hash': previous_hash or self.hash_block(self.chain[-1])
和这一行:
block['hash'] = self.hash_block(block)
重要的行(和hash_block
)是否起作用。创建一个块,散列并散列哈希,然后创建另一个块并散列前一个块,并且它与创建块时为该块创建的哈希不匹配。
另外,我开始使用hashlib.sha256,当我注意到这个问题时,我决定看看它是否是哈希函数,所以我切换到stock
哈希,但我仍然遇到问题 - 最终我希望这可以在hashlib
上运行,但我想我是否可以首先使用hash
...我将解决hashlib
的问题
答案 0 :(得分:3)
hash()
仅适用于生成映射,哈希表。它使用随机种子来防止攻击。 不加密哈希值,不应指望它在Python调用中保持稳定。
来自hash()
function文档:
返回对象的哈希值(如果有)。哈希值是整数。 它们用于在字典查找期间快速比较字典键。比较相等的数字值具有相同的哈希值(即使它们具有不同的类型,如1和1.0的情况)。 / p>
以及__hash__
hook method,其中hash()
调用如果存在:
注意:默认情况下,
__hash__()
,str
和bytes
个对象的datetime
值被“腌制”,并带有不可预测的随机值。尽管它们在单个Python进程中保持不变,但在重复调用Python之间无法预测它们。
坚持hashlib
module选项;这些都是稳定的。
除此之外,在单个Python进程中,hash()
对具有相同值的对象,也将产生完全相同的哈希。由于您的block
字典在块之间发生了变化(因为它包含了链中前一个块的散列),因此它自然不是相同的字符串,因此不是相同的散列值。< / p>
这同样适用于hashlib
功能;它们仅为相同的输入生成相同的值。如果您的哈希值不同,则输入会有所不同。并且您的输入自然不同,因为每个block
字典都包含对前一个哈希的引用。
答案 1 :(得分:0)
打印出json.dumps
后的对象后,我注意到它保留了添加的hash
属性(我认为它不是) - 检查变量