当前位置:   article > 正文

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

wecross

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

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

跨链示例:以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: 

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

 输入login,进入管理员控制台:

 2. 编写跨链合约

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

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

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

如下所示:

  1. pragma solidity ^0.5.0;
  2. pragma experimental ABIEncoderV2;
  3. import "./WeCrossHub.sol";
  4. contract SetDataInterchain {
  5. // 声明WeCrossHub
  6. WeCrossHub hub;
  7. function init(address _hub) public {
  8. hub = WeCrossHub(_hub);
  9. }
  10. // 全局变量data
  11. string data;
  12. constructor() public {}
  13. function setData(string memory _data) public {
  14. data = _data;
  15. }
  16. function getData() public returns (string memory) {
  17. return data;
  18. }
  19. // 1.源链中发起跨链交易的函数
  20. function setDataInterchainInvoke(
  21. string memory _path,
  22. string memory _method,
  23. string memory _data,
  24. string memory _callbackPath,
  25. string memory _callbackMethod
  26. ) public returns (string memory) {
  27. // 将待跨链传递的参数data存储在args中
  28. string[] memory args = new string[](1);
  29. args[0] = _data;
  30. return
  31. hub.interchainInvoke(
  32. _path,
  33. _method,
  34. args,
  35. _callbackPath,
  36. _callbackMethod
  37. ); // WeCrossHub将args进行跨链传递
  38. }
  39. // 2.目标链中处理跨链交易的函数
  40. function setDataFromInterchain(string[] memory args)
  41. public
  42. returns (string[] memory)
  43. {
  44. // 目标链收到args,然后执行setData
  45. setData(args[0]);
  46. return args;
  47. }
  48. // 3.源链中接收跨链交易执行结果的回调函数
  49. function setDataInterchainCallback(bool state, string[] memory _result)
  50. public
  51. returns (string[] memory)
  52. {
  53. // 源链根据回调的结果_result,可选的进行后续操作
  54. if (state) {}
  55. return _result;
  56. }
  57. }

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

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

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

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

3.3 部署WeCrossHub

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

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

保存WeCrossHub的地址:0x3a5b4196646c1b7ec6cba22258986f4097903196

 3.4 跨链资源绑定到WeCrossHub

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

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

实现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

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

4. 跨链合约调用

 4.1 源链发起跨链调用

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

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

  1. function setDataInterchainInvoke(
  2. string memory _path,
  3. string memory _method,
  4. string memory _data,
  5. string memory _callbackPath,
  6. string memory _callbackMethod
  7. ) public returns (string memory) {
  8. string[] memory args = new string[](1);
  9. args[0] = _data;
  10. return
  11. hub.interchainInvoke(
  12. _path,
  13. _method,
  14. args,
  15. _callbackPath,
  16. _callbackMethod
  17. );
  18. }

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

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

  • call payment.group2.SetDataInterchain getData

说明跨链合约调用成功了!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/724708
推荐阅读
相关标签
  

闽ICP备14008679号