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 用户就只能干等了

举报· 517 次点击
登录 注册 站外分享
4 条回复  
renfei 楼主 小成 2025-8-16 19:46:23
忘记 @Livid 站长大大了,考虑一下不🙏
Livid 初学 2025-8-16 21:06:52
@renfei 我想想…… 那么,如果你用 Ledger 操作现在 FSHEX 的打赏流程(打赏流程目前不要求绑定钱包),能完成吗?
renfei 楼主 小成 2025-8-16 21:32:57
@Livid 可以打赏的,交易签名没问题,见: https://solscan.io/tx/xacMVQrcijP4bDuQzx8xTZnbixgFkqHLYoFN1oNc7dvTigzoNLrxdrwiVQcc2DB2ySgXqCQDFRh92DzC9qcenAo
Livid 初学 2025-8-16 21:36:30
@renfei 感谢确认。那一种可能的实现方式是,在打赏的时候,提供一个可选项,将打赏地址和当前 cookie 账号绑定。
返回顶部