我试图在锚Solana中运行以下代码,程序如下所示:
use anchor_lang::prelude::*;
declare_id!("RnbXAWg5mCvmSafjd1CnYaz32qLgZHdeHK6xzHDi1yU");
#[program]
pub mod sol_proj_1 {
use super::*;
pub fn initialize(ctx: Context<Initialize>, data: u64) -> ProgramResult {
let my_account = &mut ctx.accounts.my_account;
my_account.data = data;
println!("hello there!");
Ok(())
}
pub fn update(ctx: Context<Update>, data: u64) -> ProgramResult {
let my_account = &mut ctx.accounts.my_account;
my_account.data = data;
Ok(())
}
}
// #[derive(Accounts)]
// pub struct Initialize {}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init, payer = user, space = 8 + 8)]
pub my_account: Account<'info, MyAccount>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct Update<'info> {
#[account(mut)]
pub my_account: Account<'info, MyAccount>,
}
#[account]
pub struct MyAccount {
pub data: u64,
}
试验程序如下:
import * as anchor from '@project-serum/anchor';
import { Program } from '@project-serum/anchor';
import { SolProj1 } from '../target/types/sol_proj_1';
const assert = require("assert");
describe('sol_proj_1', () => {
// Configure the client to use the local cluster.
const provider = anchor.Provider.local();
anchor.setProvider(provider);
// The Account to create.
const myAccount = anchor.web3.Keypair.generate();
const program = anchor.workspace.SolProj1 as Program<SolProj1>;
it('Is initialized!', async () => {
// Add your test here.
const tx = await program.rpc.initialize(new anchor.BN(1234), {
accounts: {
myAccount: myAccount.publicKey,
user: provider.wallet.publicKey,
systemProgram: program.programId,
},
signers: [myAccount],
});
/
console.log("Your transaction signature", tx);
});
});
运行以下命令时出错Anchor test
1) sol_proj_1
Is initialized!:
Error: failed to send transaction: invalid transaction: Transaction failed to sanitize accounts offsets correctly
at Connection.sendEncodedTransaction (node_modules/@solana/web3.js/src/connection.ts:3740:13)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at Connection.sendRawTransaction (node_modules/@solana/web3.js/src/connection.ts:3700:20)
at sendAndConfirmRawTransaction (node_modules/@solana/web3.js/src/util/send-and-confirm-raw-transaction.ts:27:21)
at Provider.send (node_modules/@project-serum/anchor/src/provider.ts:118:18)
at Object.rpc [as initialize] (node_modules/@project-serum/anchor/src/program/namespace/rpc.ts:25:23)
我尝试了以下方法
1.更改程序所有权,因为我发现这可能会导致问题,但没有工作。
1.我还在锚.toml中添加了条目,测试在localhost上运行
1.我发现空钱包也可能导致这个问题,但我有空投100溶胶在它
- Rust代码部署正确,但测试失败,“sanitizationfailure”如下所示:“交易未能正确清理帐户偏移,这意味着该TX未采取帐户锁定,不应解锁。”我找不到如何取出锁定源的任何信息:https://docs.rs/solana-sdk/1.9.2/solana_sdk/transaction/enum.TransactionError.html
任何帮助都是感激不尽的!
3条答案
按热度按时间plicqrtu1#
我能看到的唯一明显的一点是你从前端传入系统程序的方式。你传入了你的程序的id,而你应该传入系统程序的id。所以,试着:
cgh8pdjw2#
我以前遇到过这个错误,现在已经解决了。在我的案例中,我发现锚.toml中的Program_Id与www.example.com中的Program_Id不同lib.rs,它们应该是相同的。Program_Id是通过在终端中运行“anchor deploy”生成的。
eimct9ow3#
在终端中运行“锚部署”,并将程序id复制到Anchor.toml和lib.rs