🌈 RGB 协议实战学习系列
5. 实验笔记:Alice → Bob → Dave 二跳转账

5.实验笔记:Alice → Bob → Dave二跳转账

📋 实验概览

实验目标: 验证RGB协议的多跳转账能力,完成Alice → Bob → Dave的二跳转账路径

实验时间: 2025-08-19 23:55 - 2025-08-20 00:18

最终结果: ✅ 完全成功


🎯 实验目标

  1. 创建第三方钱包 - 引入Dave作为新的参与者
  2. 验证多跳路径 - 确认RGB可以支持复杂的转账网络
  3. 测试发票复用风险 - 理解RGB发票的安全机制
  4. 完整流程验证 - 从发票生成到链上确认的完整流程

🏗️ 实验环境

基础设施

参与方钱包

参与方RGB地址余额状态
Alicebcrt1pn0s2pajhsw38fnpgcj79w3kr3c0r89y3xyekjt8qaudje70g4shs20nwfx99,999,998,000 RGB
Bobbcrt1p9yjaffzhuh9p7d9gnwfunxssngesk25tz7rudu4v69dl6e7w7qhq5x43k54,300 RGB
Davebcrt1pq4vz5369ctpt3mj96ey0k2dewwlh2x6gt3qrq2drtalwddac7vasjgmuzp0 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分布
Bob4,3002000 + 1800 + 500 (3个UTXO)
Dave0

转账后状态 (区块228确认)

参与方RGB余额UTXO详情
Bob3,80024d14f5c...ccf:0 (合并后的找零)
Dave50075cd1913...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容器等多个组件 改进: 统一的工具链和更好的错误处理


💡 经验总结

技术收获

  1. RGB与比特币的深度绑定
    • RGB不是比特币的"附加层",而是比特币的"原生扩展"
    • 每个RGB操作都必须有对应的比特币交易支撑
  2. 客户端验证的强大
    • 接收方完全控制是否接受转账
    • 无需信任发送方或网络,自主验证所有证明
  3. UTXO模型的优势
    • 天然支持并发和分片
    • 自动的隐私保护和状态隔离

实践经验

  1. 调试策略
    • RGB状态 + 比特币UTXO + 派生路径三重检查
    • 逐步验证每个环节而不是端到端测试
    • 保留中间文件便于分析
  2. 工具使用技巧
    • RGB CLI的esplora参数是必需的
    • 合约ID中的特殊字符需要shell转义
    • bitcoin-cli的钱包参数需要明确指定
  3. 状态管理
    • 及时挖块确认状态
    • 区分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代币转账,我们深入理解了:

  1. RGB的扩展性: 支持任意复杂的转账网络
  2. 安全模型: 客户端验证确保去中心化安全
  3. 效率优化: UTXO合并减少链上足迹
  4. 工具链成熟度: 虽有复杂性但功能完整

这为后续更复杂的RGB应用奠定了坚实基础,证明了RGB作为比特币原生智能合约层的巨大潜力。


实验记录时间: 2025-08-20

实验环境: bitlight-local-env + RGB v0.11.0-beta.9

实验状态: ✅ 完全成功