名称: mvx_sharp_edges 描述: 识别MultiversX特定的WASM、Gas限制和异步调用失败中的奇怪行为。
MultiversX 尖锐边缘
此技能提醒您注意常导致错误的非显而易见行为、"陷阱"和平台特定怪癖。
1. 异步回调与回滚
- 边缘: 当异步调用失败时,执行
#[callback]。 - 尖锐逻辑:
- 如果您未实现回调,资金将返回到合约,但原始交易中的状态更改不会自动回滚。
- 缓解措施: 您必须在回调中手动回滚状态,如果子调用失败(或谨慎使用同步
back_transfers)。
2. Gas限制与Gas耗尽(OOG)
- 边缘: OOG引发特定错误,但如果未处理,可能使系统处于部分状态。
- 尖锐逻辑:
- 跨分片OOG: 如果目标分片耗尽Gas,交易失败,但发送分片已处理转账。回调以错误触发。
3. 存储映射器与Rust类型
- 边缘:
VecMapper不是Vec。 - 尖锐逻辑:
Vec将所有内容加载到WASM内存中(内存峰值)。VecMapper不加载任何内容,直到您调用get(i)。- 错误: 使用
Vec表示所有用户列表 = 用户增长时OOG。
4. 令牌小数精度
- 边缘: ESDT可以有0-18位小数。
- 尖锐逻辑:
- 硬编码
10^18表示“一个令牌”是错误的。 - 始终获取
decimals或要求标准18位小数令牌。
- 硬编码
5. 可升级性
- 边缘:
#[init]在升级时不调用。#[upgrade]被调用。 - 尖锐逻辑:
- 如果您添加新的存储映射器,必须在
#[upgrade]中初始化它。 - 更改现有映射器的存储布局(例如
struct字段顺序)会损坏数据。
- 如果您添加新的存储映射器,必须在
6. 视图中的区块信息
- 边缘:
get_block_timestamp_millis()/get_block_timestamp_seconds()在#[view]中(链下模拟)可能返回0或与链上不同的值。自Supernova(0.6秒轮次)以来,更推荐使用get_block_timestamp_millis()与TimestampMillis以获得亚秒精度。 - 尖锐逻辑:
- 不要依赖区块信息进行关键的链下视图逻辑。