golang 实现比特币内核:数字签名的编码算法
对于签名,我们不能使用SEC进行编码,因为r和s之间没有密切的关系,你知道其中一个,但不能推导出另一个。我们可以使用一种称为DER(Distinguished Encoding Rules)的方案来编码签名。以下是签名编码的步骤:
将第一个字节设置为0x30
第二个字节为签名的长度(通常是0x44或0x45)
第三个字节设置为0x02,这是一个标记,表明接下来的字节是用于r的。
将r转换为字节数组,如果r的第一个字节大于或等于0x80,则在字节数组的开头添加一个字节0x00,计算字节数组的长度,将长度值附加在步骤3中的标记字节0x02之后,并在长度值后附加字节数组。
在步骤4的字节数组末尾添加一个标记字节0x02。
按照步骤4中的方式添加s。
我们需要对r和s的长度进行编码,因为r和s最多可以有32个字节,但有时它们的长度可能会比这短。让我们看一个r和s的编码示例:
30 45 02 21 00 ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f 02 20 7a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed
第一个字节是0x30,如上所述,第二个字节是0x45,即r和s的总长度。第三个字节是标记0x02