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));
}
}
No Comments