update
This commit is contained in:
101
internal/blockchain/eth/batch_transfer_example.md
Normal file
101
internal/blockchain/eth/batch_transfer_example.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# ERC20-USDT 批量转账功能
|
||||
|
||||
## 功能说明
|
||||
|
||||
该文件 `batch_transfer.go` 提供了 ERC20-USDT 的批量转账功能,支持从同一个发送地址向多个不同的接收地址转账。
|
||||
|
||||
## 主要功能
|
||||
|
||||
### 1. 批量转账类型
|
||||
|
||||
```go
|
||||
type BatchTransferItem struct {
|
||||
ToAddress string // 接收地址
|
||||
Amount float64 // 转账金额
|
||||
}
|
||||
|
||||
type BatchTransferResult struct {
|
||||
TxHash string // 交易哈希(多个用逗号分隔)
|
||||
Success bool // 是否成功
|
||||
TotalAmount float64 // 总转账金额
|
||||
Count int // 转账笔数
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 使用方法
|
||||
|
||||
```go
|
||||
// 1. 准备批量转账列表
|
||||
items := []eth.BatchTransferItem{
|
||||
{ToAddress: "0xRecipient1", Amount: 100.0},
|
||||
{ToAddress: "0xRecipient2", Amount: 200.0},
|
||||
{ToAddress: "0xRecipient3", Amount: 50.0},
|
||||
}
|
||||
|
||||
// 2. 调用批量转账
|
||||
fromAddress := "0xYourAddress"
|
||||
result, err := ethNode.USDTBatchTransfer(fromAddress, items)
|
||||
if err != nil {
|
||||
log.Fatalf("批量转账失败: %v", err)
|
||||
}
|
||||
|
||||
// 3. 处理结果
|
||||
fmt.Printf("批量转账完成: %d笔, 总金额: %.2f USDT", result.Count, result.TotalAmount)
|
||||
fmt.Printf("交易哈希: %s", result.TxHash)
|
||||
```
|
||||
|
||||
## 工作原理
|
||||
|
||||
由于标准 ERC20 合约不支持批量转账,本实现采用以下策略:
|
||||
|
||||
1. **多次独立交易**:对每笔转账创建一个独立的 ERC20 `transfer` 交易
|
||||
2. **Nonce 管理**:自动管理 nonce,确保交易按顺序广播
|
||||
3. **Gas 费用**:支持 EIP-1559 动态费用和传统 gas price
|
||||
4. **错误处理**:单笔失败不影响其他交易,返回成功和失败的详细统计
|
||||
|
||||
## 注意事项
|
||||
|
||||
### 1. Gas 费用
|
||||
|
||||
- 每笔转账需要独立的 gas 费用(约 65,000 gas)
|
||||
- 批量转账 10 笔需要约 650,000 gas
|
||||
- 确保发送地址有足够的 ETH 作为 gas 费用
|
||||
|
||||
### 2. 余额检查
|
||||
|
||||
- 函数会自动检查 USDT 余额是否足够
|
||||
- 如果余额不足,会返回错误并终止转账
|
||||
|
||||
### 3. 部分成功
|
||||
|
||||
- 如果某些转账失败,函数会继续执行其他转账
|
||||
- 返回结果中包含成功笔数和详细交易哈希
|
||||
|
||||
### 4. 网络拥堵
|
||||
|
||||
- 在高网络拥堵时,某些交易可能被推迟
|
||||
- 建议监控所有交易状态
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
如果需要更高效的批量转账,考虑:
|
||||
|
||||
1. **部署批量转账代理合约**:实现一个合约方法 `batchTransfer(address[] to, uint256[] amounts)`
|
||||
2. **使用多签钱包**:减少私钥管理风险
|
||||
3. **Gas 优化**:使用更低的 gas price 分批发送
|
||||
|
||||
## 示例输出
|
||||
|
||||
```
|
||||
🔄 批量转账 - 检测钱包=0x...,余额=1000.00 USDT
|
||||
✅ 批量转账第1笔已提交: 0xabc123..., 金额=100.00 USDT, 收款地址=0x...
|
||||
✅ 批量转账第2笔已提交: 0xdef456..., 金额=200.00 USDT, 收款地址=0x...
|
||||
✅ 批量转账第3笔已提交: 0x789ghi..., 金额=50.00 USDT, 收款地址=0x...
|
||||
📊 批量转账完成: 总计3笔, 成功3笔, 总金额=350.00 USDT
|
||||
```
|
||||
|
||||
## 限制
|
||||
|
||||
- 标准 ERC20 不支持真正的批量转账(单笔交易)
|
||||
- 需要确保发送地址有足够的 ETH 作为 gas 费用
|
||||
- 交易按顺序发送,可能在高负载时较慢
|
||||
Reference in New Issue
Block a user