深入比特币交易内部

深入比特币交易内部结构,这是构建比特币交易的基础

万事俱备,我们准备检查比特币交易的组成部分。还将练习一些 C 代码来完成我们的主要任务,即手动编写一个原始交易。

不幸的是,交易和脚本有点像鸡和蛋的关系。无论你从哪个主题开始,你都需要对另一个有基本的了解才能开始。我选择最后讲交易,因为我喜欢这种自下而上的方法,但我不得不假设一些概念——比如输入和输出——这些将在最后部分变得清晰。

交易数据结构

这就是一个交易所包含的内容:

  • 一些常量值。
  • 一个或多个输入的数组。
  • 一个或多个输出的数组。

在编写原始交易之前,我将描述在 tx.h 中定义的数据结构。不用说,所有数字字段都将以小端序列化。

输出

交易输出是实际持有比特币价值的链上实体:

typedef struct {
    uint64_t value;
    uint64_t script_len;
    uint8_t *script;
} bbp_txout_t;

value字段是以聪为单位的转移比特币金额,script_len(varint)加上script(字节数组)字段是一个包含输出脚本代码的变长数据。脚本包含了以后赎回输出价值的指令。在一个交易中,每个输出都有一个索引,即它在输出数组中的偏移量。

Outpoint

任何非 coinbase 的比特币交易(见下一节),必须引用一个或多个之前挖出的交易,因为交易的作用是将币从一些输出移动到其他输出。一个_outpoint_是一个固定结构,表示指向现有交易输出的指针:

typedef struct {
    uint8_t txid[32];
    uint32_t index;
} bbp_outpoint_t;

不出所料,txid字段是所引用交易的 hash256 标识符(小端序),而index是交易输出数组中输出的 0 基偏移量。

输入

交易输入是能够从之前未花费的输出(也称为 UTXO)中赎回价值的实体:

typedef struct {
    bbp_outpoint_t outpoint;
    uint64_t script_len;
    uint8_t *script;
    uint32_t sequence;
} bbp_txin_t;

outpoint字段是指向我们想要花费的 UTXO 的指针。script_len(变长整数)加上script(字节数组)字段是一个包含输入脚本的变长数据,预期与 UTXO 脚本一起成功。sequence字段留给高级操作,大多数情况下你只需将其设置为ffffffff

交易

现在所有子组件都已描述,这里是一个区块链交易的布局:

typedef struct {
    uint32_t version;
    uint64_t inputs_len;
    bbp_txin_t *inputs;
    uint64_t outputs_len;
    bbp_txout_t *outputs;
    uint32_t locktime;
} bbp_tx_t;

交易的version是由网络共识确定的,目前是常量1。我暂时不会覆盖locktime,只需将其设置为零。当序列化时,输入和输出数组前面会有一个变长整数宣布它们的数量。

序列...

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

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
Davide De Rosa
Davide De Rosa
江湖只有他的大名,没有他的介绍。