NEAR协议-将Rust合约方法args声明为&mut self,...vs.&self,...会发生什么?

问题描述

最近,我复制粘贴了一些方法签名,并尝试为NEAR智能合约创建视图方法

pub fn get_credits(&mut self,account_id: AccountId) -> u128 {
    self.credits.get(&account_id).unwrap_or(0)
}

使用near-api-js调用此合同时,将引发错误提示不允许使用该方法env::attached_deposit()

您看到问题了吗?

解决方法

当用参数(&mut self,...)声明Rust中的方法时,您是在向编译器指示要更改合同状态(即“自我”)。

如果您尝试从Near-api-js将该方法作为viewMethod调用,则会收到错误消息。

解决方法是使用类似(&self,...)的参数声明视图方法,指示您不会通过调用此函数来更改合同的状态。

Rust和Near-SDK-RS的细微差别,但很重要!