bips/bip-0144.mediawiki,位于 vault · jl2012/bips

  • jl2012
  • 发布于 2025-06-29 20:20
  • 阅读 27

该BIP (Bitcoin Improvement Proposal) 定义了用于传播交易和区块的新消息和序列化格式,这些交易和区块提交给隔离见证结构。它详细说明了交易和区块的序列化格式更新,节点如何通过服务位来声明对见证的支持,以及如何计算包含见证数据的新哈希。此外,还定义了新的inv类型,用于在getdata请求中获取见证交易和区块。

跳转到内容

jl2012/ bips Public

forked from bitcoin/bips

折叠文件树

文件

vault

搜索此仓库

/

bip-0144.mediawiki

复制路径

BlameMore file actions

BlameMore file actions

最近提交

meshcollidermeshcollider

Change "inefficinent" => "inefficient" in BIP 144

Aug 23, 2017

bf85f30 · Aug 23, 2017

历史

历史

Open commit details

View commit history for this file.

127 lines (102 loc) · 5.19 KB

/

bip-0144.mediawiki

顶部

文件元数据和控制

  • 预览

  • 代码

  • Blame

127 lines (102 loc) · 5.19 KB

Raw

Copy raw file

Download raw file

Outline

Edit and raw actions

  BIP: 144
  Layer: Peer Services
  Title: Segregated Witness (Peer Services)
  Author: Eric Lombrozo <elombrozo@gmail.com>
          Pieter Wuille <pieter.wuille@gmail.com>
  Comments-Summary: No comments yet.
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0144
  Status: Draft
  Type: Standards Track
  Created: 2016-01-08
  License: PD
## Table of Contents<br>Permalink: Table of Contents<br>- Abstract<br>- Motivation<br>- Specification <br> - Serialization<br> - Handshake<br> - Hashes<br> - Relay<br>- Credits<br>- Reference Implementation<br>- Copyright

摘要

Permalink: Abstract

此 BIP 定义了新的消息和序列化格式,用于传播提交到隔离见证结构的交易和区块。

动机

Permalink: Motivation

除了定义见证结构并要求在未来的区块中进行提交(BIP141 - 共识 segwit BIP)之外,还必须定义新的机制,以允许节点声明对隔离见证的支持,并中继见证结构并从其他节点请求它们,而不会破坏与旧节点的兼容性。

规范

Permalink: Specification

序列化

Permalink: Serialization

向点对点协议添加了一种新的 tx 消息序列化格式。

序列化具有以下结构:

字段大小 名称 类型 描述
4 version int32_t 交易数据格式版本
1 marker char 必须为零
1 flag char 必须为非零
1+ txin_count var_int 交易输入数量
41+ txins txin[] 一个或多个交易输入的列表
1+ txout_count var_int 交易输出数量
9+ txouts txouts[] 一个或多个交易输出的列表
1+ script_witnesses script_witnesses[] 作为序列化字节数组的见证结构
4 lock_time uint32_t 区块号或时间戳,直到交易被锁定

支持此 BIP 的解析器将能够区分旧的序列化格式(没有见证)和这个格式。 marker 字节设置为零,以便此结构永远不会在不支持此 BIP 的解析器中解析为有效的交易。如果解析成功,则此类交易将不包含输入和单个输出。

如果见证为空,则应使用旧的序列化格式。

目前,唯一支持的见证对象类型是脚本见证,它由字节数组堆栈组成。它被编码为一个 var_int 项目计数,后跟每个编码为 var_int 长度的项目,后跟一个字节字符串。每个 txin 都有自己的脚本见证。脚本见证的数量没有明确编码,因为它由 txin_count 暗示。空脚本见证被编码为零字节。脚本见证的顺序与关联的 txin 的顺序相同。

  • 没有具有自己的序列化的独立消息类型的理由:这将需要单独的 “tx” 和 “block” 消息,并且所有在原始交易上运行的 RPC 调用都需要重复,或者需要低效或不确定的猜测来知道要使用哪种类型。
  • 不只使用单个 0x00 字节作为标记的理由:这将导致空交易(没有输入,没有输出,这在某些测试中使用)被解释为新的序列化数据。
  • 中间的 0x01 标志字节的理由:这将使我们能够轻松地向交易添加更多额外的未提交数据(如 txout 被花费,...)。它可以解释为一个位向量。

握手

Permalink: Handshake

节点将使用以下服务位来表明它可以提供见证

    NODE_WITNESS = (1 &lt;&lt; 3)

哈希

Permalink: Hashes

在交易默克尔树和 txin 输出点中使用的交易哈希始终使用旧的非见证序列化计算。

添加了对包含见证数据的新哈希的支持,该哈希是从新的见证序列化计算得出的。(请注意,具有空见证的交易始终使用旧的序列化,因此,它们具有与普通哈希相等的见证哈希。)

中继

Permalink: Relay

添加了新的 inv 类型 MSG_WITNESS_TX (0x40000001, or (1<<30)+MSG_TX) 和 MSG_WITNESS_BLOCK (0x40000002, or (1<<30)+MSG_BLOCK) ,仅用于 getdata。库存消息本身仍然只使用 MSG_TX 和 MSG_BLOCK,类似于 MSG_FILTERED_BLOCK。进一步的 inv 类型 MSG_FILTERED_WITNESS_BLOCK (0x40000003, or (1<<30)+MSG_FILTERED_BLOCK) 被保留供将来使用。

  • 不在 invs 中声明 witnessness 的理由:我们不再总是使用 invs(使用 'sendheaders' BIP 130), 加上它没有用:隐式地,每个交易和区块都有一个见证,旧的只是空的。

MSG_WITNESS_TX getdata 请求应使用非见证序列化的哈希。节点应使用 tx 消息进行响应,如果见证结构为非空,则应使用见证序列化。

MSG_WITNESS_BLOCK 请求将返回一个区块消息,其中包含使用见证序列化具有见证的交易。

鸣谢

Permalink: Credits

特别感谢 Gregory Maxwell 提出了此 BIP 中的许多想法,并感谢 Luke-Jr 弄清楚了如何将其部署为软分叉。

参考实现

Permalink: Reference Implementation

bitcoin/bitcoin#8149

版权

Permalink: Copyright

本文档置于公共领域。

  • 原文链接: github.com/jl2012/bips/b...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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