Skip to content

Latest commit

 

History

History
544 lines (416 loc) · 15.3 KB

File metadata and controls

544 lines (416 loc) · 15.3 KB

第 05 讲:隔离见证 (SegWit) 技术

status author date difficulty

💡 自学入门 Web3 不是一件容易的事,作为一个刚刚入门 Web3 的新人,梳理一下最简单直观的 Web3 小白入门教程。整合开源社区优质资源,为大家从入门到精通 Web3 指路。每周更新 1-3 讲。

欢迎关注我的推特:@bhbtc1337

进入微信交流群请填表:表格链接

文章开源在 GitHub:Get-Started-with-Web3

购买 BTC / ETH / USDT 等加密货币推荐 币安注册链接

目录

  • [前言:比特币为什么需要「减肥」?](# 前言比特币为什么需要减肥)
  • [交易延展性:快递包裹被恶意篡改的烦恼](# 交易延展性快递包裹被恶意篡改的烦恼)
  • [隔离见证:巧妙的包装分离术](# 隔离见证巧妙的包装分离术)
  • [权重系统:重新定义区块「大小」](# 权重系统重新定义区块大小)
  • [费用优化:为什么 SegWit 更便宜](# 费用优化为什么 segwit 更便宜)
  • [技术实现:深入 SegWit 机制](# 技术实现深入 segwit 机制)
  • [向后兼容:软分叉的智慧](# 向后兼容软分叉的智慧)
  • [常见问题](# 常见问题)
  • [结语](# 结语)

前言:比特币为什么需要「减肥」?

想象你经营一家快递公司,每天要处理数万个包裹,但运输车辆的载重有限。随着业务增长,你面临了两个严重问题:

** 问题 1:包裹太重了 **

  • 每个包裹里有 50% 是商品,50% 是各种证明文件(收据、签名、身份证复印件等)
  • 运输效率低下,成本居高不下
  • 客户抱怨运费太贵

** 问题 2:包裹编号不稳定 **

  • 包裹编号基于整个包裹内容计算
  • 恶意的人可以修改证明文件的格式(不影响有效性)
  • 导致包裹编号改变,追踪系统混乱

这就是 2017 年比特币面临的现实问题:

  • ** 交易拥堵 **:1 MB 区块限制导致网络拥堵
  • ** 手续费暴涨 **:从几美分涨到几十美元
  • ** 交易延展性 **:影响闪电网络等技术发展

比特币需要一次「减肥手术」,这就是隔离见证 (SegWit) 的诞生背景。

交易延展性:快递包裹被恶意篡改的烦恼

什么是交易延展性?

想象你寄了一个快递包裹:

包裹内容:一台笔记本电脑
包裹编号:ABC123(基于整个包裹内容计算)
证明文件:收据、保修卡、发票

** 延展性攻击场景:**

1. 你:寄出包裹,记录编号 ABC123
2. 恶意快递员:修改收据的字体格式(内容不变,但外观不同)
3. 结果:包裹编号变成 XYZ789
4. 你:用 ABC123 追踪包裹 → 查不到!
5. 但是:包裹内容完全没变,笔记本电脑安全送达

** 比特币中的实际情况:**

1. Alice:发送交易,交易 ID = A1B2C3...
2. 恶意节点:修改签名的 DER 编码格式
3. 结果:交易 ID 变成 D4E5F6...
4. Alice:用 A1B2C3 查询交易 → 查不到!
5. 但是:转账成功,Bob 收到了比特币

延展性问题的危害

** 对普通用户:**

  • 交易追踪困难
  • 钱包显示错误
  • 用户体验差

** 对开发者:**

  • 无法依赖交易 ID 构建应用
  • 闪电网络等 Layer 2 技术无法实现
  • 智能合约功能受限

** 数学原因:**

传统交易 ID = SHA256 (版本 + 输入 + 输出 + 锁定时间 + 签名数据)
                                                        ↑
                                                   可被修改的部分

隔离见证:巧妙的包装分离术

核心思想:分离证明和内容

继续快递公司的比喻,SegWit 提出了巧妙的解决方案:

SegWit 的创新包装方式:

主包裹:📦 [笔记本电脑 + 基本信息]
证明袋:📋 [收据 + 签名 + 身份证明]

包裹编号:只基于主包裹内容计算
优势:
- 证明文件被修改不影响包裹编号
- 主包裹更轻便,运输效率更高
- 但所有东西都还在,没有丢失任何信息

SegWit 交易结构对比

** 传统交易:**

{
  "txid": "计算时包含签名",
  "vin": [{
    "scriptSig": "签名 + 公钥 + 其他证明" // 很长的证明数据
  }],
  "vout": [...]
}

SegWit 交易:

{
  "txid": "计算时不包含 witness",
  "vin": [{
    "scriptSig": "简短的 witness 程序引用"
  }],
  "vout": [...],
  "witness": [
    ["签名", "公钥", "其他证明"]  // 证明数据被「隔离」
  ]
}

「隔离」的真实含义

⚠️ 重要澄清:

  • ** 不是删除 **:witness 数据依然完整存储在区块中
  • ** 不是压缩 **:数据大小本身没有变小
  • ** 而是分离 **:改变了数据的组织和计算方式

** 比喻说明:**

就像重新设计包裹格式:
原来:[商品 + 证明文件] 混合打包
现在:[商品] + [证明文件] 分开包装

好处:
- 商品包裹编号稳定(交易 ID 稳定)
- 证明文件占用「便宜运输」(费用降低)
- 整体运输效率提升(容量增加)

权重系统:重新定义区块「大小」

为什么需要新的度量标准?

SegWit 引入了一个全新概念:** 权重 (Weight)**,重新定义了区块的「大小」限制。

** 传统限制:**

区块最大限制 = 1,000,000 字节

SegWit 新规则:

区块最大限制 = 4,000,000 权重单位

权重计算公式:
权重 = (基础交易数据 × 4) + (witness 数据 × 1)

权重系统的巧妙设计

** 设计思路:给不同数据不同的「价格」**

基础交易数据:每字节 = 4 权重单位(昂贵)
Witness 数据:每字节 = 1 权重单位(便宜)

就像航空行李收费:
- 必需品(衣服):正常价格
- 非必需品(礼品):优惠价格

** 实际计算例子:**

一笔简单的 SegWit 交易:
- 基础数据:118 字节 × 4 = 472 权重
- Witness 数据:107 字节 × 1 = 107 权重
- 总权重:579 权重
- 等效大小:579 ÷ 4 = 144.75 字节

对比传统交易 225 字节,节省约 35%!

深入技术细节:权重计算算法

** 完整权重计算公式:**

对于每个交易:

if (交易有 witness 数据):
    base_size = 交易大小 - witness 数据大小
    witness_size = witness 数据大小
    weight = base_size × 4 + witness_size × 1
else:
    weight = 交易大小 × 4

区块权重 = sum (所有交易权重)
区块权重限制 = 4,000,000

** 虚拟大小 (vSize) 概念:**

vSize = ceil (weight / 4)

意义:等效的传统交易大小
用途:费用计算和容量估算

费用优化:为什么 SegWit 更便宜

费用计算方式的革命

** 传统费用计算:**

矿工费 = 交易字节数 × 费率 (sat /byte)

例子:225 字节交易 × 20 sat /byte = 4,500 sat

SegWit 费用计算:

矿工费 = 虚拟大小 (vSize) × 费率 (sat /vbyte)

例子:579 权重 ÷ 4 = 145 vbytes × 20 sat /vbyte = 2,900 sat

节省:4,500 - 2,900 = 1,600 sat (35%)

不同交易类型的节省效果

交易类型 传统大小 SegWit 权重 vSize 费用节省
简单转账 225 字节 579 权重 145 字节 35%
2-of-3 多签 400 字节 1,312 权重 328 字节 18%
复杂脚本 500 字节 1,400 权重 350 字节 30%

** 长期累积效应:**

  • 个人用户:每年节省数十美元手续费
  • 企业用户:每年节省数千美元
  • 全网络:每天节省数百万美元

技术实现:深入 SegWit 机制

地址格式革新

** 三种 SegWit 地址格式:**

格式 前缀 全称 特点
P2WPKH bc1q Pay to Witness PubKey Hash 原生 SegWit,最高效
P2WSH bc1q Pay to Witness Script Hash 原生 SegWit 多签
P2SH-P2WPKH 3 SegWit wrapped in P2SH 兼容旧钱包

SegWit 交易结构示例

** 原生 SegWit 交易 (P2WPKH):**

{
  "txid": "c3d4e5f6a7b8...",
  "vout": 0,
  "scriptSig": {
    "asm": "",
    "hex": ""
  },
  "witness": [
    "3045022100d1e2f3a4b5c6...",  // 签名
    "0279be667ef9dcbb..."          // 压缩公钥
  ],
  "sequence": 4294967293
}

** 关键观察:**

  • **scriptSig 为空 **:所有证明数据都在 witness 中
  • **witness 数据 **:包含签名和公钥,但不影响交易 ID
  • **sequence 值 **:4294967293 表示支持 RBF (费用替换)

深入技术:见证脚本执行

P2WPKH 脚本执行过程:

传统 P2PKH 需要的脚本:
scriptSig: [签名] [公钥]
scriptPubKey: OP_DUP OP_HASH160 <pubkey_hash> OP_EQUALVERIFY OP_CHECKSIG

SegWit P2WPKH 的简化:
scriptSig: 空
scriptPubKey: OP_0 <pubkey_hash>
witness: [签名] [公钥]

执行时:将 witness 数据作为 P2PKH 脚本执行

** 安全性保障:**

  • 相同的签名验证算法
  • 相同的密码学安全性
  • 只是数据组织方式不同

交易 ID 计算方式变更

** 技术对比:**

传统交易 ID 计算:
txid = SHA256 (SHA256 (完整交易数据))

SegWit 交易 ID 计算:
txid = SHA256 (SHA256 (交易数据 - witness 部分))

结果:
- witness 数据修改不影响 txid
- 为 Layer 2 技术提供稳定基础
- 解决了延展性问题

向后兼容:软分叉的智慧

为什么选择软分叉?

比特币网络有数万个节点,强制所有人同时升级是不现实的。SegWit 通过软分叉实现了优雅升级:

** 软分叉的巧妙设计:**

老节点看 SegWit 交易:
「这个交易的输出脚本是 OP_0 < 数据 >」
「我不认识这个新格式,但协议说这种交易『任何人都可以花费』」
「既然有人花费了,说明是有效的,我接受」

新节点看 SegWit 交易:
「这是 SegWit 格式,我需要验证 witness 数据」
「签名正确,公钥匹配,交易有效」

升级过程的数据

SegWit 采用时间线:

2017 年 8 月:SegWit 激活(0% 使用率)
2018 年:约 15% 使用率
2019 年:约 40% 使用率
2020 年:约 60% 使用率
2024 年:约 80% 使用率

** 采用障碍:**

  • 钱包软件需要更新支持
  • 用户教育和接受过程
  • 交易所和服务商迁移

兼容性矩阵

发送者 接收者 兼容性 费用效率
传统 传统 正常
传统 SegWit 正常
SegWit 传统 部分优化
SegWit SegWit 最优

实际应用示例

创建 SegWit 地址

# 生成 native SegWit 地址
segwit_address = rpc.getnewaddress ("","bech32")
print (f"SegWit 地址: {segwit_address}")

# 地址特点:bc1q 开头,费用最低

SegWit 交易费用对比

# 费用节省计算
def calculate_fee_savings (traditional_size, segwit_weight, fee_rate):
    traditional_fee = traditional_size * fee_rate
    segwit_fee = (segwit_weight / 4) * fee_rate
    savings = traditional_fee - segwit_fee
    return savings, (savings /traditional_fee) * 100

# 示例:简单转账
savings, percentage = calculate_fee_savings (225, 579, 20)
print (f"费用节省: {savings} sat ({percentage:.1f}%)")

常见问题

❓ SegWit 数据真的存储在区块链上吗?

** 绝对是的!** 这是最常见的误解。

误解:SegWit 把签名数据存储在区块链外
事实:所有数据都在区块链上,只是组织方式不同

比喻:
误解的想法:把快递包裹拆分,一部分寄丢了
实际情况:重新包装,但所有东西都在同一辆运输车上

❓ 为什么 witness 数据「便宜 4 倍」?

** 设计哲学:**

基础交易数据(输入输出):核心信息,全价收费
Witness 数据(签名证明):辅助信息,折扣收费

目的:
1. 激励使用 SegWit 格式
2. 提高网络整体效率
3. 为未来升级留出空间

** 数学逻辑:** 权重系统确保:

  • 老交易:权重 = 大小 × 4(没有变化)
  • 新交易:权重 = 基础 × 4 + witness × 1(更优惠)

❓ SegWit 如何解决区块容量问题?

** 容量提升机制:**

理论最大:4 MB(如果区块只包含 witness 数据)
实际情况:1.7 - 2 MB(混合交易类型)

计算例子:
传统 1 MB 区块:约 4,400 笔交易
SegWit 区块:约 6,900 笔交易
提升:约 55%

** 为什么不是 4 倍提升?**

  • 不是所有交易都使用 SegWit
  • SegWit 交易仍有基础数据部分
  • 实际使用中的混合情况

❓ SegWit 对闪电网络有什么影响?

** 关键作用:**

闪电网络需要:
- 稳定的交易 ID 来跟踪通道状态
- 预签名交易不被延展性攻击
- 安全的资金托管机制

SegWit 提供:
✅ 交易 ID 稳定性
✅ 费用降低
✅ 容量提升
✅ 为 Layer 2 奠定基础

** 技术依赖:**

闪电网络的承诺交易 (Commitment Transaction):
- 必须有稳定的交易 ID
- 需要预先签名但延后广播
- 任何 ID 变化都会破坏安全模型

SegWit 解决了这个根本问题!

❓ 如何迁移到 SegWit?

** 迁移策略:**

个人用户:
1. 升级钱包软件
2. 生成 SegWit 地址
3. 将资金转移到 SegWit 地址

企业用户:
1. 评估现有系统兼容性
2. 测试环境验证
3. 分批迁移资金
4. 更新内部系统

** 迁移收益:**

  • 立即享受费用折扣
  • 提高交易优先级
  • 支持未来新功能

结语

SegWit 技术展现了比特币社区解决复杂技术问题的智慧和能力:

🎯 核心价值

  • ** 问题解决 **:优雅地解决了交易延展性和容量问题
  • ** 向前兼容 **:为闪电网络和 Taproot 等技术铺平道路
  • ** 经济效益 **:降低了用户的交易成本
  • ** 技术示范 **:证明了软分叉升级的可行性

🌟 设计哲学

SegWit 体现了几个重要的设计理念:

  • ** 渐进改进 **:不是推倒重来,而是优化现有系统
  • ** 向后兼容 **:确保网络稳定,避免分裂
  • ** 经济激励 **:通过费用优势推动技术采用
  • ** 长远视野 **:为未来技术发展预留空间

🚀 历史意义

SegWit 的成功激活证明了:

  • 比特币可以在保持去中心化的同时实现重大升级
  • 技术社区能够达成共识并推动创新
  • 软分叉是处理争议性升级的有效方式

当你使用 bc1 开头的 SegWit 地址时,你不仅在节省手续费,更是在参与一个历史性的技术升级。每一笔 SegWit 交易,都是对比特币技术进步的贡献。

在 Web3 的世界里, SegWit 代表着这样一种精神:通过巧妙的技术创新,我们可以在不牺牲安全性和去中心化的前提下,持续改进和优化系统。

🌟 ** 完整代码示例 **:本章涉及的所有 SegWit 操作代码实现请查看:segwit_examples.py