以下是一个P2PKH类型的比特币交易,这里记录下交易信息中的pkScript和signScript字段的解码含义。(比特币脚本OP_CODE 16进制对照表见: https://wiki.bitcoinsv.io/index.php/Opcodes_used_in_Bitcoin_Script)
交易数据如下:
{
"txid": "17d568fc91ffc51cd554e08f59db77b204c4a8a49e0b404af9eb5fdeebd3d303",
"size": 223,
"version": 1,
"locktime": 0,
"fee": 2230,
"inputs": [
{
"coinbase": false,
"txid": "1791529d02204891dd3f42412e08055f310ae8d1a0eb11eff4c84ee1a4ed3a50",
"output": 1,
"sigscript": "483045022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c71102200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d22430012103b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1",
"sequence": 4294967295,
"pkscript": "76a914a0a82a7bac78569ce1ea49b697eea51c41ebdf2a88ac",
"value": 98871,
"address": "1FeUa4wNZfDdt474PRwtBPPprinEHDmADd",
"witness": []
}
],
"outputs": [
{
"address": "bc1qgl3y3nrznamdmmlvtr9gd9us82p34uz883a55t",
"pkscript": "001447e248cc629f76ddefec58ca8697903a831af047",
"value": 23000,
"spent": false,
"spender": null
},
{
"address": "1CDWiDh3566yFqQ5RaPqfZmy4JJSJmFX42",
"pkscript": "76a9147b072d274528006299b6ef8cb26a20704e3ae2c188ac",
"value": 73641,
"spent": false,
"spender": null
}
],
"block": {
"height": 855143,
"position": 7
},
"deleted": false,
"time": 1722646677,
"rbf": false,
"weight": 892
}
交易来源
我们来看inputs UTXO中的pkscript和sigscript,其中pkscript是16进制的加密脚本,sigscript是16进制的解密脚本,其解码之后的数据解读见下文。
pkscript
解析
比特币交易的输出脚本(pkScript)可以用来指定锁定条件,只有满足这些条件才能花费这些比特币。这里的pkScript:76a914a0a82a7bac78569ce1ea49b697eea51c41ebdf2a88ac是一个典型的P2PKH(Pay-to-PubKey-Hash)脚本,常用于比特币交易。详细解析每个部分如下:
- 76 (
OP_DUP):
-
- 这个操作码将栈顶元素复制一次。即它会复制公钥并将副本推送到堆栈顶部。
- a9 (
OP_HASH160):
-
- 这个操作码对栈顶元素进行
SHA-256和RIPEMD-160的双重哈希计算。通常用于对公钥进行哈希,生成公钥哈希(PubKeyHash)。
- 这个操作码对栈顶元素进行
- 14:
-
- 这是一个数据长度字段,表示接下来的数据长度为20字节。
14是十六进制数,转换为十进制就是20。这意味着接下来的20字节就是公钥哈希。
- 这是一个数据长度字段,表示接下来的数据长度为20字节。
- a0a82a7bac78569ce1ea49b697eea51c41ebdf2a:
-
- 这20字节是公钥哈希(PubKeyHash),对应的是一个比特币地址的哈希。这是我们要支付给的地址的哈希值。
- 88 (
OP_EQUALVERIFY):
-
- 这个操作码会将栈顶的两个元素进行比较,如果相等则继续执行脚本,否则脚本失败。
- ac (
OP_CHECKSIG):
-
- 这个操作码会从堆栈中取出公钥和签名,使用公钥对交易的签名进行验证。如果签名有效,返回
true,否则返回false。
- 这个操作码会从堆栈中取出公钥和签名,使用公钥对交易的签名进行验证。如果签名有效,返回
整体说明
76a914a0a82a7bac78569ce1ea49b697eea51c41ebdf2a88ac可以分解成以下步骤:
- 76 (
OP_DUP):复制栈顶的公钥。 - a9 (
OP_HASH160):对栈顶的公钥进行RIPEMD-160(SHA-256(pubkey))哈希计算。 - 14:数据长度字段,表示接下来的20字节是哈希值。
- a0a82a7bac78569ce1ea49b697eea51c41ebdf2a:这20字节是公钥哈希(PubKeyHash)。
- 88 (
OP_EQUALVERIFY):将栈顶的两个元素进行比较,如果相等则继续执行。 - ac (
OP_CHECKSIG):验证签名是否有效。
用途
这个脚本的用途是锁定比特币到一个公钥哈希上,只有具有对应私钥的人才能解锁并花费这些比特币。具体执行过程如下:
- 当有人想要花费这些比特币时,他们需要提供一个解锁脚本(scriptSig),其中包含公钥和签名。
- 比特币脚本执行解锁脚本和锁定脚本,将提供的公钥和签名推入堆栈。
- 脚本执行
OP_DUP复制公钥。 - 执行
OP_HASH160对公钥进行双重哈希计算。 - 将计算结果与锁定脚本中的公钥哈希进行比较(
OP_EQUALVERIFY)。 - 如果匹配,执行
OP_CHECKSIG验证签名是否有效。
signScript
比特币的解锁脚本(signScript)用于解锁比特币交易输出中的锁定脚本(pkScript)。这里的解锁脚本是:
483045022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c71102200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d22430012103b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1
解锁脚本解析
解锁脚本通常包括签名和公钥。让我们逐步解析这个解锁脚本:
- 48:这是签名字节长度,表示接下来的签名数据长度为
0x48字节(72字节)。 - 3045022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c71102200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d2243001:
-
- 这是签名数据,DER编码的ECDSA签名。
3045:表示这是一个DER编码签名。022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c711:这是签名的一部分(r值)。02200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d224300:这是签名的另一部分(s值)。01:这是哈希类型(Hash Type),表示这是一个SIGHASH_ALL。
- 21:这是公钥字节长度,表示接下来的数据长度为
0x21字节(33字节)。 - 03b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1:
-
- 这是公钥数据,压缩格式的公钥。
03:表示这是一个压缩格式的公钥,Y坐标的前缀。b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1:这是公钥的X坐标。
整体解析
于是这个解锁脚本包含了以下部分:
- 48:签名长度字段,表示接下来的数据长度是72字节。
- 3045022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c71102200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d2243001:这是ECDSA签名数据,包含r值和s值以及哈希类型。
- 21:公钥长度字段,表示接下来的数据长度是33字节。
- 03b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1:这是压缩格式的公钥。
执行过程
解锁脚本和锁定脚本结合在一起执行,执行过程如下:
- 解锁脚本(scriptSig):
-
- 推送签名到堆栈。
- 推送公钥到堆栈。
- 锁定脚本(pkScript):
-
OP_DUP:复制栈顶的公钥。OP_HASH160:对栈顶的公钥进行RIPEMD-160(SHA-256(pubkey))哈希计算。- 将计算结果与锁定脚本中的公钥哈希进行比较(
OP_EQUALVERIFY)。 - 如果匹配,执行
OP_CHECKSIG验证签名是否有效。
结论
这个加密/解锁脚本提供了一个P2PKH(Pay-to-PubKey-Hash)的比特币交易脚本。其中解锁脚本需要与锁定脚本结合在一起,通过一系列的堆栈操作和哈希验证,确保只有拥有相应私钥的人才能花费这些比特币。这种机制确保了比特币交易的安全性和不可篡改性。
文章评论