【问题标题】:NEAR Protocol - What happens when Rust contract method args are declared as (&mut self, ...) vs. (&self, ...)?NEAR 协议 - 当 Rust 合约方法 args 被声明为 (&mut self, ...) 与 (&self, ...) 时会发生什么?
【发布时间】:2021-01-12 20:20:58
【问题描述】:

最近我复制粘贴了一堆方法签名,并尝试为 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()

你发现问题了吗?

【问题讨论】:

    标签: token blockchain smartcontracts nearprotocol


    【解决方案1】:

    当使用 args (&mut self, ...) 声明 Rust 中的方法时,您向编译器表明您希望改变合约的状态,即“self”。

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

    解决方法是使用 (&self, ...) 这样的参数声明视图方法,表明您不会通过调用此函数来更改合约的状态。

    Rust 和 Near-sdk-rs 的细微差别,但很重要!

    【讨论】:

    • 没用过 near-sdk-rs,但可变引用和相关限制是 rust 的主要卖点之一,而不是细微差别:)
    • 无意冒犯,但是这对问题/答案比this very common source of documentation 更能说明什么?是否有特定于特定 API 的东西? (mut 启用可变性...)
    • 我已经编辑了这个问题来强调这种情况,特别是指 NEAR 区块链 near-sdk-rs 和相关的 JavaScript SDK。我知道 Rust 社区非常热情,但这些反对票和 cmets 似乎令人震惊。
    • 你可以看到我对编辑的评论...考虑删除反对票,因为有其他社区在不同的环境中使用 Rust,他们可能会从这个例子的特殊性中受益。
    • 还删除了 Rust 标签,以便 Rust 社区现在可以忽略这个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多