rust - 如何检查 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() /*...*/
})),
);
}
}
解决方案
检查的唯一方法是尝试失败的方法:
- 打个乐观电话
- 设计足够的回调/承诺来处理失败的情况。
不幸的是,这很复杂,我们无法处理边缘情况。我们无法以可靠的方式检查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 运行时中检查外部帐户的工作正在进行中。
推荐阅读
- html - 正确使用关键字的元标记
- python - 尝试通过 Telegram BOT 在 Python 中使用 Cloudinary 上传图像时出现问题
- python - 如何使用 Python 从 Excel 中提取数据并将其传输到 Powerpoint 上的现有图表和表格?
- python - 我需要帮助在 python 中使用 pandas 编辑日期时间格式
- javascript - Blazor 服务器端 - 如何选择相机并拍照
- reactjs - 限制 NextJS 在包罗万象的路由 + 模态路由上预取
- python - RuntimeError:mat1 和 mat2 形状不能相乘(5376x28 和 784x512)
- c++ - WSL 中的奇怪输出编码
- python - 如何使用带有 FFmpeg 的 Python 自动剪切视频?
- docker - 如何在 Dockerfile 中创建目录