第05讲:隔离见证(SegWit)技术
💡 自学入门
Web3
不是一件容易的事,作为一个刚刚入门 Web3 的新人,梳理一下最简单直观的Web3
小白入门教程。整合开源社区优质资源,为大家从入门到精通 Web3 指路。每周更新 1-3 讲。欢迎关注我的推特:@bhbtc1337
进入微信交流群请填表:表格链接
文章开源在 GitHub:Get-Started-with-Web3
目录
- 前言:比特币为什么需要"减肥"?
- 交易延展性:快递包裹被恶意篡改的烦恼
- 隔离见证:巧妙的包装分离术
- 权重系统:重新定义区块"大小"
- 费用优化:为什么SegWit更便宜
- 技术实现:深入SegWit机制
- 向后兼容:软分叉的智慧
- 常见问题
- 结语
前言:比特币为什么需要"减肥"?
想象你经营一家快递公司,每天要处理数万个包裹,但运输车辆的载重有限。随着业务增长,你面临了两个严重问题:
问题1:包裹太重了
- 每个包裹里有50%是商品,50%是各种证明文件(收据、签名、身份证复印件等)
- 运输效率低下,成本居高不下
- 客户抱怨运费太贵
问题2:包裹编号不稳定
- 包裹编号基于整个包裹内容计算
- 恶意的人可以修改证明文件的格式(不影响有效性)
- 导致包裹编号改变,追踪系统混乱
这就是2017年比特币面临的现实问题:
- 交易拥堵:1MB区块限制导致网络拥堵
- 手续费暴涨:从几美分涨到几十美元
- 交易延展性:影响闪电网络等技术发展
比特币需要一次"减肥手术",这就是隔离见证(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构建应用
- 闪电网络等Layer2技术无法实现
- 智能合约功能受限
数学原因:
传统交易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
- 为Layer2技术提供稳定基础
- 解决了延展性问题
向后兼容:软分叉的智慧
为什么选择软分叉?
比特币网络有数万个节点,强制所有人同时升级是不现实的。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如何解决区块容量问题?
容量提升机制:
理论最大:4MB(如果区块只包含witness数据)
实际情况:1.7-2MB(混合交易类型)
计算例子:
传统1MB区块:约4,400笔交易
SegWit区块:约6,900笔交易
提升:约55%
为什么不是4倍提升?
- 不是所有交易都使用SegWit
- SegWit交易仍有基础数据部分
- 实际使用中的混合情况
❓ SegWit对闪电网络有什么影响?
关键作用:
闪电网络需要:
- 稳定的交易ID来跟踪通道状态
- 预签名交易不被延展性攻击
- 安全的资金托管机制
SegWit提供:
✅ 交易ID稳定性
✅ 费用降低
✅ 容量提升
✅ 为Layer2奠定基础
技术依赖:
闪电网络的承诺交易(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