好好学习,天天向上

  • 后端开发
    • Rust
  • 区块链
    • BTC
    • Layer2
  • 经济投资
  • 文学创作
    • 哲学思考
    • 随笔
HhxxTtxs
人生到处知何似,应似飞鸿踏雪泥。
  1. 首页
  2. 区块链
  3. BTC
  4. 正文

比特币脚本pkScript与signScript解读

5 8 月, 2024 767点热度 0人点赞 0条评论

以下是一个P2PKH类型的比特币交易,这里记录下交易信息中的pkScript和signScript字段的解码含义。(比特币脚本OP_CODE 16进制对照表见: https://wiki.bitcoinsv.io/index.php/Opcodes_used_in_Bitcoin_Script)

内容 隐藏
1 交易数据如下:
2 pkscript
2.1 解析
2.2 整体说明
2.3 用途
3 signScript
3.1 解锁脚本解析
3.2 整体解析
3.3 执行过程
4 结论

交易数据如下:

{
  "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)脚本,常用于比特币交易。详细解析每个部分如下:

  1. 76 (OP_DUP):
    • 这个操作码将栈顶元素复制一次。即它会复制公钥并将副本推送到堆栈顶部。
  1. a9 (OP_HASH160):
    • 这个操作码对栈顶元素进行SHA-256和RIPEMD-160的双重哈希计算。通常用于对公钥进行哈希,生成公钥哈希(PubKeyHash)。
  1. 14:
    • 这是一个数据长度字段,表示接下来的数据长度为20字节。14是十六进制数,转换为十进制就是20。这意味着接下来的20字节就是公钥哈希。
  1. a0a82a7bac78569ce1ea49b697eea51c41ebdf2a:
    • 这20字节是公钥哈希(PubKeyHash),对应的是一个比特币地址的哈希。这是我们要支付给的地址的哈希值。
  1. 88 (OP_EQUALVERIFY):
    • 这个操作码会将栈顶的两个元素进行比较,如果相等则继续执行脚本,否则脚本失败。
  1. ac (OP_CHECKSIG):
    • 这个操作码会从堆栈中取出公钥和签名,使用公钥对交易的签名进行验证。如果签名有效,返回true,否则返回false。

整体说明

76a914a0a82a7bac78569ce1ea49b697eea51c41ebdf2a88ac可以分解成以下步骤:

  1. 76 (OP_DUP):复制栈顶的公钥。
  2. a9 (OP_HASH160):对栈顶的公钥进行RIPEMD-160(SHA-256(pubkey))哈希计算。
  3. 14:数据长度字段,表示接下来的20字节是哈希值。
  4. a0a82a7bac78569ce1ea49b697eea51c41ebdf2a:这20字节是公钥哈希(PubKeyHash)。
  5. 88 (OP_EQUALVERIFY):将栈顶的两个元素进行比较,如果相等则继续执行。
  6. ac (OP_CHECKSIG):验证签名是否有效。

用途

这个脚本的用途是锁定比特币到一个公钥哈希上,只有具有对应私钥的人才能解锁并花费这些比特币。具体执行过程如下:

  1. 当有人想要花费这些比特币时,他们需要提供一个解锁脚本(scriptSig),其中包含公钥和签名。
  2. 比特币脚本执行解锁脚本和锁定脚本,将提供的公钥和签名推入堆栈。
  3. 脚本执行OP_DUP复制公钥。
  4. 执行OP_HASH160对公钥进行双重哈希计算。
  5. 将计算结果与锁定脚本中的公钥哈希进行比较(OP_EQUALVERIFY)。
  6. 如果匹配,执行OP_CHECKSIG验证签名是否有效。

signScript

比特币的解锁脚本(signScript)用于解锁比特币交易输出中的锁定脚本(pkScript)。这里的解锁脚本是:

483045022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c71102200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d22430012103b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1

解锁脚本解析

解锁脚本通常包括签名和公钥。让我们逐步解析这个解锁脚本:

  1. 48:这是签名字节长度,表示接下来的签名数据长度为0x48字节(72字节)。
  2. 3045022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c71102200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d2243001:
    • 这是签名数据,DER编码的ECDSA签名。
    • 3045:表示这是一个DER编码签名。
    • 022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c711:这是签名的一部分(r值)。
    • 02200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d224300:这是签名的另一部分(s值)。
    • 01:这是哈希类型(Hash Type),表示这是一个SIGHASH_ALL。
  1. 21:这是公钥字节长度,表示接下来的数据长度为0x21字节(33字节)。
  2. 03b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1:
    • 这是公钥数据,压缩格式的公钥。
    • 03:表示这是一个压缩格式的公钥,Y坐标的前缀。
    • b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1:这是公钥的X坐标。

整体解析

于是这个解锁脚本包含了以下部分:

  1. 48:签名长度字段,表示接下来的数据长度是72字节。
  2. 3045022100cc1c03cf0ce22994a706b0274bf3d4a7d9ceb203a828b70a45531e698680c71102200aad893eb2928f9cd4ea48eae2437700a5516fabd1b13dd1419b584e09d2243001:这是ECDSA签名数据,包含r值和s值以及哈希类型。
  3. 21:公钥长度字段,表示接下来的数据长度是33字节。
  4. 03b4a98edeb16a5e868fa215dddf7a2ad864ff3c61cd2c0ac0b0f46b6898f8fdd1:这是压缩格式的公钥。

执行过程

解锁脚本和锁定脚本结合在一起执行,执行过程如下:

  1. 解锁脚本(scriptSig):
    • 推送签名到堆栈。
    • 推送公钥到堆栈。
  1. 锁定脚本(pkScript):
    • OP_DUP:复制栈顶的公钥。
    • OP_HASH160:对栈顶的公钥进行RIPEMD-160(SHA-256(pubkey))哈希计算。
    • 将计算结果与锁定脚本中的公钥哈希进行比较(OP_EQUALVERIFY)。
    • 如果匹配,执行OP_CHECKSIG验证签名是否有效。

结论

这个加密/解锁脚本提供了一个P2PKH(Pay-to-PubKey-Hash)的比特币交易脚本。其中解锁脚本需要与锁定脚本结合在一起,通过一系列的堆栈操作和哈希验证,确保只有拥有相应私钥的人才能花费这些比特币。这种机制确保了比特币交易的安全性和不可篡改性。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 区块链 比特币
最后更新:5 8 月, 2024

hhxxttxs

五年服务端开发,现专职区块链,偏零知识Layer2工程方向

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

Archives

  • 2026 年 2 月
  • 2025 年 9 月
  • 2025 年 8 月
  • 2025 年 7 月
  • 2025 年 1 月
  • 2024 年 9 月
  • 2024 年 8 月
  • 2024 年 7 月
  • 2024 年 6 月
  • 2024 年 5 月
  • 2024 年 4 月
  • 2024 年 3 月

Categories

  • BTC
  • cuda
  • L2
  • rust
  • 其他
  • 区块链
  • 后端开发
  • 哲学思考
  • 文学创作
  • 算法
  • 经济投资
  • 链开发
  • 零知识

COPYRIGHT © 2024 好好学习,天天向上. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang