Skip to content

ITransactionService 交易服务

交易构建、签名、广播


职责

构建、签名、广播交易,查询交易状态和历史。


接口定义

ITransactionService {
  // 估算交易费用
  estimateFee(params: TransferParams): FeeEstimate
  
  // 构建未签名交易
  buildTransaction(params: TransferParams): UnsignedTransaction
  
  // 签名交易
  signTransaction(unsignedTx: UnsignedTransaction, privateKey: bytes): SignedTransaction
  
  // 广播交易
  broadcastTransaction(signedTx: SignedTransaction): TransactionHash
  
  // 查询交易状态
  getTransactionStatus(hash: TransactionHash): TransactionStatus
  
  // 查询交易详情
  getTransaction(hash: TransactionHash): Transaction
  
  // 查询交易历史
  getTransactionHistory(address: Address, options?: PaginationOptions): TransactionPage
  
  // 订阅交易状态
  subscribeTransaction(hash: TransactionHash, callback: (status: TransactionStatus) => void): Unsubscribe
}

数据结构

TransferParams

typescript
TransferParams {
  from: Address           // 发送方地址
  to: Address             // 接收方地址
  amount: Amount          // 发送金额(使用 Amount 类型)
  tokenAddress?: Address  // 代币地址(原生代币为空)
  memo?: string           // 备注(部分链支持)
  
  // 可选的费用覆盖
  gasLimit?: bigint
  gasPrice?: bigint
  maxFeePerGas?: bigint   // EIP-1559
  maxPriorityFeePerGas?: bigint
}

关于 Amount 类型的详细信息,请参阅 Amount 类型系统

FeeEstimate

typescript
FeeEstimate {
  slow: Fee               // 慢速(~5分钟)
  standard: Fee           // 标准(~1分钟)
  fast: Fee               // 快速(~15秒)
}

Fee {
  amount: Amount          // 费用金额(使用 Amount 类型)
  estimatedTime: number   // 预估确认时间(秒)
  gasLimit: bigint
  gasPrice: Amount
}

TransactionStatus

TransactionStatus {
  status: 'pending' | 'confirming' | 'confirmed' | 'failed'
  confirmations: number
  requiredConfirmations: number
  error?: string          // 失败原因
}

Transaction

typescript
Transaction {
  hash: TransactionHash
  from: Address
  to: Address
  amount: Amount          // 交易金额(使用 Amount 类型)
  fee: Amount             // 手续费(使用 Amount 类型)
  status: TransactionStatus
  timestamp: number
  blockNumber?: bigint
  memo?: string
  type: TransactionType
}

TransactionType = 'transfer' | 'token-transfer' | 'contract-call' | 'stake' | 'unstake'

交易流程

状态机

          构建交易


      ┌───────────────┐
      │   Unsigned    │  ← 待签名
      └───────┬───────┘
              │ 签名

      ┌───────────────┐
      │    Signed     │  ← 待广播
      └───────┬───────┘
              │ 广播

      ┌───────────────┐
      │    Pending    │  ← 等待打包
      └───────┬───────┘

      ┌───────┴───────┐
      ▼               ▼
 ┌─────────┐    ┌─────────┐
 │Confirming│   │ Failed  │
 └────┬────┘    └─────────┘
      │ 达到确认数

 ┌─────────┐
 │Confirmed│
 └─────────┘

完整流程

1. 用户输入转账参数


2. estimateFee() 获取费用选项


3. 用户确认费用


4. buildTransaction() 构建交易


5. 用户绘制图案解锁私钥


6. signTransaction() 签名


7. broadcastTransaction() 广播


8. subscribeTransaction() 等待确认


9. 显示结果

方法详情

estimateFee

估算交易费用,返回三个档位供用户选择。

行为规范

  • MUST 基于当前网络状态计算
  • MUST 考虑代币转账的额外 gas
  • SHOULD 留 20% 余量避免失败

buildTransaction

构建未签名交易。

行为规范

  • MUST 自动获取 nonce
  • MUST 验证余额充足
  • SHOULD 支持自定义 gas 设置

broadcastTransaction

将签名交易广播到网络。

行为规范

  • MUST 返回交易哈希
  • SHOULD 检测交易是否已存在
  • MUST 处理节点拒绝的情况

错误码

错误码说明用户提示
INSUFFICIENT_BALANCE余额不足"余额不足,请确保有足够的 {symbol}"
INSUFFICIENT_FEE手续费不足"需要至少 {amount} {symbol} 作为手续费"
INVALID_RECIPIENT收款地址无效"请输入正确的收款地址"
NONCE_TOO_LOWNonce 冲突"交易冲突,请稍后重试"
TRANSACTION_REJECTED交易被拒绝"交易被网络拒绝:{reason}"
TRANSACTION_TIMEOUT交易超时"交易长时间未确认,请检查网络"
GAS_TOO_LOWGas 不足"手续费设置过低,交易可能失败"

确认数要求

建议确认数原因
Ethereum12区块重组可能性
BSC15出块快,需更多确认
Bitcoin6行业标准
BFM1共识机制保证

Released under the MIT License.