分类
Uncategorized

将c++函数转换为python:sha256哈希不匹配

这与比特币无关,但它使用了大部分比特币代码库。我想把一些c++代码翻译成python,但是很难把散列正确。
这是我尝试得到的函数。哈什正在做一个双sha256
uint256-CalcKernelHash(const uint256&stakeModifier,int64\t height,int64\t coinstakeTime,const uint256&masternodeID,const consensis::Params&Params){
//计算哈希
CDataStream ss(SER\u GETHASH,0);
ss<<stakeModifier<<coinstakeTime<<GetMnCollateralAmount(int(height))<<masternodeID;
标准::cout<<“\n————————————-\n”;
std::cout<<“调试[”<<coinstakeTime<<“]collateralamount:”<<GetMnCollateralAmount(int(height))<<“\n”;
std::cout<<“调试[”<<coinstakeTime<<“]ss:”<<stakeModifier.ToString()<<coinstakeTime<<GetMnCollateralAmount(int(height))<<masternodeID.ToString()<<“\n”;
std::cout<<“调试[”<<coinstakeTime<<“]哈希:”<<哈希(ss.begin(),ss.end()).ToString()<<“\n”;
返回哈希(ss.begin(),ss.end());
}
这里叫做
const auto hashprooftofstake=uintotoarith256(CalcKernelHash(stakeModifier,height,coinstakeTime,masternodeID,params));
std::cout<<“调试[”<<coinstakeTime<<“]coinstakeTime:”<<coinstakeTime<<“\n”;
std::cout<<“调试[”<<coinstakeTime<<“]nbits:”<<nbits<<“\n”;
std::cout<<“调试[”<<coinstakeTime<<“]hashprooftostake:”<<hashprooftostake.ToString()<<“\n”;
std::cout<<“调试[”<<coinstakeTime<<“]stakeModifier:”<<stakeModifier.ToString()<<“\n”;
std::cout<<“调试[”<<coinstakeTime<<“]主节点ID:”<<主节点ID.ToString()<<“\n”;
我添加了一些调试语句来检查输出,并提供了一个参考
——————————–
调试[1622528110]押品:2000000000
调试[1622528110]ss:F541F372005BEEB8952F964EA638527341C3B3A6EEBB0C009E4F092BD6C1B0E16225281102000000E2CFE3F576DA4999EA2268224F34EFDD3B0D567841D561B41B3AB67976C977D1
调试[1622528110]哈希:e4b0d1b01a99d00e44d41eeb37c81d19940bf71270994fff53ea5caa1c79f663
调试[1622528110]coinstakeTime:1622528110
调试[1622528110]编号:419654358
调试[1622528110]哈希证明:e4b0d1b01a99d00e44d41eeb37c81d19940bf71270994fff53ea5caa1c79f663
调试[1622528110]桩修改器:F541F372005BEEB8952F964EA638527341C3B3A6EEBB0C009E4F092BD6C1B0E
调试[1622528110]主节点ID:e2cfe3f576da4999ea2268224f34efdd3b0d567841d561b41b3ab67976c977d1
这是我在python中的试用
导入binascii
导入hashlib
定义旋转(x):
s2=bytearray.fromhex(x)
s2.反向()
返回binascii.hexlify(s2).decode()
def PADHEAX(s):
返回s[2:].zfill(16)
def CalcKernelHash(stakeModifier、coinstakeTime、masternodeId):
stakeModifier=binascii.unhexilify(stakeModifier)
coinstakeTime=binascii.unhexilify(“%x”%coinstakeTime)
抵押品=binascii.unhexlify(“0%x”%2000000000)
masternodeId=binascii.unhexlify(masternodeId)
bin_s=存储修改器[::-1]+coinstakeTime[::-1]+抵押品[::-1]+主节点ID[::1]
打印(纸盒)
返回rotate(hashlib.sha256(hashlib.sha256(bin\s).digest()).hexdigest())
CalcKernelHash(’F541F372005BEEB8952F964EA638527341C3B3A6EEBB0C009E4F092BD6C1B0E’,1622528110’,e2cfe3f576da4999ea2268224f34efdd3b0d567841d561b41b3ab67976c977d1’)
当我使用调试输出中的参数执行时
CalcKernelHash(’F541F372005BEEB8952F964EA638527341C3B3A6EEBB0C009E4F092BD6C1B0E’,1622528110’,e2cfe3f576da4999ea2268224f34efdd3b0d567841d561b41b3ab67976c977d1’)
‘f01ba34ac7a897a1e37d61bac3a8ea6f0126c2ae883a2d75dab1f407d40aad0b’
我应该在哪里获得e4b0d1b01a99d00e44d41eeb37c81d19940bf71270994fff53ea5caa1c79f663的哈希证明

编辑:
bin\u s返回b’\x0e\x1bl\xbd\x92\xf0\xe4\t\x03\x0c\xbb\xee\xa6\xb3\xc3AsR8\xa6N\x96/\x95\xb8\xee[\x00r\xf3A\xf5n\xd0\xb5`\x00 J\xa9\xd1\x01\xe2\xcf\xe3\xf5v\xdaI\x99\xea“h”O4\xef\xdd;)\rVxA\xd5a\xb4\x1b:\xb6yv\xc9w\xd1′
编辑2:
哈希定义
/**计算对象的256位哈希*/
模板<T1型>
inline uint256散列(const T1 pbegin,const T1 pend)
{
static const unsigned char pblank[1]={};
uint256结果;
CHash256().Write(pbegin==pend?)pblank:(const unsigned char*)&amp;pbegin[0],(pend pbegin)*sizeof(pbegin[0])
.Finalize((unsigned char*)和result);
返回结果;
}
蟒蛇
sha256型
c级++
分享
打印此问题
跟随
%1小时前
6小时前问的
克里斯
12344青铜徽章
新贡献者
你能用python打印垃圾箱吗?调试散列不匹配的最佳方法是在5小时前将完整数据打印为散列(称为preimage)–mccc
修改了答案-克里斯5小时前
你好,我几乎解决了这个问题,但有一个问题:2000000000的附带价值,可能是十六进制字节数组,是奇数长度???3小时前的MCCCS
我认为是原图印刷不好的情况。你能为(auto i:ss)std::cout<<std::hex<<i;作为哈希计算前的单行调试语句,并在此处添加其输出?—作为哈希计算前的单行调试语句,并在此处添加其输出?3小时前的MCCCS
它只输出垃圾!#c#b“~tW还添加了散列定义–Chris 3小时前
再显示4条评论
1个答案
1
def CalcKernelHash(stakeModifier、coinstakeTime、masternodeId):
stakeModifier=binascii.unhexilify(stakeModifier)
coinstakeTime=binascii.unhexlify(十六进制(coinstakeTime)[2:])
抵押品=binascii.unhexilify(“0000000000204A9D1010000”)
masternodeId=binascii.unhexlify(masternodeId)
bin_s=存储修改器[::-1]+coinstakeTime[::-1]+抵押品[::1]+主节点ID[::-1]
打印(binascii.hexlify(bin_s))
返回rotate(hashlib.sha256(hashlib.sha256(bin\s).digest()).hexdigest())
分享
改进这个答案
跟随
%1小时前
%1小时前
监控化学品
913855金徽章2222银徽章5454铜徽章
就是这样。如何正确地序列化字符串,使其得到与c++中uint256类型相同的结果?stakeModifier的调试输出是它的ToString()版本。克里斯4小时前
@Chris你能给我完整的python源代码吗(Full=可以运行的代码,但不是软件的全部源代码。例如,我需要4小时前运行这个python代码的代码
在上面编辑。在上面编辑。所需要的只是导入hashlib和binascii–Chris 4小时前
好极了!谢谢-克里斯一小时前
不客气!MCCCS 1小时前
添加评论

时光素材-香车美女  (19)blockchainBTC比特币区块链www.qkl91.com

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注