gpt4 book ai didi

rust - 如何检查 NEAR 账户是否部署了智能合约并实现了所需的接口(interface)?

转载 作者:行者123 更新时间:2023-12-03 11:29:41 27 4
gpt4 key购买 nike

如果另一个账户有与之关联的智能合约并实现了一些接口(interface),是否有一种方法可以检查智能合约内部(在 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() /*...*/
})),
);
}
}

最佳答案

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

  1. 做出乐观的决定
  2. 设计足够的回调/ promise 来处理失败情况。

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

解决方法

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

一个想法:

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

}

备注:

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

关于rust - 如何检查 NEAR 账户是否部署了智能合约并实现了所需的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64134251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com