Skip to Content
dApp 接入
本页目录

签署消息

当 Web 应用连接到 OneKey 时,它还可以请求用户签署给定的消息。应用可以自由编写自己的消息,这些消息将在 OneKey 的签名提示中显示给用户。消息签名不涉及网络费用,是应用验证地址所有权的便捷方式。

要发送消息让用户签署,Web 应用必须:

  1. 将消息字节作为 Uint8Array 提供;UTF-8 文本使用 TextEncoder 编码。
  2. 请求用户通过 OneKey 钱包签署编码后的消息。

使用 signMessage 方法

const provider = getProvider(); if (!provider) throw new Error('OneKey Solana provider is unavailable.'); const message = `To avoid digital dognappers, sign below to authenticate with CryptoCorgis`; const encodedMessage = new TextEncoder().encode(message); const signedMessage = await provider.signMessage(encodedMessage, "utf8");

使用 request 方法

const provider = getProvider(); if (!provider) throw new Error('OneKey Solana provider is unavailable.'); const message = `To avoid digital dognappers, sign below to authenticate with CryptoCorgis`; const encodedMessage = new TextEncoder().encode(message); const signedMessage = await provider.request({ method: "signMessage", params: { message: bs58.encode(encodedMessage), display: "utf8", }, });

request 示例需要 import bs58 from "bs58"。两种调用方式均返回包含 Uint8Array 类型 signature 和 PublicKey 类型 publicKey 的对象。display 选项仅影响显示,不改变被签署的字节。用于身份验证时,应对原始消息验证签名,并使用一次性挑战。

链下消息签名

当前 provider 源码支持版本 1,并要求提供预期签名者列表。使用便捷方法编码请求,并获取实际签署的完整字节。旧版钱包可能不支持此方法,请处理请求被拒绝的情况。

const provider = getProvider(); if (!provider) throw new Error('OneKey Solana provider is unavailable.'); const { publicKey } = await provider.connect(); const result = await provider.solSignOffchainMessage( 'Sign in to example.com. Nonce: <SERVER_GENERATED_NONCE>', [publicKey], ); // Verify result.signature against result.signedOffchainMessage and result.publicKey.

不要沿用旧版 version 0 请求格式。请核对应用支持的钱包版本中的方法可用性和响应结构。

最后更新于