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

调用Solana Anchor程序hello_world方法时遇encode未定义错误求助

调用Solana Anchor hello_world方法时触发TypeError的排查方案

错误信息

TypeError: Cannot read properties of undefined (reading 'encode')
    at .../node_modules/@coral-xyz/anchor/dist/cjs/program/namespace/index.js:35:100

相关代码

JavaScript调用代码

import { Program, AnchorProvider, setProvider } from '@coral-xyz/anchor';
import { PublicKey, Connection, Keypair } from '@solana/web3.js';
import bs58 from 'bs58';
import idl from './operator.json';

const connection = new Connection("http://127.0.0.1:8899"); // Localnet
const scionx = Keypair.fromSecretKey(bs58.decode("my_secret_key"));

const provider = new AnchorProvider(connection, scionx, { commitment: "confirmed" });
setProvider(provider);

const programID = new PublicKey("CMjNnp9yvMUqKJF2jB6E5HHpktwhm1ax9rHzh5risdNK");
const program = new Program(idl, programID, provider);

const tx = await program.methods.helloWorld().accounts({
  user: scionx.publicKey
}).rpc();

console.log("Transaction signature:", tx);

Rust合约代码

use anchor_lang::prelude::*;

#[program]
pub mod operator {
    pub fn hello_world(_ctx: Context<HelloWorld>) -> Result<()> {
        msg!("Hello, World!");
        Ok(())
    }
}

#[derive(Accounts)]
pub struct HelloWorld<'info> {
    pub user: Signer<'info>,
}

可能的原因及解决方法

  • IDL文件与部署的合约不匹配
    这是最常见的触发原因。需确认operator.json是部署当前合约后生成的最新IDL:

    • 重新部署合约后,执行anchor idl fetch <program-id>更新本地IDL文件;
    • 检查IDL的methods字段,确认存在helloWorld(Anchor会自动将Rust蛇形命名转为JS驼峰命名),且对应的accounts结构与合约中HelloWorld结构体完全一致。
  • Anchor版本不兼容
    确保前端依赖的@coral-xyz/anchor版本与合约中anchor-lang的版本完全一致:

    • 查看Cargo.toml中anchor-lang的版本,对比package.json中@coral-xyz/anchor的版本;
    • 若版本不一致,升级或降级其中一方至相同版本,重新安装依赖并部署合约。
  • 程序ID配置错误
    确认JS代码中使用的programID与实际部署的合约程序ID完全匹配:

    • 部署合约时anchor deploy会输出程序ID,核对是否与代码中的CMjNnp9yvMUqKJF2jB6E5HHpktwhm1ax9rHzh5risdNK一致;
    • 若程序ID变更,同步更新JS代码中的对应值。
  • Provider上下文干扰
    尝试移除全局provider设置,仅通过Program构造函数传入provider,排除全局上下文的潜在问题:

    // 注释掉setProvider(provider);
    const program = new Program(idl, programID, provider);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:10:05