在去中心化应用(DApp)的开发过程中,如何高效、安全地与用户的钱包进行交互是核心环节之一。无论是连接钱包、发送交易还是处理签名,都需要遵循清晰的流程和规范。本文将详细介绍如何通过通用提供者(Universal Provider)实现与 EVM 兼容链的交互,涵盖初始化、连接、交易、RPC 使用及异常处理等关键步骤。
初始化提供者
在开始连接钱包之前,需要先初始化通用提供者对象。该对象将用于后续所有与钱包的交互操作,包括连接、发送交易和签名等。
使用 npm 安装依赖后,通过以下方法进行初始化:
OKXUniversalProvider.init({
DAppMetaData: {
name: "您的应用名称",
icon: "应用图标的URL"
}
})参数说明:
DAppMetaData:应用元数据对象,包含以下属性:name:应用名称(非唯一标识)。icon:应用图标的 URL。需为 PNG 或 ICO 格式(不支持 SVG),建议使用 180x180px 的 PNG 图标。
返回值:初始化后的 OKXUniversalProvider 实例。
连接钱包
连接钱包是获取用户地址和权限的第一步,也是后续交易和签名操作的基础。
调用以下方法发起连接请求:
okxUniversalProvider.connect(connectParams);请求参数(connectParams):
namespaces:必要命名空间信息。例如,EVM 链使用"eip155"。若请求的链中有任意一条不被钱包支持,连接将被拒绝。chains:要连接的链 ID 列表。defaultChain(可选):默认链 ID。rpcMap(可选):RPC URL 映射,仅支持 EVM 链。配置的链必须包含在chains中。optionalNamespaces:可选命名空间信息。可用于请求自定义网络,若钱包不支持,仍可连接但不会返回该链信息。sessionConfig:会话配置,如连接成功后的跳转链接(例如 Telegram Mini App 可使用tg://resolve)。
返回值(Promise):
topic:会话标识。namespaces:已连接的命名空间信息。chains:已连接的链列表。accounts:账户地址列表。methods:钱包支持的方法列表。defaultChain:当前会话的默认链。sessionConfig:会话配置信息。DAppInfo:DApp 元数据(名称、图标等)。
检查钱包连接状态
在发起交易或签名前,建议先检查当前是否已连接钱包:
const isConnected = okxUniversalProvider.isConnected();返回值:布尔值(true 表示已连接)。
发起交易与签名
通过 request 方法向钱包发送消息,支持签名、交易等多种操作:
okxUniversalProvider.request(requestArguments);请求参数(requestArguments):
method:方法名(如personal_sign、eth_sendTransaction等)。params:方法参数(可选)。redirect:返回策略(如tg://resolve,默认为none)。chain:执行操作的链 ID(建议显式指定,否则使用默认链)。
返回值(根据方法不同而异):
personal_sign:返回签名字符串。eth_sendTransaction:返回交易哈希。eth_accounts:返回默认链的地址列表。wallet_switchEthereumChain:返回null。- 其他方法详见文档。
使用 RPC 扩展功能
当内置方法无法满足需求时,可通过配置 RPC 实现更多功能。在连接钱包时,通过 rpcMap 参数配置自定义 RPC URL:
rpcMap: {
"chainId1": "rpc-url-1",
"chainId2": "rpc-url-2"
}注意:配置的链必须已在 chains 参数中声明。
设置默认网络
当用户连接多条链时,若未明确指定操作网络,系统将使用默认网络进行交互。可通过以下方式设置默认链:
// 在 connect 参数中指定
connectParams.defaultChain = "chainId";
// 或在请求中单独指定
requestArguments.chain = "chainId";断开钱包连接
如需断开当前钱包连接并删除会话,可调用:
okxUniversalProvider.disconnect();注意:切换钱包前请先断开当前连接。
事件监听
通用提供者支持事件监听机制,可监听连接状态变化、账户切换等事件。具体事件类型包括:
connect:连接成功时触发。disconnect:连接断开时触发。session_update:会话更新时触发。
错误码说明
在连接、交易或断开过程中可能抛出以下异常:
| 错误码 | 描述 |
|---|---|
| UNKNOWN_ERROR | 未知异常 |
| ALREADY_CONNECTED_ERROR | 钱包已连接 |
| NOT_CONNECTED_ERROR | 钱包未连接 |
| USER_REJECTS_ERROR | 用户拒绝操作 |
| METHOD_NOT_SUPPORTED | 方法不支持 |
| CHAIN_NOT_SUPPORTED | 链不支持 |
| WALLET_NOT_SUPPORTED | 钱包不支持 |
| CONNECTION_ERROR | 连接异常 |
常见问题
1. 如何判断钱包是否支持某条链?
在连接时通过 namespaces 或 optionalNamespaces 参数请求链信息。若钱包不支持,连接可能被拒绝或返回中不包含该链。
2. 用户拒绝连接或签名怎么办?
捕获 USER_REJECTS_ERROR 异常,并提示用户操作已取消。建议提供清晰的引导说明操作必要性。
3. 如何添加自定义网络?
在 optionalNamespaces 中声明自定义链,若钱包不支持,可调用 wallet_addEthereumChain 方法动态添加。
4. RPC 配置有哪些注意事项?
仅 EVM 链支持自定义 RPC,且必须在 chains 列表中声明。配置后可通过标准 JSON-RPC 接口访问链数据。
5. 断开连接后是否需要重新初始化?
不需要。断开仅清除当前会话,提供者实例可重复用于连接新钱包。
6. 如何切换默认链?
在请求中通过 chain 参数显式指定链 ID,或通过 defaultChain 设置会话默认值。
通过以上步骤,您可以高效地实现 DApp 与钱包的交互,为用户提供流畅的 Web3 体验。务必在处理敏感操作时添加异常处理,并遵循最佳安全实践。