1

我正在为 NEAR 区块链编写一个智能合约承诺接口。

我有以下界面:

#[ext_contract(token_receiver)]
pub trait ExtTokenReceiver {

    fn process_token_received(&self, sender_id: AccountId, amount: Balance, message: [u8]) -> Option<String>;
}

但是,这失败并出现以下错误:

error: Unsupported argument type.
  --> src/token.rs:32:1
   |
32 | #[ext_contract(token_receiver)]
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)
  • 如何调试近绑定宏
  • Unsupported argument type在这种情况下是什么
  • 如何修复我的界面
4

2 回答 2

2

我相信不受支持的论点是[u8]。我已将代码更改为使用 Vec 并且它可以工作:

use near_sdk::ext_contract;

#[ext_contract(token_receiver)]
pub trait ExtTokenReceiver {
    fn process_token_received(
        &self,
        sender_id: AccountId,
        amount: Balance,
        message: Vec<u8>,
    ) -> Option<String>;
}
    Finished release [optimized] target(s) in 0.05s

我认为编译器在编译时不知道静态数组的大小并抱怨的问题,而 Vec 因为它是一个很好的动态容器。

于 2020-09-24T21:41:28.640 回答
2

对于第一个问题,它说:每晚运行-Z macro-backtrace,您可以通过编辑项目的build.sh. 在 rust 中调试宏的另一个工具是使用cargo-expand,它将从改变的 AST 反编译。

对于第二个和第三个问题:我的猜测是它是[u8],它是一个必须在编译时知道的数组。您应该使用Vec<u8>, 可以&[u8]在需要的地方强制转换。

于 2020-09-24T21:28:17.393 回答