You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solana开发:仅通过公钥能否获取用户Keypair?交易signers参数传值

Solana dApp前端用户签名传参方案

核心规则先明确

  • 不存在仅凭公钥生成有效Keypair的方法:Keypair的签名能力来自私钥,前端无法获取用户钱包私钥是钱包的标准安全设计,不存在绕过方案
  • 必须接入Solana Wallet Adapter对接用户钱包:这是Solana生态dApp和钱包交互的标准实现,你本地测试时传入自有Keypair到signers的逻辑,仅适用于本地持有私钥的测试场景,线上用户签名必须走钱包适配器
  • 当你正确通过AnchorProvider绑定钱包实例后,用户的签名由钱包自动完成,不需要你把用户账户加入signers数组:signers数组仅需要传入前端代码自持私钥的临时账户(比如生成的新内存账户),你这个转账场景不需要额外签名账户,传空数组即可。

正确实现步骤

1. 初始化对接钱包的Anchor Provider

不要用本地测试用的匿名provider,必须把Solana Wallet Adapter返回的已连接钱包实例传入AnchorProvider,初始化逻辑参考:

import { AnchorProvider, Program } from "@coral-xyz/anchor";
import { Connection, SystemProgram, LAMPORTS_PER_SOL } from "@solana/web3.js";
import { BN } from "@coral-xyz/anchor";

// 初始化链上RPC连接
const connection = new Connection("你的Solana RPC节点地址", "confirmed");

// 这里的wallet是Solana Wallet Adapter返回的已连接钱包实例,不是单纯的公钥字符串
// 该实例自带publicKey属性、signTransaction/signAllTransactions方法,符合Anchor钱包接口要求
const provider = new AnchorProvider(connection, wallet, { commitment: "confirmed" });

注意:不要单独存储walletAddress变量,直接从provider.wallet.publicKey取付款人地址,避免钱包切换后地址不一致的问题。

2. 修正转账函数

你之前的rpc调用写法是旧版Anchor语法,推荐用新版builder写法,signers传空数组即可,修正后代码:

const tipSol = async (receiverAddress) => {
  try {
    const program = new Program(idl, programID, provider);
    const lamportsToSend = LAMPORTS_PER_SOL / 100;
    const amount = new BN(lamportsToSend);

    await program.methods
      .sendSol(amount)
      .accounts({
        from: provider.wallet.publicKey,
        to: receiverAddress,
        systemProgram: SystemProgram.programId,
      })
      .signers([]) // 无前端自持私钥的额外签名账户,传空数组
      .rpc();

    console.log('Successfully sent 0.01 SOL!')
    window.alert(`You successfully tipped ${receiverAddress} 0.01 SOL!`)
  } catch (error) {
    console.error('Failed to send SOL:', error);
    window.alert(`Failed to send SOL: ${error.message}`);
  }
}

常见踩坑

  • 不要尝试用用户公钥生成Keypair塞入signers:没有私钥的Keypair无法生成有效签名,会直接触发链上签名校验失败
  • 不要自行实现钱包签名交互:Solana Wallet Adapter已经适配了Phantom、Solflare等所有主流钱包,调用rpc方法时会自动弹起钱包签名确认窗口,用户确认后会自动完成签名、广播、确认全流程,不需要额外写签名逻辑
  • 确认链上程序的from账户配置了#[account(signer, mut)]约束:你本地anchor test能跑通说明该约束已正确配置,无需修改链上代码

内容的提问来源于stack exchange,提问作者Dylan Molina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:36:19