ewi*_*ard 1 python hash json list blockchain
我有一个函数可以生成一个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(),
}
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这个函数创建了一个与行中的下一个块完全不同的哈希(链上附加到前面块的最后一个块的哈希与前面块的哈希不匹配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
hash()是只适用于生产映射,哈希表。它使用随机种子来防止攻击。它不是加密散列,不应指望在 Python 调用中保持稳定。
从hash()功能文档:
返回对象的哈希值(如果有)。哈希值是整数。它们用于在字典查找期间快速比较字典键。比较相等的数值具有相同的哈希值(即使它们的类型不同,如 1 和 1.0 的情况)。
来自__hash__hook 方法,hash()如果存在则调用:
注意:默认情况下,该
__hash__()值str,bytes并且datetime对象是“咸”不可预测的随机值。尽管它们在单个 Python 进程中保持不变,但它们在 Python 的重复调用之间是不可预测的。
坚持hashlib模块选项;这些在通话中都是稳定的。
除此之外,在单个 Python 进程中,hash()在具有相同value 的对象上,也将产生完全相同的哈希。由于您的block字典在块之间发生变化(因为它包括链中前一个块的散列),它自然不会是相同的字符串,因此不会是相同的散列值。
这同样适用于hashlib功能;它们只为相同的输入产生相同的值。如果您的哈希值不同,则输入不同。您的输入自然不同,因为每个block字典都包含对前面哈希的引用。