首页 > 解决方案 > 如何检查 NEAR 账户是否部署了智能合约并实现了所需的接口?

问题描述

如果另一个帐户具有与之关联的智能合约并实现某些接口,是否有办法检查智能合约内部(在 Rust 中)?

特别是,在这个函数中,我想检查接收者是否是智能合约以及它是否具有所需的方法:

trait FTReceiver {
    fn on_nft_receive(&self, sender: AddressID, token: AddressID) -> bool;
}
pub fn transfer(&mut self, recipient: AccountID, reference: String) {
    // note: env::* functions below don't exist!
    if env::has_smart_contract(recipient) && env::ctr_implements(recipient, FTReceiver) {
        Promise::new(token.clone()).function_call(
            "on_ft_receive".into(),
            &serde_json::to_vec(&json!({
                "sender": env::predecessor_account_id() /*...*/
            })),
        );
    }
}

标签: rustsmartcontractsnearprotocol

解决方案


检查的唯一方法是尝试失败的方法:

  1. 打个乐观电话
  2. 设计足够的回调/承诺来处理失败的情况。

不幸的是,这很复杂,我们无法处理边缘情况。我们无法以可靠的方式检查Promise失败的原因。承诺可能会因为以下原因而失败:A) 账户没有智能合约,B) 智能合约没有被调用的函数 C) 函数失败(例如断言失败)。这个限制在 Simulation Tests repository: Error messages early in promise execution 中有描述。模拟测试使用与区块链完全相同的运行时代码。

解决方法

正如@vlad-frolow 所注意到的,我们的智能合约可以使用view方法来报告它们的接口。在撰写本文时,此视图方法还没有标准。

一个想法:

pub fn implements_nep(&self, nep String) -> bool {
   nep == "21" || nep == ...

}

笔记:

在 NEAR 运行时中检查外部帐户的工作正在进行中。


推荐阅读