Skip to main content

Core Space 与 eSpace 互操作介绍

Conflux 在 2.0 升级中引入了一个独立的 EVM 完全兼容空间 eSpace。该空间可以被认为是一个与以太坊等效的独立区块链,并且与原有的 Conflux 链也相互独立。为了解决两条链之间的互操作问题,此次升级同步引入了一个新的内置合约 CrossSpaceCall 用于实现 CFX 互跨,以及数据,状态的通信。

映射地址(mirror address)

关于映射地址参看此篇介绍

CrossSpaceCall 内置合约

假设我们在 eSpace 部署了一个非常简单的合约 Counter 地址为 0xc655a016f2ebe30f0dbe1a957d439104e05451e9。现在我们演示如何在 Core 空间合约中通过 CrossSpaceCall 内置合约同 Counter 合约进行交互(读取,更新)。

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
        number = newNumber;
    }

    function increment() public {
        number++;
    }
}

这样我们就可以在 Core 中开发并部署一个合约,该合约通过 CrossSpaceCall 内置合约实例,可以在 eSpace 中的 Counter 合约中读取,写入数据。

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import "@confluxfans/contracts/InternalContracts/CrossSpaceCall.sol";

contract CrossSpaceDemo {
    CrossSpaceCall crossSpaceCall = CrossSpaceCall(0x0888000000000000000000000000000000000006);
    
    address eSpaceCounterAddr = 0xc655A016f2eBE30f0DBe1A957D439104E05451e9;

    function setNumber(uint256 newNumber) public {
        // use abi.encodeWithSignature method to build the method call data
        crossSpaceCall.callEVM(bytes20(eSpaceCounterAddr), abi.encodeWithSignature("setNumber(uint256 newNumber)", newNumber));
    }

    function getNumber() public returns (uint256) {
        bytes memory num = crossSpaceCall.callEVM(bytes20(eSpaceCounterAddr), abi.encodeWithSignature("number()"));
        // use abi.decode to decode data
        return abi.decode(num, (uint256));
    }
}

ConfluxHub Space Bridge App