You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
将解锁脚本按照PUSHDATA的规则解析成两个字段:
Signature=483045022100ea03e8414011fffc00f10a25a771076ee1cb4b0b24a02607c67462009e3d2c1d022070a7a1c74e6bb71c32d78043bccf7bbc353334eb6e517162b2270c85d6bb54d201
Public Key=21030b461bf0f1253c9dacde9992594042d77798c5f0e7c76a1c587518606fb35478
解析一下Signature:
48 // PUSHDATA
3045022100
ea03e8414011fffc00f10a25a771076ee1cb4b0b24a02607c67462009e3d2c1d // signature r
0220
70a7a1c74e6bb71c32d78043bccf7bbc353334eb6e517162b2270c85d6bb54d2 // signature s
01 // SIGHASH
脚本格式
P2PKH的锁定脚本为:
P2PKH的解锁脚本为:
脚本参数解释
脚本中的常量值
PUSHDATA
PUSHDATA封装格式为:
Signature的格式
Signature的格式为DER(r,s) + SIGHASH
DER的封装格式
DER是ASN1数据格式中的一种,DER的封装规则还没有搞太明白,但是数据结构可解,开头是固定值0x30,后面0x45为后续数据长度,0x0220或者0x022100后面就是签名值r和s。
DER的java代码实现:
SIGHASH
SIGHASH是签名哈希类型。
Public Key
Public Key有两种表示方式,分别是非压缩格式和压缩格式,这两种方式算出来的比特币地址不同,所以不能混用。
压缩格式就是数据中只有公钥的X,没有Y。压缩公钥以0x21开头,0x02或0x03代表Y值在X轴的上方还是下方,后面是X点的数据(32 bytes)。示例:
非压缩格式的数据,开头是0x41,0x04,后面紧跟着X点的数据(32 bytes)和Y点的数据(32 bytes)。示例:
示例
比特币testnet的一笔交易示例:912d470a1178ac09e31c43ee5696138fc51e94c7834864ed5c8eff29e5f54370
通过blockcypher的API接口可以拿到更加详细的JSON数据
这笔交易的JSON返回数据:
解析交易中的hex原始数据(如何解析比特币中的交易原始数据rawData):
这是一笔普通地址转账给普通地址的交易,正好用来解释P2PKH的锁定脚本和解锁脚本。
锁定脚本
例子中,锁定脚本为:
对照锁定脚本的格式,可以解析这段脚本如下:
公钥HASH值的计算方法
按常理来说,公钥HASH值计算方法是拿到公钥的byte数据做SHA256,再做RIPEMD160计算,结果为20字节HASH值。
但是这里做的是转账,输入项肯定只有转账地址
n1NSP78VQ5iZqVVRMA9ZZ2r77eeGLnwdj8
。因为地址就是公钥的HASH值再加入一个头的network type和最后的四个字节checkSum后做base58生成的,所以可以反向操作:将比特币地址
n1NSP78VQ5iZqVVRMA9ZZ2r77eeGLnwdj8
进行base58解码,得到:6fd9c637cc30bb0fe9add3a185c1f5d884d12b7b783bcba0fb
,其中0x6f
代表是测试网络地址。将上面的结果去掉一字节头和尾部4字节校验和,得到:d9c637cc30bb0fe9add3a185c1f5d884d12b7b78
,即为公钥HASH值解锁脚本
例子中,解锁脚本为:
将解锁脚本按照PUSHDATA的规则解析成两个字段:
Signature=
483045022100ea03e8414011fffc00f10a25a771076ee1cb4b0b24a02607c67462009e3d2c1d022070a7a1c74e6bb71c32d78043bccf7bbc353334eb6e517162b2270c85d6bb54d201
Public Key=
21030b461bf0f1253c9dacde9992594042d77798c5f0e7c76a1c587518606fb35478
解析一下Signature:
解析一下Public Key:
The text was updated successfully, but these errors were encountered: