主页 > imtoken钱包官网下载2.0 > 详解比特币交易签名流程
详解比特币交易签名流程
2021-09-08
最近在研究比特币交易签名的计算比特币的计算过程包括,网上没有完整介绍签名过程的例子。 本文试图提供一个完整的例子,详细介绍比特币签名的计算过程。
一、比特币交易格式 交易数据格式
大小字段名称数据类型描述
4-byte protocol version uint32_t 指定该事务引用的规则协议的版本号
1-9 bytes input quantity var_int 包含的输入交易数量
不确定的输入列表 tx_in[] 一个或多个输入事务的数组
1-9 字节输出数量 var_int 包含的输出交易数量
不确定的输出列表 tx_out[] 一个或多个输出事务的数组
4 字节锁定时间 uint32_t 一个 UNIX 时间戳或块号
tx_in 格式
其中 tx_in 包括:
字段大小
描述
数据类型
阐明
36
前一个输出
出点
参考以前的输出
1+
脚本长度
var_int
签名脚本长度
签名脚本
字符[]
确认交易授权的计算脚本
4个
顺序
unit32_t
用于锁定时间或禁用 (0xFFFFFFFF)
OutPoint结构的组成:
字段大小
描述
数据类型
阐明
32
散列
字符[32]
引用交易的哈希值
4个
指数
uint32_t
指定输出的索引,第一个输出的索引为0,以此类推
tx_out的组成:
字段大小
描述
数据类型
阐明
8个
价值
uint64_t
交易的比特币数量(以 0.00000001 为单位)
1+
pk_script
var_int
pk_script 的长度
pk_script
字符[]
通常包含公钥作为比特币脚本设置条件来声明此输出
2.签名计算:
将其他输入pkscripts的长度调整为0比特币的计算过程包括,在末尾加上四字节little-endian的sighash_type,执行两次sha256:
对这个hash进行签名计算得到签名数据(签名时不需要计算hash,直接调用ecdsa-sign-digest即可)
3.计算示例
使用 electrum 生成的无符号数据示例:
0100000001b37b9eefc3fa245f5ce36cb51c2d18a2d16e19d20867b23130e00f5280ccf82d010000002401ff210395cf5234e602954cba693138f3ba94c1cde7337675f5a94931e6226802d74d16fdffffff02002d3101000000001976a91425dc469afb4654d27742e3669bb3f5812268f2a188ac9ec2c901000000001976a9142dbbbd8bcff08a549be21efae747592049c9dc2d88ac71221300
签名数据:
0100000001b37b9eefc3fa245f5ce36cb51c2d18a2d16e19d20867b23130e00f5280ccf82d010000006a47304402202008714016f7e01c1a0010d7e6eb0b1f100b5a9b7c65a0506d62c1fbb9790cb102203daf6363c4039a739036ce152817f73d31319f060bbf5f354a0eeaf9f7ed3cd001210395cf5234e602954cba693138f3ba94c1cde7337675f5a94931e6226802d74d16fdffffff02002d3101000000001976a91425dc469afb4654d27742e3669bb3f5812268f2a188ac9ec2c901000000001976a9142dbbbd8bcff08a549be21efae747592049c9dc2d88ac71221300
交易记录:
计算过程:
协议版本:01000000
输入数量:01
输入列表:
b37b9eefc3fa245f5ce36cb51c2d18a2d16e19d20867b23130e00f5280ccf82d
(默认是big endian,如果想上网查详情,就用little endian
2df8cc80520fe03031b26708d2196ed1a2182d1cb56ce35c5f24fac3ef9e7bb3)
OP_DUP (76) OP_HASH160 (a9) 20 字节数据 (14)
2dbbbd8bcff08a549be21efae747592049c9dc2d OP_EQUALVERIFY (88) OP_CHECKSIG (ac)
1976a9142dbbbd8bcff08a549be21efae747592049c9dc2d88ac
输出数量:02
输出列表:
锁定时间:71221300
HashType:01000000(四个字节)
两个哈希值(405c87d455f2f26e554c05b657769e2af253135367bcc69d4d772f873d39a23c)
执行两次sha256后,调用ecdsa_verify_digest计算签名。 数据经过两次sha256哈希后不需要计算签名
签名值:r、s:
2008714016f7e01c1a0010d7e6eb0b1f100b5a9b7c65a0506d62c1fbb9790cb1
3daf6363c4039a739036ce152817f73d31319f060bbf5f354a0eeaf9f7ed3cd0
pubk 是 0395cf5234e602954cba693138f3ba94c1cde7337675f5a94931e6226802d74d16
分类:
技术要点:
相关文章: