比特币以太坊验证交易签名

1 ,比特币验证签名

比特币在 BIP66中对签名数据格式采用严格的DER编码格式,其签名数据格式如下

0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S]

这里的 0x30 、0x02 是DER数据格式中定义的Tag,不同Tag对应不同含义。以 secp256k1 算法来说

total-length: 1字节,表示签名字节总长度,其值等于:4byte(Tag total-length 后面的四个Tag)+R的长度+S的长度。而secp256k1算法是256长度,即32字节。因此签名字节总长度为0x44(68=4+32+32)。
R-length: 1字节,表示R值长度。其值始终等于0x20(表示十进制32)。
R: 32字节,secp256k1 算法中的R值。
S-length: 1字节,表示S值长度。始终等于0x20。
S:32字节,secp256k1 算法中的S值。

我们看一笔比特币具体的交易
{
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
"vout": 0,
"scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.01500000,
"scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": 0.08450000,
"scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
}
]
}

scriptSig是解锁脚本
scriptPubKey是锁定脚本

锁定脚本里面含有输出的对象的公钥的hash,也就是地址反base58编码

解锁脚本需要证明自己拥有锁定脚本的使用权。解锁脚本携带者自己的公钥和签名(签名是私钥签名),

首先使用公钥进行hash。跟锁定脚本比较一下是否相等。如果相等就证明此公钥就是锁定脚本里需要的公钥。

然后在把此公钥验证一下签名,就能证明这个交易构造是由此私钥产生的

比特币签名过程

image.png

大写的P值的是前面生成的随机公钥,P其实是一个坐标点(为什么是这样参考椭圆曲线算法,也可以看看前面我给出的文章)
Hash(M)是用哈希函数计算一个合同的哈希值,也可以加做计算合同的数字指纹
dA是你自己的私钥,这是保密的,不能给别人泄露的,泄漏了别人就可以伪造了
p是我们在椭圆曲线中,选定有限域的时候选定好的一个大整数
R是临时随机密钥对中公钥P的x坐标
提醒
其中的k的-1次方并不是我们高中所学的就是等于1/k,这里的-1次方是值得是k的逆元。如果要真正理解逆元的概念推荐去学一下离散数学。这里就不过多的解释了。


image.png

我们可以把这个数字签名加上合同M发给别人了,然后别人就可以用你的公钥和合同还有签名就可以验证这个合同了,具体的验证如下


image.png

这样把别人发来的合同和签名,在加上签名着的公钥(公钥匙公开的,这里不讨论怎么获取到签名者对应的公钥),把这些东西向上面计算出一个P'出来,然后得到一个P'的x坐标x',然后对比R和x'是否相等,那么验证签名成功,那就说明这合同是某某人发出来的,并且没有被篡改
下面我给大家证明下这个为什么成立(数学要求比较强,可忽略)


image.png

以太坊验证过程

以太坊中对内容签名时,尚未进行DER格式。同样在以太坊中对字符串ethereum签名。

对比比特币签名,以太坊的签名格式是r+s+v。 r 和 s 是ECDSA签名的原始输出,而末尾的一个字节为 recovery id 值,但在以太坊中用V表示,v 值为1或者0。recovery id 简称 recid,表示从内容和签名中成功恢复出公钥时需要查找的次数(因为根据r值在椭圆曲线中查找符合要求的坐标点可能有多个),但在比特币下最多需要查找两次。这样在签名校验恢复公钥时,不需要遍历查找,一次便可找准公钥,加速签名校验速度

image.png

上图中还有一个关键数据,则 Signer 是如何生成 R 、S、V值的。从前面的签名算法过程,可以知道 R 和 S 是ECDSA签名的原始输出,V 值是 recid,其值是0或者1。但是在交易签名时,V 值不再是recid, 而是 recid+ chainID*2+ 35。比如:
recid不是0就是1用来判断是点Y的正轴和负轴。然后还可以恢复出chainID判断是在哪个网络里发生的交易,避免重放攻击。

签名交易后,如何才能获得交易签名者呢?这个是加密算法的逆向解签名者,是利用用户签名内容以及签名信息(R、S、V)得到用户私钥的公钥,从而得到签名者账户地址

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容