Skip to content

使用 Solana CLI 进行链下消息签名

链下消息签名是一种使用 Solana 钱包对非交易消息进行签名的方法。此功能可用于验证用户身份或提供钱包所有权的证明。

签名链下消息

要签署任意链下消息,请运行以下命令:

bash
solana sign-offchain-message <MESSAGE>

消息将被编码并使用 CLI 的默认私钥签名,签名结果将输出。如果你想使用其他密钥签名,只需使用 -k/--keypair 选项:

bash
solana sign-offchain-message -k <KEYPAIR> <MESSAGE>

默认情况下,构建消息的版本为0,这是当前唯一支持的版本。当其他版本可用时,您可以使用 --version 选项覆盖默认值:

bash
solana sign-offchain-message -k <KEYPAIR> --version <VERSION> <MESSAGE>

消息格式根据版本和消息文本自动确定。

版本 0 头部指定了三种消息格式,以便在消息的兼容性和组合之间做出权衡:

ID编码方式最大长度硬件钱包支持
0受限制的 ASCII *1212
1UTF-81212仅盲签名
2UTF-865515

* 是指 isprint(3) 返回 true 的那些字符,即 0x20..=0x7e

格式 01 是针对硬件钱包支持设计的,因为硬件钱包的 RAM 用于存储有效载荷,并且字体字符支持有限。

要使用 Ledger 硬件钱包签署链下消息,请确保你的 Ledger 运行最新的固件版本以及 Solana Ledger 应用程序版本 1.3.0 或更高版本。在 Ledger 解锁且 Solana Ledger 应用程序打开后,运行:

bash
solana sign-offchain-message -k usb://ledger <MESSAGE>

有关如何设置和使用账本设备的更多信息,请查阅此链接

请注意,UTF-8 编码的消息需要在 Solana Ledger App 中启用 Allow blind sign (允许盲签名)选项。此外,由于 Ledger 设备缺乏 UTF-8 支持,在这种情况下仅会显示消息的哈希值。

如果 Display mode(展示模式)设置为 Expert(专家模式) ,Ledger 将显示有关要签名的消息的技术信息。

验证链下消息签名

要验证链下消息签名,请运行以下命令:

bash
solana verify-offchain-signature <MESSAGE> <SIGNATURE>

CLI 会使用默认的签名者公钥。您可以使用 --signer 选项来指定其他的密钥:

bash
solana verify-offchain-signature --signer <PUBKEY> <MESSAGE> <SIGNATURE>

如果签名邮件的版本与默认版本不同,则需要显式指定匹配版本:

bash
solana verify-offchain-signature --version <VERSION> <MESSAGE> <SIGNATURE>

协议规范

为了确保链下消息不是有效的交易,它们被编码为固定的前缀: \xffsolana offchain ,其中选择第一个字节,使其作为当今交易 MessageHeader 中的第一个字节隐含非法。有关有效载荷格式和其他注意事项的更多详细信息,请参阅[提案](More details about the payload format and other considerations are available in the proposal.)。