本文将详细介绍如何使用 Cosmos SDK 将您的去中心化应用(DApp)与 Web3 钱包连接,并实现交易签署等核心功能。无论您是开发新手还是资深工程师,都能快速掌握接入流程。
环境准备与初始化
在开始接入前,请确保您的开发环境已更新至 6.94.0 或更高版本。通过 npm 安装 OKX Connect 后,即可开始集成工作。
初始化过程中,需要创建一个核心对象,用于后续的钱包连接和交易操作。该对象需要接收以下参数:
dappMetaData(对象类型)
- name(字符串):应用名称,注意这不作为唯一标识
- icon(字符串):应用图标的 URL 地址。请使用 PNG、ICO 等格式,推荐使用 180x180px 的 PNG 图标,暂不支持 SVG 格式
初始化成功后,将返回 OKXUniversalProvider 实例,这是后续所有操作的基础。
钱包连接流程
连接钱包是获取用户钱包地址的关键步骤,该地址将作为用户标识和交易签名的必要参数。
连接请求需要包含以下参数:
connectParams - ConnectParams
- namespaces:请求连接的必需信息,Cosmos 系的 key 为 "cosmos"。若请求的链中有任何一条链不被钱包支持,连接将被拒绝
- chains:字符串数组,包含链 ID 信息
- defaultChain(可选):默认链设置
- optionalNamespaces:请求连接的可选信息。即使对应的链信息不被支持,连接仍可继续进行
sessionConfig:会话配置对象
- redirect:连接成功后的跳转参数。对于 Telegram 中的 Mini App,可设置为 Telegram 的 deeplink: "tg://resolve"
连接成功后,将返回包含以下信息的 Promise 对象:
- topic:会话标识
- namespaces:成功连接的命名空间信息
- chains:连接的链信息
- accounts:连接的账户信息
- methods:当前命名空间下钱包支持的方法
- defaultChain:当前会话的默认链
- sessionConfig:会话配置信息
- dappInfo:DApp 相关信息
连接状态检测
在尝试进行任何交易操作前,建议先检测钱包是否已成功连接。此功能返回一个布尔值,简单明了地指示当前连接状态。
交易处理流程
创建交易提供者
首先需要创建 OKXCosmosProvider 对象,该对象的构造函数需要传入之前初始化的 OKXUniversalProvider。
获取账户信息
请求特定链的账户详细信息,需要提供以下参数:
- chainId:请求的链标识,如 "cosmos:cosmoshub-4" 或 "cosmos:osmosis-1"
返回的对象包含:
- algo:算法类型,通常为 "secp256k1"
- address:钱包地址
- bech32Address:bech32 格式的钱包地址
- pubKey:公钥(Uint8Array 格式)
消息签名
对指定消息进行签名需要提供以下参数:
- chain:执行方法的链
- signerAddress:签名钱包地址
- message:需要签名的消息内容
签名结果返回:
pub_key:公钥信息
- type:公钥类型
- value:公钥值
- signature:签名结果
签署交易:signAmino 方法
使用类似 cosmjs 的 OfflineSigner 的 signAmino 方法进行交易签名:
请求参数:
- chainId:请求签名执行的链(必传)
- signerAddress:钱包地址
- signDoc:交易信息对象,需按照固定格式
返回值:
- signed:交易信息对象
- signature:签名结果对象
签署交易:signDirect 方法
提供更直接的交易签名方式:
请求参数:
- chainId:请求签名执行的链(必传)
- signerAddress:钱包地址
signDoc:交易数据对象
- bodyBytes:Uint8Array
- authInfoBytes:Uint8Array
- chainId:字符串
- accountNumber:字符串
返回值:
- signed:交易信息对象
- signature:签名结果对象
连接管理与事件处理
断开钱包连接
当需要切换连接钱包时,请先断开当前钱包连接。此操作会删除当前会话,确保连接状态的清洁性。
事件监听
SDK 提供完整的事件机制,帮助开发者监听连接状态变化、交易状态更新等重要事件。
错误处理与调试
在连接、交易和断开连接的过程中,可能会遇到各种异常情况。以下是常见的错误码及其含义:
| 错误码 | 描述 |
|---|---|
| OKX_CONNECT_ERROR_CODES.UNKNOWN_ERROR | 未知异常 |
| OKX_CONNECT_ERROR_CODES.ALREADY_CONNECTED_ERROR | 钱包已连接 |
| OKX_CONNECT_ERROR_CODES.NOT_CONNECTED_ERROR | 钱包未连接 |
| OKX_CONNECT_ERROR_CODES.USER_REJECTS_ERROR | 用户拒绝操作 |
| OKX_CONNECT_ERROR_CODES.METHOD_NOT_SUPPORTED | 方法不支持 |
| OKX_CONNECT_ERROR_CODES.CHAIN_NOT_SUPPORTED | 链不支持 |
| OKX_CONNECT_ERROR_CODES.WALLET_NOT_SUPPORTED | 钱包不支持 |
| OKX_CONNECT_ERROR_CODES.CONNECTION_ERROR | 连接异常 |
常见问题
如何选择合适的签名方法?
signAmino 和 signDirect 两种方法适用于不同的场景。signAmino 提供更人性化的交易数据显示,而 signDirect 则提供更底层的交易控制。建议根据您的具体需求选择合适的方法。
连接被拒绝怎么办?
首先检查请求的链是否被钱包支持,然后确认命名空间设置是否正确。如果问题仍然存在,请检查错误码并参考相应的解决方案。
如何处理用户拒绝签名的情况?
当用户拒绝签名时,会返回 USER_REJECTS_ERROR 错误码。建议在应用中提供友好的提示信息,解释签名的重要性,并引导用户重新尝试。
如何确保交易安全性?
始终验证返回的交易数据,使用最新的 SDK 版本,并遵循最佳的安全实践。定期检查更新和安全通告,确保您的集成保持最新状态。
支持哪些 Cosmos 生态链?
SDK 支持主流的 Cosmos 生态链,包括 Cosmoshub、Osmosis 等。具体支持情况请参考最新文档,因为支持范围会随着生态发展而不断扩大。
如何调试连接问题?
建议使用提供的错误码进行初步排查,同时检查网络连接和参数配置。对于复杂问题,可以查看详细的事件日志和会话状态信息。