БЛИЖНИЙ протокол — что происходит, когда аргументы метода контракта Rust объявляются как (

#token #blockchain #smartcontracts #nearprotocol

#токен #блокчейн #smartcontracts #nearprotocol

Вопрос:

Недавно я скопировал вставил кучу сигнатур методов и попытался создать метод просмотра для смарт-контракта NEAR:

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

При вызове этого контракта с его использованием near-api-js выдается сообщение об ошибке, в котором говорится, что метод не разрешен env::attached_deposit() .

Вы видите проблему?

Ответ №1:

Когда метод в Rust объявляется с аргументами (amp;mut self, ...) , вы указываете компилятору, что хотите изменить состояние контракта, «self» .

Вы получите сообщение об ошибке, если попытаетесь вызвать этот метод как viewMethod из near-api-js.

Исправление заключается в объявлении методов просмотра с такими аргументами (amp;self, ...) , указывающими, что вы НЕ будете изменять состояние контракта, вызывая эту функцию.

Тонкий нюанс Rust и near-sdk-rs, но важный!

Комментарии:

1. Я не использовал near-sdk-rs, но изменяемые ссылки и связанные с ними ограничения являются одним из основных преимуществ rust, а не тонким нюансом 🙂

2. Без обид, но что эта пара вопросов / ответов проясняет больше, чем этот очень распространенный источник документации ? Есть ли что-то специфичное для конкретного API? ( mut включает изменчивость …)

3. Я отредактировал вопрос, чтобы подчеркнуть, что эта ситуация конкретно относится к NEAR blockchain near-sdk-rs и связанным с ним JavaScript SDK. Я понимаю, что сообщество Rust очень увлечено, но эти отрицательные отзывы и комментарии кажутся вопиющими.

4. Вы можете увидеть мой комментарий к изменениям… Рассмотрите возможность удаления отрицательных голосов, поскольку есть другие сообщества, использующие Rust в разных контекстах, и они могут извлечь выгоду из специфики этого примера.

5. Также удален тег Rust, поэтому сообщество Rust теперь может игнорировать этот вопрос.