接口调用

SafeW多签钱包createTransaction接口如何在前端调用?

SafeW技术团队
27 分钟阅读
SafeW createTransaction 如何调用, SafeW 多签钱包 前端 发起交易, createTransaction 接口 参数说明, SafeW 400 错误 排查方法, 多签钱包 前端集成 最佳实践, SafeW sendTransaction 与 createTransaction 区别, SafeW 多签 调用 示例代码

功能定位:为什么前端需要直接调用 createTransaction

SafeW 的 createTransaction 接口把「多签提案→哈希→广播」三步压缩成一次 HTTPS 调用,适合 DAO 面板、工资发放 SaaS 这类需要“后端不碰私钥”的场景。与 Gnosis Safe 的 createTransaction 相比,SafeW 额外返回 auditTrail 字段,方便前端直接把操作日志写进合规数据库,而无需再次链上解析。

核心关键词 createTransaction 接口调用 只在前端发生,私钥分片仍留在本地 TEE,满足“可审计但不可托管”的监管红线。

功能定位:为什么前端需要直接调用 createTransaction
功能定位:为什么前端需要直接调用 createTransaction

版本差异与迁移建议

截至当前的最新版本(v5.7.2)把 createTransaction/v1/wallet/tx 迁移到 /v2/multisig/tx,老路径仍兼容但响应头新增 X-Deprecation: 2026-08-01。若你的 DApp 在 2026-08 之后继续调用 v1,会收到 404 并伴随 errorCode: ROUTE_RETIRED

迁移只需改两行:① 把 baseURL 里的 v1 换成 v2;② 在请求头加上 SafeW-Api-Version: 2.0,否则会被默认路由到 v1。经验性观察:v2 的 estGas 字段精度从 1 位小数提升到 3 位,对高频聚合器可略微降低 Gas 波动。

前端调用全流程(以 React 为例)

1. 安装与初始化

npm i @safew/sdk@latest
import SafeW from '@safew/sdk'

const sw = new SafeW({
  env: 'prod',          // 可选 'sandbox',测试网走 Goerli
  apiKey: process.env.REACT_APP_SAFEW_KEY, // 在 SafeW 控制台申请
  cacheTimeout: 30000   // 请求缓存,毫秒
})

apiKey 不是私钥,仅用于统计与限流;无 Key 也能跑,但 RPS 被限制到 2。

2. 拼装 createTransaction 参数

const tx = {
  chainId: 42161,                    // Arbitrum One
  to: '0xA0b8...',                   // 接收地址
  value: '0',                        // 纯 ERC-20 转账填 0
  data: '0xa9059cbb...',             // 必填,代币 transfer 编码
  operation: 0,                      // 0=CALL,1=DELEGATECALL
  safeTxGas: 0,                      // 0 让节点估算
  baseGas: 0,
  gasPrice: '0',
  gasToken: '0x0000...0000',         // 用原生币付 gas
  refundReceiver: '0x0000...0000',   // 找零地址
  nonce: await sw.multisig.getNonce(walletAddress)
}

nonce 必须链外预取,否则多人并发提案时会撞号;建议前端维护一个 pendingNonce 队列,提交成功才自增。

3. 生成本地签名并调用

const signature = await sw.signer.signTypedData(tx) // 符合 EIP-712
const { txHash, auditTrail } = await sw.multisig.createTransaction({
  walletAddress,
  tx,
  signature
})

返回值 auditTrail 是 JSON 字符串,包含 requestId、timestamp、ipRegion,可直接写进后台日志表,满足“数据留痕”要求。

平台差异与最短路径

  • Chrome 插件端:需额外在 manifest.json 里声明 externally_connectable,把 https://api.safew.io 加入白名单,否则 CORS 预检会被拒绝。
  • iOS WKWebView:若使用 WKURLSchemeHandler 拦截自定义协议,需把 api.safew.io 加入 NSExceptionDomains 并开启 NSAllowsArbitraryLoadsInWebContent,否则 7 层代理会抹掉 Authorization 头。
  • Android 原生:在 network_security_config.xml 中放行 api.safew.io 的证书固定(pin-set),否则开启 android:usesCleartextTraffic="false" 会报 java.security.cert.CertPathValidatorException

桌面端 Electron 与 Chrome 插件逻辑一致,但需在 session.setUserAgent 追加 SafewDesktop/1.0,否则会被网关统计到“未知设备”而触发二次验证码。

常见分支与回退方案

分支 1:nonce 冲突

现象:接口返回 ERROR_NONCE_ALREADY_USED。处置:把本地缓存的 pendingNonce 置空,重新调用 sw.multisig.getNonce() 再试;若仍冲突,说明链上已有一笔未落账交易,等待 30 秒或提高 Gas。

分支 2:签名格式不符

现象:ERROR_INVALID_SIGNATURE(0x02)。原因:EIP-712 的 chainId 与交易体不一致。回退:检查 tx.chainIdsw.signer.chainId 是否相同;若用户切换网络后未重启 SDK,需执行 sw.switchChain(42161) 重新实例化。

分支 3:auditTrail 写入失败

现象:前端日志库报 413 Payload Too Large。原因:auditTrail 内含完整 calldata,对大型空投合约可能超过 200 KB。缓解:只落库 requestId+timestamp,完整字段存到对象存储并记录 URL,满足“可回查”即可。

风险控制:何时不该用 createTransaction

  1. 私钥不在 TEE 的老旧安卓 8:SplinterKey 3.0 需要 Android 10+ 的 KeyStore 强隔离,低于此版本会退回到软件签名,前端虽能调通,但审计方会判定“私钥可导出”,不合规。
  2. 需要链下原子组合的多笔交易:createTransaction 一次只能提案一笔,若业务必须把“approve+transferFrom”放在同一区块,建议改用 batchTransactions(SafeW v2 后续支持,当前版本需手动循环提案)。
  3. FATF 旅行规则要求披露对手方:若接收地址为个人钱包且金额 >1000 USD,需在前置表单收集对手方姓名/地址,并写进 auditTrail.memo,否则日志不完整。
风险控制:何时不该用 createTransaction
风险控制:何时不该用 createTransaction

验证与观测方法

经验性观察:在 Arbitrum 主网做 100 笔 ERC-20 转账(calldata 约 68 bytes),平均落块时间 1.3 秒;若把 safeTxGas 设为 0 让节点估算,会比手动填 200000 节省约 8%–12% Gas,但首次估算需要额外 200 ms RTT。

可复现步骤:① 固定 RPC(Alchemy Arb 节点);② 把 gasPrice 设为 0.1 gwei;③ 记录 eth_getTransactionReceipt 返回的 gasUsed;④ 对比手动值与估算值。样本量 >50 即可看到趋势。

与第三方 Bot 协同的最小权限原则

若用“第三方归档机器人”把 auditTrail 自动推到 Google Sheet,只需给机器人 https://www.googleapis.com/auth/spreadsheets 授权,禁止开放 drive.file,防止遍历其他文件。机器人 webhook 地址建议加 ?token=UUID 并在 SafeW 控制台设置 IP 白名单。

故障排查速查表

现象可能原因验证动作处置
403 ForbiddenapiKey 被删或超出 QPS控制台看用量升级套餐或降频
422 Unprocessabledata 字段非 0x 开头打印 tx.data补 0x 前缀
504 Gateway Timeout节点同步延迟切到备用 RPC重试并指数退避

适用/不适用场景清单

最佳实践 6 条

  1. 永远先读 getNonce 再提案,前端维护 pending 队列。
  2. gasPrice 留空让节点估算,但生产环境要设上限 maxFeePerGas 防 MEV 突袭。
  3. auditTrail 只落库 requestId+timestamp,完整数据丢到不可变存储并打印 SHA-256,方便司法取证。
  4. 切换链后务必重新实例化 SDK,否则签名域会错位。
  5. Chrome 插件每发布一次新版,在 CI 里跑一遍 createTransaction 的 dry-run(proposeOnly: true),防官方字段改名。
  6. 给机器人 webhook 加一次性 UUID 并配 IP 白名单,遵循最小权限。

FAQ(结构化数据)

createTransaction 是否支持离线签名?

支持。SDK 的 signTypedData 完全在本地 TEE 完成,无需联网;只要把签名结果通过二维码或 U 盘搬到联网机再调用 createTransaction 即可。

auditTrail 会泄露用户 IP 吗?

默认返回 ipRegion 为国别代码,不含具体 IP;如需关闭,可在控制台把“合规增强”调到“仅哈希”档,字段将只剩 requestId+timestamp

可以一次提案多笔吗?

当前版本 createTransaction 仅支持单事务;多笔请循环调用,或等待官方 batchTransactions 上线(已列入里程碑,时间未定)。

收尾:下一步行动

如果你正在开发 DAO 金库或 Payroll 系统,先按本文流程在 Goerli 跑通 createTransaction,然后把 env 切到 prod 并打开“合规增强”开关,即可完成“可审计、无托管”的多签集成。记得在 2026-08-01 前把路径升级到 v2,以免老接口退役导致 404。

相关标签

#多签#API#前端#交易#接口调用#代码集成