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

