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

NEAR合约部署成功但调用view方法遇MethodNotFound错误求助

NEAR合约部署成功但调用view方法触发MethodNotFound错误

问题背景

合约已通过官方RPC接口确认部署成功(返回有效code_base64值),但执行以下命令时触发MethodNotFound错误:

near view password.vitalii320.testnet get_solution
near view password.vitalii320.testnet get_password_number

合约Rust代码如下:

use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
use near_sdk::{near_bindgen, env};

const PASSWORD_NUMBER: u8 = 1;

#[near_bindgen]
#[derive(Default, BorshDeserialize, BorshSerialize)]
pub struct Contract {
    password_solution: String,
}

#[near_bindgen]
impl Contract {
    #[init]
    pub fn new(solution: String) -> Self {
        Self {
            password_solution: solution,
        }
    }

    pub fn get_password_number(&self) -> u8{
        PASSWORD_NUMBER
    }

    pub fn set_solution(&mut self, solution: String) {
        self.password_solution = solution;
    }

    pub fn get_solution(&self) -> String {
        self.password_solution.clone()
    }

    pub fn guess_solution(&mut self, solution: String) -> bool {
        if solution == self.password_solution {
            env::log_str("Success");
            true
        } else {
            env::log_str("Fail");
            false
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use near_sdk::test_utils::{get_logs, VMContextBuilder};
    use near_sdk::{testing_env, AccountId};

    fn get_context(predecessor: AccountId) -> VMContextBuilder {
        let mut builder = VMContextBuilder::new();
        builder.predecessor_account_id(predecessor);
        builder
    }

    #[test]
    fn debug_get_hash() {
        testing_env!(VMContextBuilder::new().build());
        let debug_solution = "tamago clarian";
        let debug_hash_bytes = env::sha256(debug_solution.as_bytes());
        let debug_hash_string = hex::encode(debug_hash_bytes);
        println!("Let's debug: {:?}", debug_hash_string);
    }

    #[test]
    fn check_guess_solution() {
        let clarian = AccountId::new_unchecked("clarian.testnet".to_string());
        let context = get_context(clarian);
        testing_env!(context.build());

        let mut contract = Contract::new("e9242595b2be15297c7a9b0433e22c3d95a2c013b0635ec0a37a14b3f9e8146c".to_string(),);

        let mut guess_result = contract.guess_solution("wrong answer".to_string());
        assert!(!guess_result, "Expectation: This is incorrect");
        assert_eq!(get_logs(), ["You shall not pass. Please try again."], "Expected a failure in logs");
        
        guess_result = contract.guess_solution("tamago clarian".to_string());
        assert!(guess_result, "Expectation: This is the correct answer");
        assert_eq!(get_logs(), ["You shall not pass. Please try again.", "You may enter! This is the right password"], "Expected a successful log after previous failed");
    }
}

排查与解决方法

  • 确认编译模式:必须使用release模式编译合约,debug模式会导致方法名混淆或未正确导出。执行以下命令重新编译:

    cargo build --target wasm32-unknown-unknown --release
    
  • 检查导出方法列表:通过命令查看合约实际导出的方法,确认目标方法是否存在:

    near contract inspect password.vitalii320.testnet
    

    如果输出中没有get_solution或get_password_number,说明编译/部署过程异常,需重新编译部署。

  • 验证合约初始化状态:确保已调用new方法完成合约初始化,执行类似命令:

    near call password.vitalii320.testnet new '{"solution": "your_solution"}' --account-id your-account.testnet
    
  • 核对账户名拼写:确认near view命令中的合约账户password.vitalii320.testnet与部署时的账户完全一致,避免拼写错误。

  • 检查依赖版本兼容性:确保Cargo.toml中near-sdk等依赖版本兼容,示例配置:

    [dependencies]
    near-sdk = "4.0.0"
    borsh = "0.10.3"
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:14:51