讲一下签名
解锁脚本里的签名有三个作用:
身份认证:花的钱是我的
交易认证:这笔交易我是承认的
内容校验:交易内容不得更改
一个关键字段:Hash Type
它决定了交易的哪些部分被签名,未被签名的地方则支持修改
基本hash Type有三种:
SIGHASH_ALL,SIGHASH_SINGLE,SIGHASH_NONE
后缀ALL,SINGLE,NONE对应的是该签名要包含的交易输出个数,也就是说他们影响的是交易输出
SIGHASH_ALL
Signature Computation计算步骤:
1. 用输入对应的输出脚本(要去除OP_CODESEP ARATOR操作码)替换要签名的解锁脚本,注意长度也要重新计算。
2. 其他输入的解锁脚本清空
3. 对灰色部分做sha256^2
SIGHASH_SINGLE
Signature Computation步骤:
1. 同上
2. 将剩余输入的sequence设为0
3. 将#vout设为当前签名输入的n+1
4. 当前输出之前的vout清空(其中nValue 置为-1,其余字符置为nil)
注意的是这种签名类型只签名了与输入对应的输出。
什么叫对应?就是vin0的签名签的是vout0,vin1-->vout1
SIGHASH_NONE
Signature Computation步骤看图,就是一个输出都不签
SIGHASH_ANYONECANPAY
这是个修饰符,必须和上面三种类型共同使用,影响了交易输入,该修饰符表示签名时只签正在被签名的输入本身,其他输入不在签名范围内,anyone can pay,who cares
步骤:
1. 基于上面各类型的步骤
2. #vin置为1
3. 移除该签名输入外的其他输入
最后说下根据hash值怎么算签名
Signature Computation步骤:把hashtype接到交易后面后算hash256^2值,然后算个签名,把签名der编码,然后把hashtype的最后一字节接到签名后,ok
把签名类型也保护起来了
还有一个fork id签名,后续补充进来
下一节我说下为什么有这么多签名,怎么玩
网友评论