CrossSpaceCall 合约
Conflux eSpace 和 Core Space 是两个独立的 space,您不能直接将 CFX 从 base32 地址发送到十六进制地址。 您只能使用 Confluxhub Space Bridge 在 eSpace 和 Core Space 之间转移 CFX。
在底层,Core Space 中有一个名为 CrossSpaceCall 的内置合约,用于在 eSpace 和 Core Space 之间转移 CFX。 通过CrossSpaceCall,在Core Space内直接与eSpace合约进行互动成为可能。 这个合约是由 CIP-90 引入的。
CrossSpaceCall 接口
这个合约在 Core Space 中可用,地址为:
- base32 地址:'cfx:aaejuaaaaaaaaaaaaaaaaaaaaaaaaaaaa2sn102vjv'
- 十六进制地址(在 solidity 中使用):
0x0888000000000000000000000000000000000006
以下是这个合约的接口:
interface CrossSpaceCall {
/**
* @dev 在 eSpace 中部署一个合约
* @param init bytes - 合约初始化字节码
* @return bytes20 - 部署合约的十六进制地址
*/
function createEVM(bytes calldata init) external payable returns (bytes20);
/* 跨空间 CFX 转移的方法 */
/**
* @dev 将 CFX 从 Core space 转移到 eSpace 指定地址。转移金额由交易值指定。
* @param to bytes20 - 接收方在 eSpace 的十六进制地址
* @return output bytes - 交易输出
*/
function transferEVM(bytes20 to) external payable returns (bytes memory output);
/**
* @dev 从 eSpace 映射账户余额中提取 CFX
* @param value uint256 - 需要提取的 CFX 数量
*/
function withdrawFromMapped(uint256 value) external;
/**
* @dev 查询 eSpace 映射账户的 CFX 余额
* @param addr address - 需要查询的 core 地址
* @return uint256 - 余额
*/
function mappedBalance(address addr) external view returns (uint256);
/**
* @dev 查询 eSpace 映射账户的 nonce
* @param addr address - 需要查询的 core 地址
* @return uint256 - Nonce 值
*/
function mappedNonce(address addr) external view returns (uint256);
/* 其他跨空间操作的方法 */
/**
* @dev 从 Core space 调用 eSpace 合约方法
* @param to bytes20 - eSpace 中合约的十六进制地址
* @param data bytes - 合约方法调用数据
* @return output bytes - 方法调用结果
*/
function callEVM(bytes20 to, bytes calldata data) external payable returns (bytes memory output);
/**
* @dev 从 Core space 静态调用 eSpace 合约方法
* @param to bytes20 - eSpace 中合约的十六进制地址
* @param data bytes - 合约方法调用数据
* @return output bytes - 方法调用结果
*/
function staticCallEVM(bytes20 to, bytes calldata data) external view returns (bytes memory output);
}
在 eSpace 和 Core Space 之间转移 CFX
通过调用 CrossSpaceCall 内置合约的相关方法,可以实现在 eSpace 和 Core Space 之间转移 CFX。
注意,CrossSpaceCall(如同其他内置合约一样)只能在 Conflux Core Space 中访问。
从 Core Space 到 eSpace
从 Core 到 eSpace:要将 CFX 从 Conflux Core 转移到 Conflux eSpace,需要调用该合约的 transferEVM(bytes20 to)
方法。 此转移的目的地址由方法参数 to
指定。 跨空间转移将在一个单一的原子步骤中执行。
function transferEVM(bytes20 to) external payable returns (bytes memory output);
JS 示例
const { Conflux, Drip } = require('js-conflux-sdk');
const conflux = new Conflux({
url: 'https://main.confluxrpc.com',
chainId: 1029,
});
const account = conflux.wallet.addPrivateKey(process.env.PRIVATE_KEY);
const crossSpaceCall = conflux.InternalContract('CrossSpaceCall');
async function main() {
const eSpaceAddress = '0x3D69D968e3673e188B2D2d42b6a385686186258f';
const receipt = await crossSpaceCall.transferEVM(eSpaceAddress)
.sendTransaction({
from: account,
value: Drip.fromCFX(1), // 转移 1 CFX,金额由 value 指定
}).executed();
console.log(`转移到 ${eSpaceAddress} ${receipt.outcomeStatus === 0 ? 'succeed' : 'failed'}`);
}
main();