539 lines
12 KiB
Markdown
539 lines
12 KiB
Markdown
# NAC以太坊桥插件 Phase 3 交付文档
|
||
|
||
**交付日期**: 2026年2月16日
|
||
**版本**: v0.3.0
|
||
**状态**: Phase 3完成 - 以太坊桥插件原型
|
||
|
||
---
|
||
|
||
## 📦 交付内容
|
||
|
||
### 核心模块(3个)
|
||
|
||
| 模块 | 文件 | 行数 | 状态 | 说明 |
|
||
|------|------|------|------|------|
|
||
| 以太坊桥 | `ethereum_bridge.rs` | ~280行 | ✅ | 核心桥插件实现 |
|
||
| ERC-20辅助 | `erc20.rs` | ~80行 | ✅ | Token信息和常见Token列表 |
|
||
| SPV证明 | `spv.rs` | ~180行 | ✅ | Merkle证明生成和验证 |
|
||
| 主模块 | `lib.rs` | ~10行 | ✅ | 模块导出 |
|
||
|
||
**总代码量**: ~550行
|
||
|
||
### 测试结果
|
||
|
||
```
|
||
$ cargo test
|
||
running 6 tests
|
||
test ethereum_bridge::tests::test_ethereum_bridge_creation ... ignored
|
||
test erc20::tests::test_erc20_token_creation ... ok
|
||
test erc20::tests::test_common_tokens ... ok
|
||
test spv::tests::test_block_header_verification ... ok
|
||
test spv::tests::test_merkle_proof_generation_and_verification ... ok
|
||
test ethereum_bridge::tests::test_build_lock_eth_tx_data ... ok
|
||
|
||
test result: ok. 5 passed; 0 failed; 1 ignored
|
||
```
|
||
|
||
✅ **零错误、零警告编译**
|
||
✅ **5个单元测试通过**(1个需要RPC节点的测试被忽略)
|
||
|
||
---
|
||
|
||
## 🎯 Phase 3 目标达成
|
||
|
||
### 1. 集成ethers-rs和Web3依赖 ✅
|
||
|
||
已集成的库:
|
||
|
||
- `ethers = "2.0"`: 完整的Web3功能
|
||
- `ethers-core`: 核心类型(Address, U256, H256等)
|
||
- `ethers-providers`: RPC提供商
|
||
- `ethers-contract`: 智能合约交互
|
||
- `ethers-middleware`: 中间件支持
|
||
|
||
**编译时间**: ~2分钟(首次编译)
|
||
|
||
### 2. 实现以太坊桥插件基础结构 ✅
|
||
|
||
```rust
|
||
pub struct EthereumBridgePlugin {
|
||
chain_id: u64,
|
||
provider: Arc<Provider<Http>>,
|
||
bridge_contract_address: String,
|
||
chain_name: String,
|
||
}
|
||
```
|
||
|
||
**支持的链**:
|
||
- [x] Ethereum Mainnet (chain_id = 1)
|
||
- [x] Goerli Testnet (chain_id = 5)
|
||
- [x] Sepolia Testnet (chain_id = 11155111)
|
||
|
||
### 3. 实现余额查询功能 ✅
|
||
|
||
#### ETH余额查询
|
||
|
||
```rust
|
||
pub async fn get_eth_balance(&self, address: &str) -> Result<u128, BridgeError>
|
||
```
|
||
|
||
- 使用`provider.get_balance()`
|
||
- 返回wei单位的余额
|
||
- 完整的错误处理
|
||
|
||
#### ERC-20余额查询
|
||
|
||
```rust
|
||
pub async fn get_erc20_balance(
|
||
&self,
|
||
user_address: &str,
|
||
token_address: &str,
|
||
) -> Result<u128, BridgeError>
|
||
```
|
||
|
||
- 调用`balanceOf(address)`函数
|
||
- 函数选择器: `0x70a08231`
|
||
- ABI编码和解码
|
||
- 支持所有标准ERC-20 Token
|
||
|
||
#### 统一余额查询接口
|
||
|
||
```rust
|
||
pub async fn get_balance(
|
||
&self,
|
||
address: &str,
|
||
token: &TokenInfo,
|
||
) -> Result<u128, BridgeError>
|
||
```
|
||
|
||
- 自动判断ETH或ERC-20
|
||
- 统一的错误处理
|
||
|
||
### 4. 实现锁定和解锁交易构造 ✅
|
||
|
||
#### 锁定ETH交易数据
|
||
|
||
```rust
|
||
pub fn build_lock_eth_tx_data(
|
||
&self,
|
||
amount: u128,
|
||
nac_target_address: &[u8; 32],
|
||
) -> Vec<u8>
|
||
```
|
||
|
||
- 函数签名: `lockETH(bytes32 nacTargetAddress)`
|
||
- ABI编码
|
||
- 返回可签名的交易数据
|
||
|
||
#### 锁定ERC-20交易数据
|
||
|
||
```rust
|
||
pub fn build_lock_erc20_tx_data(
|
||
&self,
|
||
token_address: &str,
|
||
amount: u128,
|
||
nac_target_address: &[u8; 32],
|
||
) -> Result<Vec<u8>, BridgeError>
|
||
```
|
||
|
||
- 函数签名: `lockERC20(address token, uint256 amount, bytes32 nacTargetAddress)`
|
||
- 完整的ABI编码
|
||
- 地址验证
|
||
|
||
### 5. 实现SPV证明验证 ✅
|
||
|
||
#### Merkle证明生成
|
||
|
||
```rust
|
||
pub fn generate_merkle_proof(
|
||
&self,
|
||
tx_hashes: &[Vec<u8>],
|
||
tx_index: usize,
|
||
) -> Option<MerkleProof>
|
||
```
|
||
|
||
- 构建Merkle树
|
||
- 生成从叶子到根的证明路径
|
||
- 返回完整的`MerkleProof`结构
|
||
|
||
#### Merkle证明验证
|
||
|
||
```rust
|
||
pub fn verify_merkle_proof(
|
||
&self,
|
||
tx_hash: &[u8],
|
||
proof: &MerkleProof,
|
||
) -> bool
|
||
```
|
||
|
||
- 沿着Merkle路径重新计算哈希
|
||
- 使用Keccak256哈希算法
|
||
- 验证根哈希
|
||
|
||
#### 区块头验证
|
||
|
||
```rust
|
||
pub fn verify_block_header(
|
||
&self,
|
||
block_header: &[u8],
|
||
expected_hash: &[u8],
|
||
) -> bool
|
||
```
|
||
|
||
- Keccak256哈希验证
|
||
- 用于验证区块的有效性
|
||
|
||
### 6. 完整测试和文档 ✅
|
||
|
||
#### 单元测试
|
||
|
||
- `test_ethereum_bridge_creation`: 桥插件创建(需要RPC节点)
|
||
- `test_build_lock_eth_tx_data`: 锁定ETH交易数据构造
|
||
- `test_erc20_token_creation`: ERC-20 Token创建
|
||
- `test_common_tokens`: 常见Token列表
|
||
- `test_merkle_proof_generation_and_verification`: Merkle证明
|
||
- `test_block_header_verification`: 区块头验证
|
||
|
||
#### 文档
|
||
|
||
- [x] README.md(完整的使用文档)
|
||
- [x] 代码注释(所有公共API)
|
||
- [x] 使用示例(7个示例)
|
||
- [x] 交付文档(本文档)
|
||
|
||
---
|
||
|
||
## 📊 代码统计
|
||
|
||
| 指标 | 数值 |
|
||
|------|------|
|
||
| 模块数量 | 3个 |
|
||
| 代码行数 | ~550行 |
|
||
| 测试数量 | 6个 |
|
||
| 编译警告 | 0个 |
|
||
| 编译错误 | 0个 |
|
||
| 依赖库 | 7个 |
|
||
|
||
---
|
||
|
||
## 🔧 技术实现亮点
|
||
|
||
### 1. Web3集成
|
||
|
||
**ethers-rs库的优势**:
|
||
|
||
- 类型安全的以太坊交互
|
||
- 完整的异步支持
|
||
- 丰富的中间件生态
|
||
- 活跃的社区维护
|
||
|
||
**实现细节**:
|
||
|
||
```rust
|
||
let provider = Provider::<Http>::try_from(rpc_url)?;
|
||
let provider = Arc::new(provider);
|
||
```
|
||
|
||
- 使用`Arc`实现线程安全共享
|
||
- HTTP传输层(可扩展为WebSocket)
|
||
- 自动重试和错误处理
|
||
|
||
### 2. ERC-20余额查询
|
||
|
||
**ABI编码实现**:
|
||
|
||
```rust
|
||
// balanceOf(address) -> uint256
|
||
let mut data = vec![0x70, 0xa0, 0x82, 0x31]; // 函数选择器
|
||
data.extend_from_slice(&[0u8; 12]); // 填充12字节
|
||
data.extend_from_slice(user_addr.as_bytes()); // 地址(20字节)
|
||
```
|
||
|
||
**函数选择器计算**:
|
||
```
|
||
keccak256("balanceOf(address)")[0..4] = 0x70a08231
|
||
```
|
||
|
||
**返回值解析**:
|
||
```rust
|
||
let balance = U256::from_big_endian(&result); // 32字节uint256
|
||
```
|
||
|
||
### 3. SPV证明
|
||
|
||
**Merkle树构建**:
|
||
|
||
```
|
||
层级0(叶子): [tx1, tx2, tx3, tx4]
|
||
层级1: [hash(tx1,tx2), hash(tx3,tx4)]
|
||
层级2(根): [hash(hash(tx1,tx2), hash(tx3,tx4))]
|
||
```
|
||
|
||
**证明路径**:
|
||
|
||
对于tx2,证明路径为:
|
||
1. tx1(兄弟节点)
|
||
2. hash(tx3,tx4)(父节点的兄弟)
|
||
|
||
**验证过程**:
|
||
|
||
```rust
|
||
current_hash = tx2
|
||
current_hash = hash(tx1, current_hash) // 层级1
|
||
current_hash = hash(current_hash, hash(tx3,tx4)) // 层级2
|
||
assert_eq!(current_hash, root) // 验证根哈希
|
||
```
|
||
|
||
### 4. 常见Token列表
|
||
|
||
内置4个最常用的ERC-20 Token:
|
||
|
||
| Token | 符号 | 小数位 | 地址 |
|
||
|-------|------|--------|------|
|
||
| Tether USD | USDT | 6 | 0xdac17f958d2ee523a2206206994597c13d831ec7 |
|
||
| USD Coin | USDC | 6 | 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 |
|
||
| Dai Stablecoin | DAI | 18 | 0x6b175474e89094c44da98b954eedeac495271d0f |
|
||
| Wrapped BTC | WBTC | 8 | 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 |
|
||
|
||
---
|
||
|
||
## 🚀 使用示例
|
||
|
||
### 示例1: 查询Vitalik的ETH余额
|
||
|
||
```rust
|
||
use nac_bridge_ethereum::EthereumBridgePlugin;
|
||
|
||
#[tokio::main]
|
||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||
let bridge = EthereumBridgePlugin::new(
|
||
"https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY",
|
||
1,
|
||
"0x0000000000000000000000000000000000000000".to_string(),
|
||
).await?;
|
||
|
||
let vitalik = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045";
|
||
let balance = bridge.get_eth_balance(vitalik).await?;
|
||
|
||
println!("Vitalik's ETH balance: {} ETH", balance as f64 / 1e18);
|
||
|
||
Ok(())
|
||
}
|
||
```
|
||
|
||
### 示例2: 查询USDT余额
|
||
|
||
```rust
|
||
let usdt_address = "0xdac17f958d2ee523a2206206994597c13d831ec7";
|
||
let user_address = "0xYourAddress";
|
||
|
||
let balance = bridge.get_erc20_balance(user_address, usdt_address).await?;
|
||
|
||
println!("USDT balance: {} USDT", balance as f64 / 1e6);
|
||
```
|
||
|
||
### 示例3: 构造跨链锁定交易
|
||
|
||
```rust
|
||
// 用户想要将1 ETH从以太坊跨链到NAC
|
||
let amount = 1_000_000_000_000_000_000u128; // 1 ETH
|
||
let nac_address = [0x01; 32]; // 用户的NAC地址
|
||
|
||
// 构造交易数据
|
||
let tx_data = bridge.build_lock_eth_tx_data(amount, &nac_address);
|
||
|
||
// 用户需要:
|
||
// 1. 用自己的钱包签名这个交易
|
||
// 2. 将交易广播到以太坊网络
|
||
// 3. 等待交易确认
|
||
// 4. 中继节点会监听到锁定事件
|
||
// 5. 中继节点在NAC上铸造包裹ETH
|
||
```
|
||
|
||
---
|
||
|
||
## 🔒 安全特性
|
||
|
||
### 已实现 ✅
|
||
|
||
- [x] 地址格式验证(Address类型)
|
||
- [x] 交易哈希验证(H256类型)
|
||
- [x] Merkle证明验证(Keccak256)
|
||
- [x] 溢出保护(U256类型)
|
||
- [x] 错误处理(Result类型)
|
||
|
||
### 待实现(后续Phase)
|
||
|
||
- [ ] 交易签名验证
|
||
- [ ] Gas估算优化
|
||
- [ ] Nonce管理
|
||
- [ ] 重放攻击防护
|
||
- [ ] 多签验证
|
||
- [ ] 紧急暂停机制
|
||
|
||
---
|
||
|
||
## 🚀 下一步计划
|
||
|
||
### Phase 4: 桥合约开发(预计2周)
|
||
|
||
1. **Solidity合约**
|
||
- 编写桥合约
|
||
- 锁定/解锁逻辑
|
||
- 事件定义
|
||
|
||
2. **合约部署**
|
||
- 部署到Sepolia测试网
|
||
- 合约验证
|
||
- ABI生成
|
||
|
||
3. **合约交互**
|
||
- Rust绑定生成
|
||
- 调用合约方法
|
||
- 监听合约事件
|
||
|
||
### Phase 5: 事件监听(预计1周)
|
||
|
||
1. **WebSocket连接**
|
||
- 替换HTTP为WebSocket
|
||
- 实时事件订阅
|
||
|
||
2. **事件过滤**
|
||
- 监听锁定事件
|
||
- 解析事件日志
|
||
- 提取跨链参数
|
||
|
||
3. **中继触发**
|
||
- 验证事件有效性
|
||
- 调用中继节点API
|
||
- 提交跨链请求
|
||
|
||
### Phase 6: 完整跨链流程(预计2周)
|
||
|
||
1. **以太坊 → NAC**
|
||
- 用户锁定ETH/ERC-20
|
||
- 中继节点监听
|
||
- NAC铸造包裹资产
|
||
- 用户收到wETH/wUSDT
|
||
|
||
2. **NAC → 以太坊**
|
||
- 用户销毁包裹资产
|
||
- 中继节点验证
|
||
- 以太坊解锁原资产
|
||
- 用户收到ETH/ERC-20
|
||
|
||
3. **状态同步**
|
||
- 跨链请求状态查询
|
||
- 确认数监控
|
||
- 失败重试
|
||
|
||
---
|
||
|
||
## 📖 API文档
|
||
|
||
### EthereumBridgePlugin
|
||
|
||
#### 构造函数
|
||
|
||
```rust
|
||
pub async fn new(
|
||
rpc_url: &str,
|
||
chain_id: u64,
|
||
bridge_contract_address: String,
|
||
) -> Result<Self, BridgeError>
|
||
```
|
||
|
||
**参数**:
|
||
- `rpc_url`: 以太坊RPC节点URL(如Infura、Alchemy)
|
||
- `chain_id`: 链ID(1=主网,5=Goerli,11155111=Sepolia)
|
||
- `bridge_contract_address`: 桥合约地址
|
||
|
||
**返回**:
|
||
- `Ok(EthereumBridgePlugin)`: 成功创建
|
||
- `Err(BridgeError)`: 连接失败
|
||
|
||
#### 余额查询
|
||
|
||
```rust
|
||
pub async fn get_eth_balance(&self, address: &str) -> Result<u128, BridgeError>
|
||
pub async fn get_erc20_balance(&self, user_address: &str, token_address: &str) -> Result<u128, BridgeError>
|
||
pub async fn get_balance(&self, address: &str, token: &TokenInfo) -> Result<u128, BridgeError>
|
||
```
|
||
|
||
**返回值单位**:
|
||
- ETH: wei(1 ETH = 10^18 wei)
|
||
- ERC-20: 最小单位(根据decimals)
|
||
|
||
#### 交易构造
|
||
|
||
```rust
|
||
pub fn build_lock_eth_tx_data(&self, amount: u128, nac_target_address: &[u8; 32]) -> Vec<u8>
|
||
pub fn build_lock_erc20_tx_data(&self, token_address: &str, amount: u128, nac_target_address: &[u8; 32]) -> Result<Vec<u8>, BridgeError>
|
||
```
|
||
|
||
**返回**:
|
||
- ABI编码的交易数据
|
||
- 可直接用于交易签名
|
||
|
||
#### 交易查询
|
||
|
||
```rust
|
||
pub async fn get_transaction_receipt(&self, tx_hash: &str) -> Result<TransactionReceipt, BridgeError>
|
||
pub async fn get_block(&self, block_number: u64) -> Result<Block<H256>, BridgeError>
|
||
```
|
||
|
||
### SPVProofVerifier
|
||
|
||
```rust
|
||
pub fn new() -> Self
|
||
pub fn verify_merkle_proof(&self, tx_hash: &[u8], proof: &MerkleProof) -> bool
|
||
pub fn generate_merkle_proof(&self, tx_hashes: &[Vec<u8>], tx_index: usize) -> Option<MerkleProof>
|
||
pub fn verify_block_header(&self, block_header: &[u8], expected_hash: &[u8]) -> bool
|
||
```
|
||
|
||
### ERC20Token
|
||
|
||
```rust
|
||
pub fn new(address: String, symbol: String, name: String, decimals: u8) -> Self
|
||
pub fn common_tokens() -> Vec<ERC20Token>
|
||
```
|
||
|
||
---
|
||
|
||
## 📋 验收标准
|
||
|
||
### 已达成 ✅
|
||
|
||
- [x] 零错误、零警告编译
|
||
- [x] ethers-rs集成完成
|
||
- [x] ETH余额查询实现
|
||
- [x] ERC-20余额查询实现
|
||
- [x] 锁定交易数据构造实现
|
||
- [x] SPV证明生成和验证实现
|
||
- [x] 6个单元测试(5个通过,1个忽略)
|
||
- [x] 完整的README文档
|
||
- [x] 详细的交付文档
|
||
|
||
### 待达成(后续Phase)
|
||
|
||
- [ ] 桥合约部署
|
||
- [ ] 事件监听实现
|
||
- [ ] 完整跨链流程
|
||
- [ ] 集成测试
|
||
- [ ] 主网部署
|
||
|
||
---
|
||
|
||
## 📞 联系方式
|
||
|
||
**开发团队**: NAC Wallet Team
|
||
**项目地址**: `/home/ubuntu/NAC_Clean_Dev/nac-bridge-ethereum`
|
||
**文档**: [README.md](./nac-bridge-ethereum/README.md)
|
||
|
||
---
|
||
|
||
**交付人**: NAC公链开发小组
|
||
**交付日期**: 2026年2月16日
|
||
**版本**: v0.3.0
|
||
**状态**: ✅ Phase 3完成
|