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
相关产品推荐
相关产品推荐

