python3 中 使用和solidity 中一样的keccak256算法 并且结果一致

环境 下载的python3.8
1、python依赖
pip install pycryptodome
+改lib下的 crypto为Crypto 解决
详细说明 改lib文件下的crpyto文件 把首字母大写
只需要安装这个依赖。 如果有安装其他包 可以卸载掉以免干扰
pip uninstall 包名 为卸载依赖
此处原文地址 见评论处 https://blog.csdn.net/DanielJackZ/article/details/104531615

2、代码

from Crypto.Hash import keccak
def keccakTest():
    keccak_hash = keccak.new(digest_bits=256)
    # keccak_hash.update(b'0')#044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d
    #keccak_hash.update(b'a') 3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb
    #b'' 这个是字符转byte 的方法 因为hex 0 为不可见字符 所以我们没有办法通过字符转换
    a_bytes = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000001')# bytes.fromhex('61')等于 b'a'
    print(a_bytes)#打印为 b'a'
    keccak_hash.update(a_bytes)
    print(keccak_hash.hexdigest())

说明下 这个地方调试的原因是 solidity 在计算数组存储数据开始 的位置 会使用这个函数 在solidity中是

bytes32 kec=keccak256(bytes32(0))

所以 当使用python 来进行计算时 需要转换 bytes32(0) 是hex 格式的 (上面那一串) 这样才能保证算出的结果是一致的

在计算字符格式的参数 python使用b’’ 结果是solidity一致的

solidity代码 为 请注意 solidity 版本为^0.4.4 老版本可以穿字符串 新版只能是bytes32

 bytes32 kec=keccak256(a);

你可能感兴趣的:(杂谈,智能合约)