第07讲:高级交易应用
💡 自学入门
Web3
不是一件容易的事,作为一个刚刚入门 Web3 的新人,梳理一下最简单直观的Web3
小白入门教程。整合开源社区优质资源,为大家从入门到精通 Web3 指路。每周更新 1-3 讲。欢迎关注我的推特:@bhbtc1337
进入微信交流群请填表:表格链接
文章开源在 GitHub:Get-Started-with-Web3
目录
前言
在前面的章节中,我们学习了多重签名、SegWit、Taproot和Ordinals等核心技术。现在,我们将深入探讨比特币的高级交易应用,包括复杂交易类型、地址格式演进和各种高级交易场景。
本章将涵盖比特币交易系统的进阶功能,这些技术为比特币生态系统提供了强大的扩展性和灵活性,为Layer 2解决方案和其他创新应用奠定了坚实基础。
复杂交易类型分析
OP_RETURN输出(自定义数据存储)
重要说明:OP_RETURN 是交易输出(Outputs)的一种特殊类型!
{
"value": 0.00000000,
"n": 3,
"scriptPubKey": {
"asm": "OP_RETURN 48656c6c6f20426974636f696e",
"hex": "6a0d48656c6c6f20426974636f696e",
"type": "nulldata"
}
}
分析:
- 这就是一个标准的交易输出,和P2PKH输出结构完全一样
value
: 0 BTC(无价值转移,专门用于数据存储)n
: 3(这是交易的第4个输出,索引从0开始)- scriptPubKey:锁定脚本,这里是OP_RETURN类型
48656c6c6f20426974636f696e
解码后是"Hello Bitcoin"- 这种输出无法被花费,数据永久保存在区块链上
📊 比特币交易结构总览
比特币交易 = {
交易元数据: {
version: 交易版本
locktime: 锁定时间
}
输入数组: [
{ txid, vout, scriptSig, sequence },
{ txid, vout, scriptSig, sequence },
...
]
输出数组: [ ← OP_RETURN在这里!
{ value, scriptPubKey }, ← 普通P2PKH输出
{ value, scriptPubKey }, ← 多签P2SH输出
{ value, scriptPubKey }, ← OP_RETURN输出(存储数据)
...
]
}
💡 这就是自定义数据的存储方式!
常见用途:
- 📝 留言:在转账时附上文字信息
- 🏷️ 标记:记录交易用途或分类
- 📄 文档哈希:存储文件的哈希值作为存在性证明
- 🎨 艺术创作:一些早期的区块链艺术项目
限制:
- 最多存储 80字节 的数据
- 需要支付少量手续费
- 数据一旦上链就无法修改或删除
🔍 实际案例分析
让我们看一个真实的OP_RETURN交易:
交易ID: 4b72a223b2d45ea382...
OP_RETURN数据: "区块链永远记住这一刻!2024年新年快乐!"
这笔交易的发送者花费了少量手续费,在比特币区块链上永久记录了这条新年祝福。任何人都可以通过区块浏览器查看这条信息,它将永远存在于区块链上。
其他复杂交易类型
1. 多重输出交易
单笔交易包含多个输出:
- 主输出:支付给接收方
- 找零输出:返回给发送方
- 数据输出:OP_RETURN存储信息
- 费用输出:支付给矿工
2. 批量交易
企业级应用场景:
- 工资发放:一笔交易支付多个员工
- 分红分配:向多个股东分发收益
- 空投活动:向多个地址发送代币
地址格式演进
比特币地址格式发展历程
格式 | 地址示例 | 脚本类型 | 特点 |
---|---|---|---|
Legacy (P2PKH) | 1BoatSLRH... | P2PKH | 最原始格式,兼容性最好 |
Script (P2SH) | 3AnNyxwq... | P2SH | 支持多签名等复杂功能 |
SegWit (Bech32) | bc1q40x77y... | P2WPKH | 手续费最低,最高效 |
Taproot (Bech32m) | bc1p5d7rj... | P2TR | 最新格式,隐私性更好 |
🔗 技术演进对比
比特币地址格式演进:
Legacy (2009):
地址:1abc...
特点:基础功能,大小较大
P2SH (2012):
地址:3abc...
特点:支持多签,但隐私性差
SegWit (2017):
地址:bc1qabc...
特点:降低费用,解决延展性
Taproot (2021):
地址:bc1pabc...
特点:最佳隐私 + 效率 + 智能合约
📊 采用情况
Taproot采用率:
2021年11月(激活):0%
2022年:5-10%
2023年:15-25%
2024年:30-40%
增长因素:
✅ 钱包支持增加
✅ 交易所采用
✅ BRC-20使用Taproot(Ordinals)
⚠️ 仍在渐进采用中
🔧 地址格式转换
从Legacy到SegWit
def convert_legacy_to_segwit(legacy_address):
"""将Legacy地址转换为SegWit地址"""
# 1. 从Legacy地址提取公钥哈希
pubkey_hash = decode_base58(legacy_address)
# 2. 创建SegWit地址
segwit_address = encode_bech32(pubkey_hash, "bc", 0)
return segwit_address
从SegWit到Taproot
def convert_segwit_to_taproot(segwit_address):
"""将SegWit地址转换为Taproot地址"""
# 1. 从SegWit地址提取公钥哈希
pubkey_hash = decode_bech32(segwit_address)
# 2. 创建Taproot内部公钥
internal_key = create_taproot_internal_key(pubkey_hash)
# 3. 生成Taproot地址
taproot_address = create_taproot_address(internal_key)
return taproot_address
高级交易应用
1. 时间锁定交易
比特币支持基于时间的交易锁定:
绝对时间锁(Locktime)
{
"locktime": 700000, // 区块高度或时间戳
// ... 其他交易数据
}
相对时间锁(CheckSequenceVerify)
OP_PUSHDATA 144 // 相对锁定144个区块(约24小时)
OP_CHECKSEQUENCEVERIFY
实际应用场景
时间锁定应用:
1. 遗嘱执行:设定特定时间后生效
2. 定期支付:按时间自动释放资金
3. 托管服务:时间到期后自动释放
4. 争议解决:给争议方时间窗口
2. 哈希时间锁合约(HTLC)
闪电网络的基础组件:
OP_IF
OP_HASH160 <hash> OP_EQUALVERIFY
<pubkey> OP_CHECKSIG
OP_ELSE
<timeout> OP_CHECKLOCKTIMEVERIFY OP_DROP
<pubkey> OP_CHECKSIG
OP_ENDIF
HTLC工作原理
HTLC流程:
1. Alice创建HTLC,锁定比特币
2. Bob提供preimage解锁
3. 或者超时后Alice收回资金
应用场景:
- 闪电网络支付
- 跨链原子交换
- 条件支付
3. 原子交换
跨链交易的核心技术:
Alice的比特币锁定脚本:
- 提供secret的preimage + Bob的签名
- 或者超时后Alice可以收回
Bob的莱特币锁定脚本:
- 提供相同secret的preimage + Alice的签名
- 或者超时后Bob可以收回
原子交换实现
def create_atomic_swap(secret_hash, recipient_pubkey, timeout):
"""创建原子交换脚本"""
script = f"""
OP_IF
OP_HASH160 {secret_hash} OP_EQUALVERIFY
{recipient_pubkey} OP_CHECKSIG
OP_ELSE
{timeout} OP_CHECKLOCKTIMEVERIFY OP_DROP
{sender_pubkey} OP_CHECKSIG
OP_ENDIF
"""
return script
4. 条件支付
基于条件的智能支付:
条件类型:
- 时间条件:特定时间后支付
- 签名条件:特定签名者同意
- 哈希条件:提供特定哈希的preimage
- 多重条件:组合多个条件
5. 批量交易
企业级批量操作:
def create_batch_transaction(recipients):
"""创建批量交易"""
outputs = {}
for recipient in recipients:
outputs[recipient["address"]] = recipient["amount"]
# 创建包含多个输出的交易
raw_tx = bitcoin_rpc("createrawtransaction", [inputs, outputs])
return raw_tx
实战演练:高级交易
创建多重签名地址
import requests
import json
def bitcoin_rpc(method, params=[]):
url = "http://localhost:8332"
headers = {'content-type': 'application/json'}
payload = {
"method": method,
"params": params,
"jsonrpc": "2.0",
"id": 0,
}
response = requests.post(url, data=json.dumps(payload), headers=headers, auth=('user', 'password'))
return response.json()
def create_multisig_address():
# 1. 生成公钥(示例)
pubkeys = [
"03a1b2c3d4e5f6...", # 公钥1
"03b1c2d3e4f5a6...", # 公钥2
"03c1d2e3f4a5b6..." # 公钥3
]
# 2. 创建2-of-3多签地址
result = bitcoin_rpc("createmultisig", [2, pubkeys])
print(f"多签地址: {result['result']['address']}")
print(f"赎回脚本: {result['result']['redeemScript']}")
return result['result']
# 执行创建多签地址
multisig_info = create_multisig_address()
创建SegWit交易
def create_segwit_transaction():
# 1. 选择SegWit UTXO
inputs = [
{
"txid": "your_segwit_utxo_txid",
"vout": 0
}
]
# 2. 创建SegWit输出
outputs = {
"bc1qsegwit_address_here": 0.001, # SegWit地址
"bc1qchange_address": 0.0089 # 找零
}
# 3. 创建原始交易
raw_tx = bitcoin_rpc("createrawtransaction", [inputs, outputs])
# 4. 签名(SegWit会自动处理witness数据)
signed_tx = bitcoin_rpc("signrawtransactionwithwallet", [raw_tx['result']])
# 5. 广播
if signed_tx['result']['complete']:
txid = bitcoin_rpc("sendrawtransaction", [signed_tx['result']['hex']])
print(f"SegWit交易已发送:{txid['result']}")
return txid['result']
创建Taproot交易
def create_taproot_transaction():
# 1. 生成Taproot密钥对
internal_key = generate_taproot_key()
# 2. 创建Taproot地址
taproot_address = create_taproot_address(internal_key)
# 3. 构建交易
inputs = [{"txid": "previous_utxo", "vout": 0}]
outputs = {
taproot_address: 0.001,
"change_address": 0.0089
}
# 4. 创建和签名交易
raw_tx = bitcoin_rpc("createrawtransaction", [inputs, outputs])
signed_tx = bitcoin_rpc("signrawtransactionwithwallet", [raw_tx['result']])
return signed_tx['result']['hex']
监控复杂交易
def analyze_transaction(txid):
"""分析交易类型和特征"""
# 获取交易详情
tx_info = bitcoin_rpc("getrawtransaction", [txid, True])
# 分析输入类型
input_types = []
for vin in tx_info['result']['vin']:
if 'witness' in vin:
input_types.append("SegWit/Taproot")
else:
input_types.append("Legacy")
# 分析输出类型
output_types = []
for vout in tx_info['result']['vout']:
script_type = vout['scriptPubKey']['type']
output_types.append(script_type)
# 分析交易特征
features = {
"input_types": input_types,
"output_types": output_types,
"is_segwit": any("witness" in vin for vin in tx_info['result']['vin']),
"has_op_return": any("nulldata" in vout['scriptPubKey']['type'] for vout in tx_info['result']['vout']),
"size": len(tx_info['result']['hex']) // 2,
"weight": calculate_weight(tx_info['result'])
}
return features
def calculate_weight(tx):
"""计算交易权重"""
# 基础大小
base_size = len(tx['hex']) // 2
# Witness大小
witness_size = 0
for vin in tx['vin']:
if 'witness' in vin:
for witness_item in vin['witness']:
witness_size += len(witness_item) // 2
# 权重计算
weight = base_size * 4 + witness_size
return weight
创建OP_RETURN交易
def create_op_return_transaction(message):
"""创建包含OP_RETURN的交易"""
# 1. 准备输入
inputs = [{"txid": "your_utxo_txid", "vout": 0}]
# 2. 准备输出
outputs = {
"change_address": 0.0099, # 找零
"data": message # OP_RETURN数据
}
# 3. 创建交易
raw_tx = bitcoin_rpc("createrawtransaction", [inputs, outputs])
# 4. 签名和广播
signed_tx = bitcoin_rpc("signrawtransactionwithwallet", [raw_tx['result']])
if signed_tx['result']['complete']:
txid = bitcoin_rpc("sendrawtransaction", [signed_tx['result']['hex']])
return txid['result']
return None
常见问题
❓ 如何选择合适的地址格式?
选择建议:
Legacy地址:
✅ 兼容性最好
❌ 费用较高
❌ 不支持新功能
P2SH地址:
✅ 支持多签
✅ 兼容性好
❌ 隐私性差
SegWit地址:
✅ 费用最低
✅ 效率最高
✅ 解决延展性
⚠️ 需要钱包支持
Taproot地址:
✅ 最佳隐私性
✅ 最高效率
✅ 最新功能
⚠️ 采用率仍在增长
❓ 时间锁定交易的安全性如何?
安全考虑:
✅ 基于区块链时间戳
✅ 不可篡改
✅ 自动执行
⚠️ 需要正确设置时间
⚠️ 网络拥堵可能影响
❓ HTLC和原子交换的区别?
HTLC vs 原子交换:
HTLC:
- 单链条件支付
- 闪电网络基础
- 简单条件
原子交换:
- 跨链交换
- 基于HTLC
- 复杂协调
❓ 如何验证Inscription的真实性?
def verify_inscription(witness_data):
"""验证Inscription的真实性"""
# 1. 解析witness数据
signature = witness_data[0]
internal_key = witness_data[1]
merkle_proof = witness_data[2]
script_data = witness_data[3:]
# 2. 验证Merkle路径
if not verify_merkle_proof(merkle_proof, script_data):
return False
# 3. 验证Ordinals格式
if (script_data[0] == "OP_0" and
script_data[1] == "OP_IF" and
script_data[3] == "6f7264"): # "ord"
return True
return False
❓ Taproot的隐私性如何实现?
Taproot通过以下方式增强隐私:
- 脚本路径隐藏:只有花费时才暴露实际使用的脚本
- 签名聚合:多个签名看起来像一个签名
- 地址统一:所有Taproot地址格式相同
- 条件隐藏:复杂条件隐藏在Merkle树中
结语
通过本章的学习,你已经掌握了比特币交易的高级特性:
- 复杂交易类型:理解了OP_RETURN和各种特殊输出
- 地址格式演进:认识了比特币技术发展的历程
- 高级交易应用:学会了时间锁定、HTLC、原子交换等技术
- 实战演练:掌握了创建和管理高级交易的方法
这些技术不仅提升了比特币的功能性和效率,更为Layer 2解决方案(如闪电网络)、DeFi应用和其他创新奠定了坚实基础。
🌟 技术演进的意义
从简单到复杂:
2009年:基础P2PKH交易
2012年:P2SH多签支持
2017年:SegWit效率提升
2021年:Taproot隐私增强
2023年:Ordinals数字资产
从单一到多元:
最初:单纯的货币转账
现在:智能合约、数字资产、隐私保护
未来:更多创新应用
🔮 未来展望
比特币的技术演进仍在继续:
- Layer 2发展:闪电网络、Liquid等
- 隐私技术:CoinJoin、Taproot等
- 智能合约:更复杂的脚本功能
- 数字资产:Ordinals、BRC-20等
- 跨链技术:原子交换等
💡 学习建议
- 实践为主:多动手创建不同类型的交易
- 关注发展:跟踪比特币技术的最新进展
- 理解原理:深入理解每个技术背后的设计思想
- 安全第一:在测试网络上充分测试后再在主网使用
在下一章《比特币扩容与治理》中,我们将深入探讨比特币历史上的技术争论、升级机制和社区治理,了解这些技术是如何在激烈的讨论中诞生和发展的。
🌟 比特币的哲学:这些技术升级体现了比特币的核心价值观:去中心化、安全性、隐私性和可扩展性,同时保持了向后兼容性和渐进式发展。