编写第一个比特币交易 #1

如果用代码构建一个比特币交易

比特币区块链技术的核心业务无疑是构建 交易。我将向你展示编写你自己的 P2PKH 交易所需的步骤,这是一种你在区块链中最常见的标准交易。

如何构建 P2PKH 交易

为了构建交易,仅有一个 ECDSA 密钥对是不够的。我们需要密钥对的区块链历史,或者更确切地说,发送价值到与我们的密钥对关联的地址的交易。然后,我们将使用 ECDSA 私钥为这些交易输出生成签名,使它们成为我们交易的输入。

给定:

  • 一个 ECDSA 密钥对 K
  • 一个第三方 P2PKH 输出地址 A
  • 要转移的聪数量 S

我们希望通过我们的密钥对 KS 聪发送到地址 A 。以下是总体步骤:

  1. 扫描区块链以查找与_K_相关的 UTXO。
  2. SA 构建一个交易输出。
  3. 从 UTXO 中收集足够的输入价值以达到 S
  4. 为每个输入生成其签名的主题。
  5. 为每个输入主题生成 ECDSA 签名。
  6. 打包交易。

让我们从 ex-tx-build.c 开始。

UTXO 集合

在 ECDSA 密钥对历史的最开始,派生的 P2PKH 地址没有与之关联的交易输出,因此在区块链上没有比特币价值。当有人后来发布一笔交易将比特币发送到我们的地址时,该密钥对突然变得有价值。考虑我们现在著名的测试网地址:

mqMi3XYqsPvBWtrJTk8euPWDVmFTZ5jHuK

及其区块链历史 。在所有交易中, 三个输出在撰写本文时仍未花费:

  1. f34e1c37e736...a2f3
  2. 65216856608d...20c6
  3. 6b580bada66e...3934

总计 0.951 BTC 输出值(= 95100000 聪)。具体来说,这些是发送资金到我们地址的输出:

  • 交易 1 的第一个输出(0.87 BTC)。
  • 交易 2 的第一个输出(0.001 BTC)。
  • 交易 3 的第二个输出(0.08 BTC)。

如果你现在将这些词语转换为数据结构:

  • <f34e1c37e736...a2f3, 0>
  • <65216856608d...20c6, 0>
  • <6b580bada66e...3934, 1>

你就拥有了我们的密钥对/钱包的 UTXO outpoints (输出点) 。除了构成钱包的余额外,UTXO 集合的重要性在于它包含了我们可以重用来构建我们自己交易的输出点。在交易输入中花费一个 UTXO 后,它将从集合中移除,因为 UTXO 总是被完全花费。

值得一提的是,扫描 UTXO 需要大量的网络代码,因此从网络浏览器构建钱包历史是一个快速的替代方案。不过,这会让你付出一些隐私代价,因为你通常不希望与不受信任的服务共享你的地址。

目标输出

你现在应该知道如何构建一个 P2PKH 交易输出。假设我们想发送 0.251 BTC(25100000 聪,小端序):

e0 fe 7e 01 00 00 00 00

到这个地址:

mhmhRnN58ki9zbRJ63mpNGQXoYvdMXZsXt

它解码为以下 hash160 摘要:

18 ba 14 b3 68 22 95 cb
05 23 0e 31 fe cb 00 08
92 40 66 08

这是我们交易的第一个输出:


/* value (0.251 BTC) */
e0 fe 7e 01 00 00 00 00

/* script length */
19

/* P2PKH scri...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论