MultiversX跨合约存储读取Skill mvx_cross_contract_storage

该技能用于在MultiversX区块链上直接读取同一分片智能合约的存储,无需代理调用,减少气体开销和异步复杂性。适用于智能合约开发、区块链应用优化和性能提升。关键词:MultiversX, 跨合约, 存储读取, 智能合约, 区块链开发, 气体优化。

智能合约 0 次安装 0 次浏览 更新于 3/21/2026

name: mvx_cross_contract_storage description: 使用storage_mapper_from_address直接读取同一分片合约的存储。

MultiversX 跨合约存储读取

直接读取另一个合约的存储映射器——无需代理调用的气体开销,无异步复杂性。

何时使用

标准 storage_mapper_from_address 代理调用
仅同一分片 是(必需) 跨分片工作
只读 读写
需要在目标上计算
气体成本 ~存储读取成本 ~执行 + 存储
需要知道存储密钥 否(使用ABI)

核心模式

#[multiversx_sc::module]
pub trait ExternalStorageModule {
    // 简单值
    #[storage_mapper_from_address("total_supply")]
    fn external_total_supply(&self, contract_address: ManagedAddress) -> SingleValueMapper<BigUint, ManagedAddress>;

    // 复合键(特定于代币)
    #[storage_mapper_from_address("balance")]
    fn external_balance(&self, contract_address: ManagedAddress, token_id: &TokenIdentifier) -> SingleValueMapper<BigUint, ManagedAddress>;

    // 模块前缀键
    #[storage_mapper_from_address("pause_module:paused")]
    fn external_paused(&self, contract_address: ManagedAddress) -> SingleValueMapper<bool, ManagedAddress>;
}

关键规则

  1. 字符串必须完全匹配目标合约中的存储密钥
  2. 第一个参数必须是 ManagedAddress
  3. 返回类型的第二个泛型必须是 ManagedAddress
  4. 额外参数成为复合键部分

如何发现存储密钥

  1. 源代码:目标中的 #[storage_mapper("key")]
  2. ABI:.abi.json 列出所有密钥
  3. 模块密钥:前缀如 pause_module:paused

安全

  • 仅同一分片:跨分片读取默默返回默认值——无错误
  • 陈旧数据:反映目标在当前位置的状态
  • 密钥更改:如果目标在升级中重命名密钥,读取默默中断
  • 只读:无法写入另一个合约的存储

反模式

  • 未验证空结果(默默获取默认0/false)
  • 未验证目标在同一分片