- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在合约之间的异步调用链中捕获和处理异常?
假设我的事务发起了以下调用:
contractA.run()
-> do changes in contractA
-> calls contractB.run()
-> do changes in contractB
-> then calls another method on contractA: contractA.callback()
* callback() crashes
在 Promise 中发生异常后,NEAR 不会回滚过去 Promise 中发生的更改。我也没有在
near-sdk 中看到任何处理异常的方法。 .
contractB.do
在上面的示例中会出现 panic )。
最佳答案
捕获异常的唯一方法是对生成异常的 Promise 进行回调。
在解释的场景中,contractA.callback()
不应该崩溃。您需要足够仔细地构建合约以避免回调失败。大多数情况下是可以做到的,因为您控制回调的输入和附加的气体量。如果回调失败,则类似于在异常处理代码中出现异常。
另请注意,您可以确保 callback
在 contractA.run()
中附加了足够的气体后,已正确安排.如果不是这种情况,例如您没有足够的气体连接到 run
,回调和其他promise的调度将失败,整个状态来自run
更改被回滚。
但是有一次run
完成,状态从 run
更改 promise 和callback
必须仔细处理。
我们在 lockup
有几个地方允许回调失败的合约:https://github.com/near/core-contracts/blob/6fb13584d5c9eb1b372cfd80cd18f4a4ba8d15b6/lockup/src/owner_callbacks.rs#L7-L24
还有大部分回调不会失败的地方:https://github.com/near/core-contracts/blob/6fb13584d5c9eb1b372cfd80cd18f4a4ba8d15b6/lockup/src/owner_callbacks.rs#L28-L61
指出在某些情况下合约不想依赖其他合约的稳定性,例如当流量为 A --> B --> A --> B
.在这种情况下 B
无法将回调附加到提供给 A
的资源.对于这些场景,我们正在讨论添加一个特定构造的可能性,该构造是一个原子并且一旦它被删除就具有解析回调。我们称之为 Safe
: https://github.com/nearprotocol/NEPs/pull/26
编辑
What if
contractB.run
fails and I will like to update the state incontractA
to rollback changes fromcontractA.run
?
contractA.callback()
仍然被调用,但它有
PromiseResult::Failed
对于它的依赖
contractB.run
.
callback()
可以修改
contractA
的状态还原更改。
contractA
)试图从质押池(
run()
)中提取资金(
contractB
),但由于最近取消质押,资金可能仍被锁定,因此提取失败(
contractB.run()
失败)。
contractA.callback()
),它检查 promise (
contractB.run
)是否成功。由于提款失败,回调将状态恢复到原始状态(恢复状态)。
A.withdraw_all -> B.get_amount -> A.on_amount_for_withdraw -> B.withdraw(amount) -> A.on_withdraw
关于rust - NEAR 跨合约调用异常如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62987417/
我有一个非常简单的 SQL 语句 SELECT * FROM Table; 但是,我的查询引擎返回一个语法错误。为什么? 错误详情: An unhandled exception of type 'S
从以下位置运行练习:/starter--near-sdk-as产量 ... NEAR CLI 有可用的小更新 2.1.1 → 2.2.0 ││ 运行 yarn add near-cli 以避免意外行为
我需要以编程方式获取 NEAR 区 block 链中抵押的 NEAR 代币总数,就像 NEAR 浏览器中显示的那样 (https://explorer.near.org/nodes/validator
使用近钱包 URL 登录后,用户可以在区 block 链上进行任意数量的交易,而无需每次都征求许可(这与使用元掩码不同)。如果应用程序在未经用户许可的情况下进行未经授权的交易,比如盗用用户的所有资金怎
目前正在阅读文档并尝试想出一个工作示例来创建一个新帐户,JsonRpcProvider 有一些问题 - 想在这里发布完整的示例,因为我认为它对任何人都有用搜索者 const keyStore = ne
我正在开发一个网络应用程序,并希望使用 near 按钮登录以通过网络钱包连接到网络,这样我的用户就可以调用网络中的合约。我找到了 https://corgis.near.org/ 上托管的 corgi
我正在为一个多币种钱包的后端工作,我已经使用 near-api-js 提供了对 NEAR 协议(protocol)的支持,但我仍然坚持为主网网络设置一个帮助程序 url。我最初使用 https://h
我创建了一个 Hazelcast 设置,其中一个节点运行 hazelcast 实例。我的客户端应用程序使用客户端配置从 Hazelcast 实例读取缓存。我想在我的客户端应用程序中实现 Near 缓存
在 Rust 中,我们在标准库中有许多可用的数据结构。 NEAR 协议(protocol)在 near-api-rs 中有一些优化的数据结构,但主要区别是什么? 最佳答案 Evgeny Kuzyako
任何人都可以帮助我处理涉及值(value)/接近的交易/操作类型。我见过多种操作类型,如转移,绘制等 最佳答案 NEAR 协议(protocol)中只有 7 种原生 Action 类型: 转账(存款从
一些从存储设备生成的公钥是 ed25519: 前缀后的 44 个字符(总共 52 个),有些是 43 个字符(总共 51 个)。这是允许的吗? ed25519: 是否需要在使用公钥时包含前缀? 最佳答
我想检查一个浮点值是否“接近”32 的倍数。例如64.1“几乎”可以被 32 整除,63.9 也是如此。 现在我正在这样做: #define NEARLY_DIVISIBLE 0.1f float o
如何在合约之间的异步调用链中捕获和处理异常? 假设我的事务发起了以下调用: contractA.run() -> do changes in contractA -> calls contra
我想要一个 MySQL 查询: 要显示“接近”的重复行,请使用:引用和相同的引用 + 模式“-??” (“-”和 2 个字符,“?”是一个随机字符)。 带有 id、reference 的表的示例: i
我正在尝试从嵌套的mongodb文档中找到最接近的编码。我不断收到的错误如下: 我已经尽力想了一切。我试图添加索引2d,但这两个都不起作用。 var point = GeoJson.Point(Geo
按我要返回的文档中的属性进行过滤时遇到问题...甚至不知道如何表达这个问题。例如: 我正在开发一个系统,如果附近有工作弹出,用户会收到警报。该用户定义如下: var user = new Schema
将 $near 与 mongodb 结合使用,按距离返回结果。有没有办法知道(或指定)距离匹配时的排序顺序? 例如,如果我请求 10 个文档并且它们的距离都相同,然后请求另外 10 个文档并且它们与第
我有一个类似的收藏 { "_class" : "User", "_id" : "id1", "places" : [ {
我正在尝试测试帐户的 NEAR 余额是否增加和减少。env::account_balance() 即使有 attached_deposit 似乎也没有改变。 #[test] fn takes_acco
我正在尝试学习如何允许 1 个帐户(“捐赠匹配器”)将资金存入第二个帐户( this contract ,作为“托管”帐户),第三个帐户(常规“捐助者”)然后被允许触发发送到第四个帐户(“收件人”,例
我是一名优秀的程序员,十分优秀!