5.实验笔记:Alice → Bob → Dave二跳转账
📋 实验概览
实验目标: 验证RGB协议的多跳转账能力,完成Alice → Bob → Dave的二跳转账路径
实验时间: 2025-08-19 23:55 - 2025-08-20 00:18
最终结果: ✅ 完全成功
🎯 实验目标
- 创建第三方钱包 - 引入Dave作为新的参与者
- 验证多跳路径 - 确认RGB可以支持复杂的转账网络
- 测试发票复用风险 - 理解RGB发票的安全机制
- 完整流程验证 - 从发票生成到链上确认的完整流程
🏗️ 实验环境
基础设施
- 比特币网络: regtest (本地测试网)
- RGB版本: v0.11.0-beta.9
- Esplora API: http://localhost:3002 (opens in a new tab)
- Docker环境: bitlight-local-env
参与方钱包
| 参与方 | RGB地址 | 余额状态 |
|---|---|---|
| Alice | bcrt1pn0s2pajhsw38fnpgcj79w3kr3c0r89y3xyekjt8qaudje70g4shs20nwfx | 99,999,998,000 RGB |
| Bob | bcrt1p9yjaffzhuh9p7d9gnwfunxssngesk25tz7rudu4v69dl6e7w7qhq5x43k5 | 4,300 RGB |
| Dave | bcrt1pq4vz5369ctpt3mj96ey0k2dewwlh2x6gt3qrq2drtalwddac7vasjgmuzp | 0 RGB (新建) |
合约信息
- 合约ID:
rgb:BppYGUUL-Qboz3UD-czwAaVV-!!Jkr1a-SE1!m1f-Cz$b0xs - 代币名称: TEST
- 总供应量: 100,000,000,000 (固定供给)
- 接口类型: RGB20Fixed
📝 实验步骤详解
步骤1: Dave钱包创建和设置
1.1 创建Dave的比特币钱包
make dave-cli
# 选择 RGB Descriptor 9/*
# 获取地址: bcrt1pq4vz5369ctpt3mj96ey0k2dewwlh2x6gt3qrq2drtalwddac7vasjgmuzp
1.2 发送比特币给Dave
make core-cli
load_wallet
send bcrt1pq4vz5369ctpt3mj96ey0k2dewwlh2x6gt3qrq2drtalwddac7vasjgmuzp 1
mint 1
结果: Dave收到1 BTC,交易ID: 75cd19134f6fbbe9dc9cd2c1ff1917deff0523ea8e765c6130451d081e70d318
1.3 创建Dave的RGB钱包
rgb -d .dave -n regtest create default --tapret-key-only "[4a2358bd/86'/1'/0']tpubDCJSBWsVBQLHNJG4KuMgLLH6vhVdX1YCq3VLsjQxmLuQtRwzcd6LZw44h5yU6R6iGrCB8bVVt7Yoy5DWURUjBz3Y74DNpy8T1scWEUXTGpU/<0;1;9;10>/*" --esplora="<http://localhost:3002>"
1.4 导入RGB合约
rgb -d .dave -n regtest import ../bitlight-rgb20-contract/test/rgb20-simplest.rgb --esplora="<http://localhost:3002>"
验证结果: Dave成功导入合约,Owned部分为空(未收到代币)
步骤2: RGB转账流程
2.1 Dave生成发票 📋
python experiment2_bob_to_dave_complete.py
发票内容:
rgb:BppYGUUL-Qboz3UD-czwAaVV-!!Jkr1a-SE1!m1f-Cz$b0xs/RGB20Fixed/YFaF+bcrt:utxob:0EkaEhCY-7MiMA0F-pZjg1FF-eOpKMvD-dohVtt6-J3NH1fm-3lpa7
2.2 Bob创建转账 📤
生成文件:
bob_to_dave_20250820_001323.consignment(证明包)bob_to_dave_20250820_001323.psbt(比特币交易)
转账金额: 500 RGB代币
2.3 Dave验证并接受 ✅
rgb -d .dave validate bob_to_dave_20250820_001323.consignment
rgb -d .dave accept -f bob_to_dave_20250820_001323.consignment
结果: Dave成功验证并接受转账到本地stash
步骤3: PSBT签名挑战与解决
3.1 初始签名失败 ❌
问题: 自动化签名脚本尝试所有派生路径都失败 原因分析:
- PSBT引用UTXO:
2f8eb2dd9caac7d414368b2c30adf7cb46df4bbfc49fee8f2fdb4cbd2da36bd9:0 - 该UTXO对应地址:
&9/0(branch=9, index=0) - 签名脚本虽然尝试了正确路径,但钱包处理逻辑有问题
3.2 调试分析 🔍
关键发现:
- Bob的RGB代币全部绑定在同一seal:
bc:tapret1st:2f8eb2dd9caac7d414368b2c30adf7cb46df4bbfc49fee8f2fdb4cbd2da36bd9:0 - 对应比特币UTXO:
2f8eb2dd9caac7d414368b2c30adf7cb46df4bbfc49fee8f2fdb4cbd2da36bd9:0(1 BTC) - 该UTXO在地址
&9/0,需要branch=9, index=0的私钥
3.3 手动签名成功 ✅
解决方案: 直接使用bitcoin-cli进行PSBT处理
# 创建专用钱包
cli(['createwallet', 'wallet_name=final_bob', 'descriptors=false'])
# 导入正确的私钥 (branch=9, index=0)
wif = derive_wif_from_tprv(bob_tprv, 9, 0)
cli(['importprivkey', wif, 'final-key', 'false'], wallet='final_bob')
# 处理PSBT
proc_result = cli(['walletprocesspsbt', psbt_b64, 'true'], wallet='final_bob')
fin_result = cli(['finalizepsbt', f'psbt={proc_data["psbt"]}', 'extract=true'])
# 广播交易
txid = cli(['sendrawtransaction', fin_data['hex']])
成功结果:
- ✅ PSBT签名完成
- ✅ 交易广播成功
- TXID:
24d14f5cdbbf0487269ed36bda89629f4bae71820f41af72ab7117d641233ccf
📊 最终状态验证
转账前状态
| 参与方 | RGB余额 | UTXO分布 |
|---|---|---|
| Bob | 4,300 | 2000 + 1800 + 500 (3个UTXO) |
| Dave | 0 | 无 |
转账后状态 (区块228确认)
| 参与方 | RGB余额 | UTXO详情 |
|---|---|---|
| Bob | 3,800 | 24d14f5c...ccf:0 (合并后的找零) |
| Dave | 500 | 75cd1913...318:1 (接收的转账) |
状态验证命令
rgb -d .bob state $CID RGB20Fixed --sync --esplora="<http://localhost:3002>"
rgb -d .dave state $CID RGB20Fixed --sync --esplora="<http://localhost:3002>"
🔬 技术深度分析
RGB协议机制验证
1. Tapret承诺机制
- 原理: RGB状态通过Taproot公钥的tweak进行承诺
- 验证: 每个RGB转账都对应一个唯一的tapret seal
- 示例:
bc:tapret1st:24d14f5c...绑定特定的比特币UTXO
2. 客户端验证模式
- 过程: Dave独立验证转账的密码学证明
- 安全性: 不依赖第三方,完全去中心化验证
- 结果: Dave只有在验证通过后才接受转账到本地stash
3. UTXO合并优化
- 问题: Bob原有3个分离的RGB UTXO造成碎片化
- 解决: RGB协议在转账时自动合并UTXO
- 效果: Bob从3个UTXO合并为1个,提高效率
4. 原子性保证
- 机制: RGB状态转换与比特币交易原子绑定
- 验证: 同一witness交易
24d14f5c...同时更新Bob和Dave的状态 - 安全: 比特币网络的共识保证RGB状态转换的原子性
⚠️ 问题与挑战
1. PSBT签名复杂性
问题: 自动化签名脚本失败 根因:
- RGB UTXO的派生路径识别困难
- 钱包创建和加载的时序问题
- 不同工具间的钱包隔离
解决方案:
- 手动分析RGB状态确定正确的派生路径
- 使用专用钱包避免冲突
- 简化的直接CLI方法
2. 状态同步延迟
现象: 转账完成后状态显示不一致 原因: RGB客户端需要时间同步链上状态 解决: 挖块确认后状态显示正确
3. 工具链复杂性
挑战: 需要协调RGB CLI、Python脚本、Docker容器等多个组件 改进: 统一的工具链和更好的错误处理
💡 经验总结
技术收获
- RGB与比特币的深度绑定
- RGB不是比特币的"附加层",而是比特币的"原生扩展"
- 每个RGB操作都必须有对应的比特币交易支撑
- 客户端验证的强大
- 接收方完全控制是否接受转账
- 无需信任发送方或网络,自主验证所有证明
- UTXO模型的优势
- 天然支持并发和分片
- 自动的隐私保护和状态隔离
实践经验
- 调试策略
- RGB状态 + 比特币UTXO + 派生路径三重检查
- 逐步验证每个环节而不是端到端测试
- 保留中间文件便于分析
- 工具使用技巧
- RGB CLI的esplora参数是必需的
- 合约ID中的特殊字符需要shell转义
- bitcoin-cli的钱包参数需要明确指定
- 状态管理
- 及时挖块确认状态
- 区分tentative和confirmed状态
- 理解RGB的最终性语义
🚀 后续实验方向
基于实验的成功,可以进行以下深入实验:
实验2: RGB20Fixed的铸造限制
- 验证固定供给合约的限制
- 理解为什么Bob无法mint新代币
- 对比不同RGB接口的差异
实验3: 资产找回演练
- consignment文件丢失恢复
- stash状态库重建
- 私钥丢失场景分析
实验4: 网络异常处理
- 费用不足的PSBT处理
- RBF (Replace-By-Fee) 机制
- mempool拥塞应对
实验5: 安全性测试
- 双花攻击尝试
- 发票复用风险验证
- 接收方拒绝攻击
📁 实验文件清单
生成的文件
bob_to_dave_20250820_001323.consignment # RGB证明包
bob_to_dave_20250820_001323.psbt # 比特币PSBT
experiment2_bob_to_dave_complete.py # 自动化脚本
psbt_signer.py # PSBT签名工具
关键交易
- 转账交易:
24d14f5cdbbf0487269ed36bda89629f4bae71820f41af72ab7117d641233ccf - 确认区块: 228 (2025-08-19 16:18:48)
- Dave接收UTXO:
75cd19134f6fbbe9dc9cd2c1ff1917deff0523ea8e765c6130451d081e70d318:1
🎯 结论
实验完全成功验证了RGB协议的多跳转账能力。通过创建第三方参与者Dave并完成Bob→Dave的500代币转账,我们深入理解了:
- RGB的扩展性: 支持任意复杂的转账网络
- 安全模型: 客户端验证确保去中心化安全
- 效率优化: UTXO合并减少链上足迹
- 工具链成熟度: 虽有复杂性但功能完整
这为后续更复杂的RGB应用奠定了坚实基础,证明了RGB作为比特币原生智能合约层的巨大潜力。
实验记录时间: 2025-08-20
实验环境: bitlight-local-env + RGB v0.11.0-beta.9
实验状态: ✅ 完全成功