rust - NEAR-sdk #[near_bindgen] 与其他宏冲突

标签 rust nearprotocol rust-macros near-sdk-rs

我整理了一个最小的工作示例,您可以在这里看到它:https://github.com/synthesis-labs/near-mwe 。总之:我有一个简单的宏,用于检查所有者(合约的struct上下文中的任意定义)是否具有特定的身份。这只是一个简单的扩展和插入到函数的 AST 中。

当我使用经典的 cargo build 构建它时,构建工作正常并且宏适当扩展;然而,要部署智能合约,我需要为 WASM-32 目标构建;然后项目无法编译。有趣的是,如果我删除 #[near_bindgen] 指令,那么我可以针对 WASM-32 目标进行构建,并且宏会正确扩展。

使用包含的 #[near_bindgen] 进行编译并针对 WASM-32 目标时出现的错误如下:

cargo build --target wasm32-unknown-unknown

error[E0424]: expected value, found module `self`
  --> src/main.rs:13:5
   |
13 |     #[state_safe]
   |     ^^^^^^^^^^^^^ `self` value is a keyword only available in methods with a `self` parameter
14 |     pub fn change_owner(&mut self, new_owner: String) -> () {
   |            ------------ this function can't have a `self` parameter

我可以在没有 --target wasm32-unknown-unknown 的情况下成功构建项目,或者我可以删除 #[near_bindgen] 并使用 构建它--target wasm32-unknown-unknown 指令。

最佳答案

看起来 near_bindgen 与您的宏配合得不好。我注意到 near_bindgen 仅检测公共(public)函数,因此是否可以像这样分开您的两个问题:

#[near_bindgen]
impl Main {
    #[state_safe]
    fn change_owner(&mut self, new_owner: String) -> () {
        self.owner = new_owner;
    }

    pub fn change_owner_pub(&mut self, new_owner: String) -> () {
        self.change_owner(new_owner)
    }
}

可能不完全是您想要的,但在有人找到更好的解决方案之前可能是一个不错的解决方法。

关于rust - NEAR-sdk #[near_bindgen] 与其他宏冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75887893/

相关文章:

async-await - 调用 FutureExt::boxed() 时缺少 Send 的实现

nearprotocol - 如何从地址调用不同的合约?

rust - 有什么方法或方法可以检查近帐户 ID 上的 accesskey 权限吗?

rust - 如何创建类似函数的过程宏?

rust - 这个 mem::transmute::<&str, &'static str>(k) 安全吗?

rust - 如何使结构可调用?

rust - 如何导出同名的函数和宏?

for-loop - 元组在for循环中被破坏了吗?

nearprotocol - 如何将near-cli创建的 key 导入NEAR钱包?