搭建WeCross跨链平台,并编写跨链智能合约

这篇具有很好参考价值的文章主要介绍了搭建WeCross跨链平台,并编写跨链智能合约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WeCross是由微众银行自主研发并完全开源的区块链跨链协作平台,支持应用与多链互操作、同/异构链间互操作等多维跨链交互。——来自《WeCross技术文档》

本教程基于wecross-demo,以实现多群组跨链为例:

wecross,区块链

跨链示例:以group1作为源链、group2作为目标链,group2上部署了智能合约,其中包括了全局变量data和修改全局变量data的函数setData(_data)。在跨链过程中,group1发起跨链请求传递函数参数data,指定目标函数就是group2上智能合约对应的setData,试图修改group2上的全局变量data,以此实现跨链合约调用。

0. 环境配置

Ubuntu Linux 18.04

MySQL

Java 11.0.18

1. 安装wecross-demo

下载脚本:

  • cd ~
  • bash <(curl -sL https://gitee.com/WeBank/WeCross/raw/master/scripts/download_demo.sh)

 执行脚本:

  • cd ~/wecross-demo
  • bash clear.sh
  • bash build_cross_groups.sh

执行期间需要输入MySQL数据库的ip、端口port、用户名username和密码password: 

wecross,区块链

 下载完成之后输入y,开启控制台console:wecross,区块链

 输入login,进入管理员控制台:wecross,区块链

 2. 编写跨链合约

跨链合约需要包含三个函数:

  1. 源链中发起跨链交易的函数
  2. 目标链中处理跨链交易的函数
  3. 源链中接收跨链交易执行结果的回调函数

合约源码路径:~/wecross-demo/WeCross-Console/conf/contracts/solidity/SetDataInterchain.sol

如下所示:

pragma solidity ^0.5.0;

pragma experimental ABIEncoderV2;
import "./WeCrossHub.sol";

contract SetDataInterchain {
    // 声明WeCrossHub
    WeCrossHub hub;
    function init(address _hub) public {
        hub = WeCrossHub(_hub);
    }

    // 全局变量data
    string data;
    constructor() public {}
    function setData(string memory _data) public {
        data = _data;
    }
    function getData() public returns (string memory) {
        return data;
    }

    // 1.源链中发起跨链交易的函数
    function setDataInterchainInvoke(
        string memory _path,
        string memory _method,
        string memory _data,
        string memory _callbackPath,
        string memory _callbackMethod
    ) public returns (string memory) {
        // 将待跨链传递的参数data存储在args中
        string[] memory args = new string[](1);
        args[0] = _data;

        return
            hub.interchainInvoke(
                _path,
                _method,
                args,
                _callbackPath,
                _callbackMethod
            ); // WeCrossHub将args进行跨链传递
    }

    // 2.目标链中处理跨链交易的函数
    function setDataFromInterchain(string[] memory args)
        public
        returns (string[] memory)
    {
        // 目标链收到args,然后执行setData
        setData(args[0]);
        return args;
    }

    // 3.源链中接收跨链交易执行结果的回调函数
    function setDataInterchainCallback(bool state, string[] memory _result)
        public
        returns (string[] memory)
    {
        // 源链根据回调的结果_result,可选的进行后续操作
        if (state) {}
        return _result;
    }
}

3. 部署跨链合约

3.1-3.4展示在group1上部署跨链合约的四个步骤,3.5在group2上展示四个步骤的全流程。

3.1 部署单链合约

执行命令: 

  • bcosDeploy payment.group1.SetDataInterchain conf/contracts/solidity/SetDataInterchain.sol SetDataInterchain 1.0

保存合约地址:0xdd46661c0f32003a644f079395010c632da626e2

 测试一下函数功能:

  • sendTransaction payment.group1.SetDataInterchain setData HelloWorld
  • call payment.group1.SetDataInterchain getData

wecross,区块链

3.2 将单链合约注册为跨链资源

  • bcosRegister payment.group1.SetDataInterchain conf/contracts/solidity/SetDataInterchain.sol 0xdd46661c0f32003a644f079395010c632da626e2 SetDataInterchain 2.0

wecross,区块链

 注意:0xdd46661c0f32003a644f079395010c632da626e2是单链上的合约地址,版本号2.0要与刚才单链部署的1.0版本号进行区分。

3.3 部署WeCrossHub

每条链上都部署WeCrossHub用于与其他链进行通信。

  • bcosDeploy payment.group1.WeCrossHub conf/contracts/solidity/WeCrossHub.sol WeCrossHub 2.0

保存WeCrossHub的地址:0x3a5b4196646c1b7ec6cba22258986f4097903196

wecross,区块链

 3.4 跨链资源绑定到WeCrossHub

执行SetDataInterchain合约中的init初始化函数,输入WeCrossHub的地址:

  • sendTransaction payment.group1.SetDataInterchain init "0x3a5b4196646c1b7ec6cba22258986f4097903196"

wecross,区块链

实现SetDataInterchain和WeCrossHub之间的绑定,因此合约SetDataInterchain才具备与外界进行跨链通信的能力。

 3.5 在group2上部署的全部流程

  • bcosDeploy payment.group2.SetDataInterchain conf/contracts/solidity/SetDataInterchain.sol SetDataInterchain 1.0
  • bcosRegister payment.group2.SetDataInterchain conf/contracts/solidity/SetDataInterchain.sol 0x87f3bb38533280a278d7a3e8558bc787d10addf5 SetDataInterchain 2.0

wecross,区块链

  • bcosDeploy payment.group1.WeCrossHub conf/contracts/solidity/WeCrossHub.sol WeCrossHub 2.0
  • sendTransaction payment.group2.SetDataInterchain init "0x150d4d7cacf6a36b860c5777819eb58279e633f3" 

wecross,区块链

4. 跨链合约调用

 4.1 源链发起跨链调用

  • sendTransaction payment.group1.SetDataInterchain setDataInterchainInvoke payment.group2.SetDataInterchain setDataFromInterchain NewHelloWorld payment.group1.SetDataInterchain setDataInterchainCallback

wecross,区块链

根据sendTransaction可以看出,这条命令本质上只是源链上的一笔合约调用交易。第二个参数payment.group1.SetDataInterchain是合约名称、第三个参数setDataInterchainInvoke是合约函数名,后面几个参数都是setDataInterchainInvoke的函数列表,分别对应目标链上的合约名称、合约上的函数名、函数参数、回调函数所在的链上合约、回调函数方法名,然后调用WeCrossHub进行跨链调用:

function setDataInterchainInvoke(
        string memory _path,
        string memory _method,
        string memory _data,
        string memory _callbackPath,
        string memory _callbackMethod
    ) public returns (string memory) {
        string[] memory args = new string[](1);
        args[0] = _data;

        return
            hub.interchainInvoke(
                _path,
                _method,
                args,
                _callbackPath,
                _callbackMethod
            );
    }

4.2 目标链查看跨链调用结果

目标链group2并没有主动调用setData函数,只有来自于源链group1的跨链请求调用了目标链group2上的setData函数,并传递了NewHelloWorld参数,可以查看跨链调用结果:

  • call payment.group2.SetDataInterchain getData

wecross,区块链

说明跨链合约调用成功了!文章来源地址https://www.toymoban.com/news/detail-842422.html

到了这里,关于搭建WeCross跨链平台,并编写跨链智能合约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于区块链Baas平台的跨链实践

    前言 随着区块链技术的落地场景增多,不同区块链孤岛之间的跨链交互需求日趋迫切。例如,不同区块链上的通证(积分/资产)进行互换转移,不同区块链上业务合约的调用协同,不同区块链上业务数据的数据共享等。 本文以开源的异构跨链平台 BitXHub为例,分享跨链技术

    2024年02月10日
    浏览(47)
  • 区块链研究(一):Windows下搭建以太坊私有链,部署智能合约实现数据上链功能(完整跑通版!好累!)

    先说一下,之前学习部署以太坊私有链,看了好多博文,发现节点之前总是无法连接识别,踩了好多坑,,,今天我把自己完整跑通的实验流程给大家展示出来,希望有所帮助! 摘要:本文主要介绍区块链网络构建的方式,区块链网络仅用于实验,主要搭建以太坊私有链,在

    2024年04月08日
    浏览(52)
  • 区块链基础之编写合约二

    1.这里列出一些solidity中的,有哪些。 2.这里列出一些solidity中的类型,有哪些。 3.编写简单的合约 到这就没了,学会了最简单的编写合约了,然后可以根据别人编写的合约进行阅读然后改写,加油吧,各位。

    2024年02月09日
    浏览(42)
  • 区块链基础:编写一个最简单的合约,修改和查询

    案例 1:存储合约         先看代码:       代码的注解:                 //第一行是说明源代码是根据GPL 3.0版本授权的。默认情况下,在发布源代码时加入机器可读许可证说明是很重要的。                // 第二行是告诉编译器源代码所适用的Solidity版本为

    2024年02月09日
    浏览(41)
  • Conflux 树图区块链 “数字藏品" 合约标准和编写规范

    Conflux 树图链欣欣向荣,尤其是“数字藏品”等相关应用,如雨后春笋般涌现。但是随之而来的是良莠不齐的合约质量和标准兼容度。 \\\"数字藏品\\\"是在区块链上发行的具有一定文化背景、艺术价值或者收藏价值的“藏品”,需要和普通的非同质化代币 (NFT)相区分,相关接口需

    2024年01月16日
    浏览(39)
  • 【区块链】以太坊Solidity编写一个简单的Hello World合约

    熟悉一门语言得从Hello World! 开始,因为这是最简单的一个输出形式。 我们先在contracts目录下建立一个helloworld.sol文件 进入编辑 保存退出 在migrations下新建一个部署合约的js文件:3_initial_migration.js 名字可以变动 接下来在test中使用js调用智能合约 在另一个窗口打开ganache 运行智

    2024年02月15日
    浏览(74)
  • 【区块链 | 智能合约】Ethereum源代码 - 智能合约地址生成算法

    当提交智能合约部署后,会返回智能合约的地址。智能合约地址的生成逻辑在eth.api.go的submitTransaction函数中:

    2024年02月13日
    浏览(49)
  • 区块链java开发智能合约nf(部署第一个NFT智能合约)

    手把手教你区块链java开发智能合约nft-第二篇(部署第一个NFT智能合约) 刚搞区块链开发真的是太累了,自己摸石头过河,动不动就报错,网上搜索错误,一律看不出什么问题,或者报错的信息太少,问同事同事不鸟,问领导,领导也烦,无奈,对于英文不好的我,只能被迫

    2024年02月12日
    浏览(57)
  • 2.DApp-编写和运行solidity智能合约

    题记         演示如何编写solidity智能合约,以及在remix中运行solidity代码。 准备Remix环境         在浏览器中搜索remix,找到remix官网,并打开         由于是国内网络,所以访问国外网站较慢,可以耐心等待加载完成,或者科学上网。          加载完成是这样:    编写

    2024年02月03日
    浏览(46)
  • 区块链智能合约代码示例

            以下是一个简单的区块链智能合约代码示例: 该合约具有以下功能: 定义了一个名为 SimpleContract 的合约。 定义了一个名为 myData 的公共整数变量。 定义了一个名为 setMyData 的公共函数,该函数接受一个 uint 类型的参数 newData,并将其设置为 myData 的新值。 在 So

    2024年02月14日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包