我目前正在用c ++创建一个简单的比特币挖掘器,并需要一些帮助来优化它的一部分。
我有一个十六进制值的字符串,由于需要在其上运行OpenSSL sha256哈希函数,因此将其解析为二进制(下面的代码)。我需要连续进行sha256散列,但是每次需要递增十六进制值的最后8个字符。
目前我这样做是通过将二进制值转换回十六进制值,将其最后8个字符转换为long,增加long,然后再将整个事物转换回二进制,这当然效率极低。
递增二进制值的最佳方法是什么?
// parse an hexidemical string into a binary format
void toBytes(std::string input,unsigned char *result){
for(int i=0, j=0; i < input.size(); j++, i+=2) {
std::string twoChars = input.substr(i,2);
result[j] = (unsigned char)std::stoi(twoChars,0,16);
}
}
// converts a binary unsigned char into a hexademical string
std::string toHex(unsigned char* data, int len) {
std::string result("");
char buf[2];
int c;
c=0;
while(c < len) {
sprintf(buf,"%.2x", data[c++]);
result+=buf;
}
return result;
}
这是我现在的,非常低效的补充:
void addNonce(unsigned char * binary, int length) {
std::string hex = toHex(binary, length);
std::string nonceString = hex.substr(152,8);
long nonce = std::strtol(hex.substr(152,8).c_str(),NULL,16 );
nonce++;
char buf[8];
sprintf(buf, "%.8lx", nonce);
hex.replace(152,8,buf);
toBytes(hex,binary);
}
以下是十六进制格式的增量示例(我需要增加一次,然后哈希,再次递增,哈希,直到最大值):
020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051a00000000
020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051a00000001
最高值
020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051aFFFFFFFF
答案 0 :(得分:2)
得到了你。
void addNonce(unsigned char * binary, int length) {
unsigned long *nonce = (unsigned long*) &binary[length-4];
(*nonce)++;
}
我认为这(或非常类似的东西)是你正在寻找的东西。我不是100%在二进制数组中的数组位置,但怀疑它是好的。
当nonce的值溢出时,它应该被重置为0.我不确定这是否是所需的行为,但是如果需要另一个结果,那么在nonce周围添加一点点溢出保护不应该是昂贵的