矿池给矿工下发任务有个headerHash,不知道如何计算
你说的是 pow_hash 吧?
pow_hash 是通过 Block header 上的 calc_pow_hash 这个方法计算出来的:
这个方法实现就是把 header 序列化后的 bytes 做一次 blake2b:
因为序列化的方案最近才最终确定,这部分的相关文档正在陆续补上。
-
矿池下发任务给矿工有个参数header_hash, 这个是序列号之后调用blake2b算法得到一个32字节的hash, 如何进行序列化,
例如:调用get_block_template获取挖矿任务有以下字段需要序列号:“version”: “0”,
“difficulty”: “0x35a9ae20a27f”,
“parent_hash”: “0x42ec33072ad79065ccf587fa24e2825e93f8688a27862c0bf029b2dac9491956”,
“timestamp”: “1568087566567”,
“number”: “33849”,
“epoch”: “22”,
“dao”: “0x01000000000000000af1677430652600768065bdfc3b440000ff61346d330100”,序列化操作是否如下? 下面哪些字段长度是固定? 如果是固定的固定的长度是多少,是否需要补0
version: 占一个字节?, 序列后16进制表示为:0x00
difficulty: 序列后16进制表示为:0x35a9ae20a27f
parent_hash: 序列后16进制表示为:0x42ec33072ad79065ccf587fa24e2825e93f8688a27862c0bf029b2dac9491956
timestamp: 序列后16进制表示为:0x01 6d 19 4d 68 e7
number:序列后16进制表示为:0x84 39
epoch: 序列后16进制表示为:0x16
dao: 序列后16进制表示为:0x01000000000000000af1677430652600768065bdfc3b440000ff61346d330100序列化的结果:把上面所有的字段依次保存到uint8_t buf[] 中
-
调用blake2b算法生成header_hash:
而blake2b算法有几个可以设置的参数:personal, salt, key,这几个需要设置多少,或者默认值0就行?
是否可以这样调用:key="", keylen=0
int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
这里是 Java SDK 实现 Transaction 结构序列化的代码,希望可以供你参考
“version”: “0”,
“difficulty”: “0x35a9ae20a27f”,
“parent_hash”: “0x42ec33072ad79065ccf587fa24e2825e93f8688a27862c0bf029b2dac9491956”,
“timestamp”: “1568087566567”,
“number”: “33849”,
“epoch”: “22”,
“dao”: “0x01000000000000000af1677430652600768065bdfc3b440000ff61346d330100”,
上面是get_block_template获取的一部分字段数据,用于计算head_hash,上面的数据序列化之后,我得到:0x0000000035a9ae20a27f42ec33072ad79065ccf587fa24e2825e93f8688a27862c0bf029b2dac94919560000016d194d7aad0000000000008439000000000000001601000000000000000af1677430652600768065bdfc3b440000ff61346d330100, 不知道是否正确?
由于 SDK 中目前只对 Transaction 和 Script 结构进行了序列化操作,Header 暂时没有处理(考虑到 SDK 一侧暂时不需要对 Header 进行序列化),不过你可以将通过 SDK 提供的模板得到序列化结果与 CKB 链上做交叉验证,如果 CKB 能反序列化成功,或者其他方式验证通过,那就说明序列化结果是对的。
get_block_template 获取任务如下,使用C语言,如何计算head_hash?
{
“jsonrpc”: “2.0”,
“result”: {
“bytes_limit”: “1024”,
“cellbase”: {
“cycles”: null,
“data”: {
“cell_deps”: [],
“header_deps”: [],
“inputs”: [{
“previous_output”: {
“index”: “4294967295”,
“tx_hash”: “0x0000000000000000000000000000000000000000000000000000000000000000”
},
“since”: “33849”
}],
“outputs”: [{
“capacity”: “86517358461”,
“lock”: {
“args”: [“0xddc1ddf9c135061b7635ca51e735fc2b03cee339”],
“code_hash”: “0x1892ea40d82b53c678ff88312450bbb17e164d7a3e0a90941aa58839f56f8df2”,
“hash_type”: “type”
},
“type”: null
}],
“outputs_data”: [“0x”],
“version”: “0”,
“witnesses”: [{
“data”: [“0x54811ce986d5c3e57eaafab22cdd080e32209e39590e204a99b32935f835a13c01”, “0xc61a169ab30e7de7ceff6c3a75733d99fe742a8c”]
}]
},
“hash”: “0xaa7f936c172f5fe7e2ae30c726ba44d8ac0a22dd77f43a2a1b3534648f0c17b6”
},
“current_time”: “1568087571117”,
“cycles_limit”: “51673900000”,
“dao”: “0x01000000000000000af1677430652600768065bdfc3b440000ff61346d330100”,
“difficulty”: “0x35a9ae20a27f”,
“epoch”: “22”,
“number”: “33849”,
“parent_hash”: “0x42ec33072ad79065ccf587fa24e2825e93f8688a27862c0bf029b2dac9491956”,
“proposals”: [],
“transactions”: [],
“uncles”: [],
“uncles_count_limit”: “2”,
“version”: “0”,
“work_id”: “0”
},
“id”: 2
}
header_hash = blake2b(serialize(header))
你需要先对 header 结构体本身做序列化,然后对序列化的结果进行 blake2b 计算。可以参考 SDK 中 transaction_hash 的计算过程。
get_block_template 没有header结构体
header对应get_block_template的哪些字段,字段长度多少
同问,我们也是卡在 header_hash不知道如何从get block template信息中得到
blake2b调用已经搞定