链软件版本v0.24.1支持跨链么

链软件版本v0.24.1支持跨链么。如果支持,想要支持跨链的话,简单的步骤能介绍下么。https://docs.citahub.com/zh-CN/cita/privacy/crosschain-contract-example#docsNav 这上面讲的跨链的话,是不是新增加一个跨链合约就可以实现。

0.24.1支持跨链。

我这里补充说明一下为什么CITA 1.0缺失了很多功能。
因为CITA 在1.0之前采用GPL开源协议,使用了一些基于GPL协议的第三方代码。
CITA 1.0之后切换为Apache-2.0开源协议,之前使用的第三方的GPL代码就不能用了。
有一些关键地方的代码我们重写了。
但是因为时间人力等方面的限制,有些不常用的功能里的GPL代码是直接去掉了,相应的功能就不可用了。

跨链功能的使用:

业务上就一个合约就行了,但是这个合约需要一些特殊的写法。
文档里以一个跨链token合约做了详细的说明。
如果你的场景更复杂,可以具体说一下你的问题。

运维上需要做些工作。
需要 relayer不停将侧链的块头搬到主链去,跨链交易也需要 relayer搬运相关交易的证明。
这里我们只提供了一个命令行工具,运行一次只搬一个东西。
如果要长时间运行,需要自己把这个封装成一个持续自动运行的服务。

这个跨链是转移,不是复制,目前看只能转移token,不能转移数据是这样么。

如过要把一条链的业务数据复制到另一条链,用cita的跨链可以实现么,如果能,应该怎么去实现,能具体讲一下步骤么。

对于跨链来说,转移的就是数据和相应的默克尔树证明。
至于这个数据是什么含义,是合约自己解释的。

至于复制和转移。
那个跨链token例子的处理是,在主链上把一些token销毁了,然后把证据传到侧链去,侧链验证之后,在侧链上增发对应数量的token。
当然也可以主链上不销毁哪些token。这都是你的token合约里面的逻辑,可以根据业务场景随便定的。
我不知道这个是不是就是你说的复制和转移的区别?

如果只是要复制合约里的数据的话,最简单的方式是合约提供get/set接口。
从原来的链上通过get接口获取到合约的数据,然后set到新的链上就可以了。

其实跨链的核心功能跟这个方法很像,只不过get到的数据是带默克尔树证明的,不怕中间传数据的人作恶。

目前官网的跨链token的例子是在主链上把一些token销毁了,然后把证据传到侧链去,侧链验证之后,在侧链上增发对应数量的token。 因为示例合约是token合约,如果是其他实体合约的话,比如是资金合约的话,是不是就可以转移资金了?需要在官网demo上做哪些变动?可以大概说一下么

跨链测试结果

cita版本20.2.0 发送tx_proof到侧链时,创世块CrossChain合约调用原生合约验证交易,原生合约出错造成reverted
cita版本0.24.2 成功部署Mytoken合约,但获取余额是none,导致后序不能执行
cita版本0.25.2 调用创世块管理合约ChainManager,不能正确读取chainId,导致后续不能执行

这些版本执行结果为什么有差异呢。

    uint256 txDataSize = 0x20;

    function sendToSideChain(
        uint toChainId,
        address destContract,
        bytes txData
    ) public {
        require(txData.length == txDataSize);
        // ---业务相关代码开始---
       // 将要跨链传递的业务数据序列化到txData里
        uint256 value;
        assembly {
            value := mload(add(txData, 0x20))
        }
       // ---业务相关代码结束---
        require(balanceOf[msg.sender] >= value);
        bytes4 destFuncHasher = bytes4(keccak256("recvFromSideChain(bytes)"));
        sendTransaction(toChainId, destContract, destFuncHasher);
        // ---业务相关代码开始---
       // 跨链之后,发送侧后续的业务处理
        balanceOf[msg.sender] -= value;
         // ---业务相关代码结束---
    }

    // verify_proof need:
    // check from_chain_id in ChainManager.sideChains
    // check to_chain_id == my chain_id
    // check dest_contract == this
    // check hasher == RECV_FUNC_HASHER
    // check cross_chain_nonce == cross_chain_nonce
    // extract origin tx sender and origin tx data
    function recvFromSideChain(bytes txProof) public {
        address sender;
        bytes memory txData;
        (sender, txData) = verifyTransaction(txProof, txDataSize);
         // ---业务相关代码开始---
        // 将跨链传递的业务数据从txData里反序列化出来
        uint256 value;
        assembly {
            value := mload(add(txData, 0x20))
        }
        // 对反序列化出来的业务数据进行后续业务处理
        balanceOf[sender] += value;
         // ---业务相关代码结束---
    }

核心就这是这两个函数,这两个函数是一对的。

我已经通过注释把业务相关的代码标出来了,除此以外的代码都不要动就可以了。

跨链传递的就是txData这个bytes。
在这里例子里面,只是把txData这个bytes解释成了value。如果你是其他业务,按照你的业务需求传任意的数据都可以。
sendToSideChain的第一段业务代码相当于是序列化。
recvFromSideChain里verifyTransaction返回的也是bytes,后面相当于是反序列化,然后是业务处理。
我已经添加了相关注释,你可以再理解一下。

20.2.0版本不支持跨链,原因我上面已经说过了。

你可以跑一下源码里的 tests/integrate_test/cita_crosschain.sh 这是一个完整的跨链测试。
我们的CI里面有跑这个测试,正式发布的版本应该都是没问题的。

你也可以参照这个脚本看看流程上是否有遗漏的地方。

我觉得你遇到的问题可能原因是主链和侧链创建链配置的时候需要指定一些东西。

主链和侧链,在创建链的时候需要指定一些参数。
主链和侧链要指定不同的chainid。

    ./scripts/create_cita_config.py create --chain_name mainchain \
        --super_admin "0x4b5ae4567ad5d9fb92bc9afd6a657e6fa13a2523" \
        --nodes "127.0.0.1:14000,127.0.0.1:14001,127.0.0.1:14002,127.0.0.1:14003" \
        --jsonrpc_port 11337 --ws_port 14337 \
        --contract_arguments "SysConfig.chainId=${main_chain_id}"

侧链创建链的配置的时候,要把主链的chainid和主链的共识节点列表传进来。

    ./scripts/create_cita_config.py create --chain_name sidechain \
        --super_admin "0x4b5ae4567ad5d9fb92bc9afd6a657e6fa13a2523" \
        --nodes "127.0.0.1:24000,127.0.0.1:24001,127.0.0.1:24002,127.0.0.1:24003" \
        --authorities "${side_auths}" \
        --jsonrpc_port 21337 --ws_port 24337 \
        --contract_arguments "SysConfig.chainId=${side_chain_id}" \
            "ChainManager.parentChainId=${main_chain_id}" \
            "ChainManager.parentChainAuthorities=${main_auths}"

在配置主侧链的时候,需要重新进行链配置么。按照CITA目前的现状,好像运行中的链不支持动态的配置更改,这会有影响么。

这些是要创建链的时候就配置好的,否则跨链就会报错。

已经在跑的链,可以用管理员进行数据订正,把这些数据强行写进去。但是这种方法比较危险,操作要谨慎。