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

![status](https://img.shields.io/badge/状态-已完成-success)
![author](https://img.shields.io/badge/作者-beihaili-blue)
![date](https://img.shields.io/badge/日期-2025--06-orange)
![difficulty](https://img.shields.io/badge/难度-中级-yellow)

> 💡 自学入门 `Web3` 不是一件容易的事，作为一个刚刚入门 Web3 的新人，梳理一下最简单直观的 `Web3` 小白入门教程。整合开源社区优质资源，为大家从入门到精通 Web3 指路。每周更新 1-3 讲。
> 
> 欢迎关注我的推特：[@bhbtc1337](https://twitter.com/bhbtc1337)
> 
> 进入微信交流群请填表：[表格链接](https://forms.gle/QMBwL6LwZyQew1tX8)
> 
> 文章开源在 GitHub：[Get-Started-with-Web3](https://github.com/beihaili/Get-Started-with-Web3)
> 
> 购买 BTC / ETH / USDT 等加密货币推荐 [币安](https://www.binance.com/zh-CN)[注册链接](https://www.bsmkweb.cc/register?ref=39797374)

## 目录

- [前言：比特币为什么需要「减肥」？](# 前言比特币为什么需要减肥)
- [交易延展性：快递包裹被恶意篡改的烦恼](# 交易延展性快递包裹被恶意篡改的烦恼)
- [隔离见证：巧妙的包装分离术](# 隔离见证巧妙的包装分离术)
- [权重系统：重新定义区块「大小」](# 权重系统重新定义区块大小)
- [费用优化：为什么 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 交易结构对比

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

**SegWit 交易：**
```json
{
  "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)：**
```json
{
  "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 地址

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

# 地址特点：bc1q 开头，费用最低
```

### SegWit 交易费用对比

```python
# 费用节省计算
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](./segwit_examples.py)

---

<div align="center">
<a href="https://github.com/beihaili/Get-Started-with-Web3">🏠 返回主页 </a> | 
<a href="https://twitter.com/bhbtc1337">🐦 关注作者 </a> | 
<a href="https://forms.gle/QMBwL6LwZyQew1tX8">📝 加入交流群 </a>
</div>
