Ledger 的 Solana 目前无法 signMessage

参见官方文档: https://support.ledger.com/article/Unable-to-sign-off-chain-Message-with-Ledger-Solana-wallet-created-in-third-party-wallets
GitHub: https://github.com/LedgerHQ/ledger-live/issues/11239
从很久就是已知问题了,但官方目前只能保证交易签名是稳定的。这就导致 Ledger 用户无法在 F站绑定
交易 + Memo 替代
原理
- 构造一笔 0 SOL 转账交易( from → from ,自转账);
- 在交易里附加 Memo 程序指令,把你要签的消息放进去;
- 用户用 Ledger 签这笔交易;
- 后端拿到交易签名、解码 Memo ,验证签名是否匹配用户公钥。
前端示例( JavaScript + @solana/web3.js + Wallet Adapter )
import {
Connection,
PublicKey,
Transaction,
SystemProgram,
} from '@solana/web3.js';
import { WalletNotConnectedError } from '@solana/wallet-adapter-base';
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base';
import { MemoProgram } from '@solana/spl-memo';
async function signMessageWithMemo(wallet, message) {
if (!wallet.publicKey) throw new WalletNotConnectedError();
const connection = new Connection('https://api.mainnet-beta.solana.com');
// 构造交易:0 SOL 自转账 + Memo
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: wallet.publicKey,
toPubkey: wallet.publicKey,
lamports: 0,
}),
MemoProgram.memo({ memo: message }) // 将你的消息放入 Memo
);
// 请求用户签名
const signedTransaction = await wallet.signTransaction(transaction);
// 序列化为 base64 或 hex ,发送给后端
const serialized = signedTransaction.serialize().toString('base64');
return serialized;
}
站长是否考虑一下?要不然 Ledger 用户就只能干等了
|