单公证人模式实现测试链间跨链【入门教程(下)】

这篇具有很好参考价值的文章主要介绍了单公证人模式实现测试链间跨链【入门教程(下)】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3.5监听区块链部分代码

监听器用的是web3.js 文件,使用VS Code编码

下面代码中存在的abi文件需要自己去复制合约的abi字节码,复制后在vs中建立一个xxx.abi文件,将内容粘贴进去即可,如果是在同个文件夹内使用我这种路径方式即可,实在不行就写绝对路径吧。
单公证人模式实现测试链间跨链【入门教程(下)】
使用subscribe监听事件,并发送交易

var Web3 = require("web3");
const {Transaction: Tx, Transaction} = require("ethereumjs-tx");
var fs = require('fs');// fs模块读取.sol合约文件

var  privateKey = Buffer.from("2bc4b12344dcd517c48f7eba2e5b5d0c206c6a124d7fd938f392a881785a4021",'hex');// 私钥
var  fromAddress = "0x6123493654b3E23D9007e56EE7131b6dd305dfDd"; //账户地址

//---------------------------------------
//-------Ropsten测试网配置----------------
var ropsten_wssurl = "wss://ropsten.infura.io/ws/v3/99b7804fba9a484f8afd1fac5bc75cdf"; 
// 如果报错Error: Transaction has been reverted by the EVM 可能是vpn出问题了,检查网络
// chainid=3  如果报错Error: connection not open on send()  换个infura节点即可

var ropsten_web3 = new Web3(new Web3.providers.WebsocketProvider(ropsten_wssurl));
var ropsten_ABI = JSON.parse(fs.readFileSync("ropsten_bridge.abi").toString());
var ropsten_contract_address = '0x173EB118FA344f9D1E2f9b3cB94F4E650D6637B5';//ropsten的跨链桥地址***
//               NATIVE_RETH = 0x4a03c24614a251a1b75c4ccCC5b3bE7b542f716f
//                ERC20_BETH = 0x0392Ae4b926ABf4abDDE26e9E02103d9ac4E6275
var ropsten_contract = new ropsten_web3.eth.Contract(ropsten_ABI,ropsten_contract_address);

//---------------------------------------
//-------Rinkeby测试网配置----------------
var rinkeby_wssurl = "wss://rinkeby.infura.io/ws/v3/99b7804fba9a484f8afd1fac5bc75cdf"; 
var rinkeby_web3 = new Web3(new Web3.providers.WebsocketProvider(rinkeby_wssurl));
var rinkeby_ABI = JSON.parse(fs.readFileSync("rinkeby_bridge.abi").toString());
var rinkeby_contract_address = '0x729eC6Df5470099AADfa1ebD770722b45393cC7A';//rinkeby的跨链桥地址***
//               NATIVE_BETH = 0x988b22b8502eC4443dC2a0D5DbbbdB85aBcE3b47
//                ERC20_RETH = 0x94F8fF14EE6D4fbB90750fF4E6630080Cbc29b5d
var rinkeby_contract = new rinkeby_web3.eth.Contract(rinkeby_ABI,rinkeby_contract_address); 


console.log('ropsten_bridge subscription start');
ropsten_web3.eth.subscribe('logs', {
    address: ropsten_contract_address,
    topics:['0x4db14528ca520835e36decc6d6140e6cefbd849bedda8745497406a62317c80d'] //********这里记得换成监听事件的十六进制
  }, function(error, result){
      if (!error)
        console.log('this is ropsten_subcription');
        info=ropsten_web3.eth.abi.decodeLog([
            { // 解析日志内容
                type: 'address',
                name: 'token'
            },{
                type:'string',
                name:'symbol'
            },{
                type:'uint',
                name:'fromChainID'
            },{
                type:'address',
                name:'from'
            },{
                type:'uint',
                name:'toChainID'
            },{
                type:'address',
                name:'toAddress'
            },{
               type:'uint',
               name:'amount'
            }
        ],result.data,result.topics);
        { // 获取log的信息
            SYMBOL = info[1];
            TO_CHAINID = info[4];
            TO = info[5];
            VALUE = info[6];
        }
        if(TO_CHAINID == 4){//跨到rinkeby,使用rinkeby_web3往rinkeby发交易
            var DATA=rinkeby_contract.methods.receipt(SYMBOL,TO,VALUE).encodeABI(); 
            rinkeby_web3.eth.getTransactionCount(fromAddress, rinkeby_web3.eth.defaultBlock.pending).then(function(nonce){
                var rawTx={
                    nonce: rinkeby_web3.utils.toHex(nonce++),
                    gasLimit: rinkeby_web3.utils.toHex(99000),
                    gasPrice: rinkeby_web3.utils.toHex(10e9), // 10 Gwei
                    to: rinkeby_contract_address,//目标合约地址
                    from: fromAddress, //privateChain_
                    data: DATA // thanks @abel30567
                }
                var tx=new Tx(rawTx,{chain:'rinkeby'});// 如果说invalid account ,在tx后面加连的名称 
                tx.sign(privateKey);
                var serializedTx = tx.serialize();
                console.log('will send transaction');
                rinkeby_web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
                .on('receipt', console.log);
                console.log('had been sent transaction');
            })   
        }
    }
)

console.log('rinkeby_bridge subscription start');
rinkeby_web3.eth.subscribe('logs', {
    address: rinkeby_contract_address,//监听rinkeby链上的合约地址的事件
    topics:['0x4db14528ca520835e36decc6d6140e6cefbd849bedda8745497406a62317c80d'] //********这里记得换
  }, function(error, result){
      if (!error)
        console.log('this is rinkeby_subcription');
        info=rinkeby_web3.eth.abi.decodeLog([
            { // 解析日志内容
                type: 'address',
                name: 'token'
            },{
                type:'string',
                name:'symbol'
            },{
                type:'uint',
                name:'fromChainID'
            },{
                type:'address',
                name:'from'
            },{
                type:'uint',
                name:'toChainID'
            },{
                type:'address',
                name:'toAddress'
            },{
               type:'uint',
               name:'amount'
            }
        ],result.data,result.topics);
        { // 获取log的信息
            SYMBOL = info[1];
            TO_CHAINID = info[4];
            TO = info[5];
            VALUE = info[6];
        }
        if(TO_CHAINID == 3){//跨到ropsten,使用ropsten_web3往ropsten发交易
            var DATA=ropsten_contract.methods.receipt(SYMBOL,TO,VALUE).encodeABI(); 
            ropsten_web3.eth.getTransactionCount(fromAddress, ropsten_web3.eth.defaultBlock.pending).then(function(nonce){
                var rawTx={
                    nonce: ropsten_web3.utils.toHex(nonce++),
                    gasLimit: ropsten_web3.utils.toHex(99000),
                    gasPrice: ropsten_web3.utils.toHex(10e9), // 10 Gwei
                    to: ropsten_contract_address,//目标合约地址
                    from: fromAddress, //privateChain_
                    data: DATA // thanks @abel30567
                }
                var tx=new Tx(rawTx,{chain:'ropsten'});// 如果说invalid account ,在tx后面加连的名称 
                tx.sign(privateKey);
                var serializedTx = tx.serialize();
                console.log('will send transaction');
                ropsten_web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
                .on('receipt', console.log);
                console.log('had been sent transaction');
            })   
        }
    }
)

3.6 智能合约、监听 初始化 设置

3.6.1 钱包与编译器连接

使用小狐狸钱包,点开左上角连接按钮,将钱包与Remix编译器进行连接。并选择实验所需连接的区块链。接下来会在两个区块链间反复切换,我会在图片中表明当前环境所处区块链。
单公证人模式实现测试链间跨链【入门教程(下)】
单公证人模式实现测试链间跨链【入门教程(下)】

接着点击Remix编译器左侧,选择injected web3,连接我们的环境。
单公证人模式实现测试链间跨链【入门教程(下)】
单公证人模式实现测试链间跨链【入门教程(下)】

可以发现已经连上了我们的区块链并且使用我们的区块链账户。
我们做的系统是跨链交易所,此处假设为两条链之间进行跨链资产转移,那么A链的原生代币跨链到B链时就变成了B链的ERC20代币,因此我们这个过程中每条链需要用到三个合约——原生代币管理合约、ERC20合约(可通用化)、跨链桥合约。

3.6.2 在Ropsten上部署并初始化合约

(1)部署并初始化跨链桥合约
选择部署合约的账户(user2),部署合约时输入该链对应的原生代币。此链为Ropsten,因此原生代币为RETH。
单公证人模式实现测试链间跨链【入门教程(下)】

成功部署后可以获得该合约的地址,右侧可以复制合约地址

单公证人模式实现测试链间跨链【入门教程(下)】

(2)部署并初始化原生代币合约(为了区分父子合约地址,部署代币合约使用的地址为uesr3)
为合约初始化,输入父合约的地址——跨链桥地址
单公证人模式实现测试链间跨链【入门教程(下)】

(3)部署并初始化ERC20合约(此处仍使用uesr3账号部署合约)
输入初始化总代币数量(此处用于测试存取款功能),输入父合约地址——跨链桥地址,点击transact部署合约
单公证人模式实现测试链间跨链【入门教程(下)】

(4)往跨链合约添加代币合约地址
在代币合约部署前我们无法知晓代币合约地址,因此我们需要在代币合约部署完成后将地址写入到跨链合约中。
我们部署原生代币RETH的合约:输入原生代币名称——RETH,再把刚刚部署完成的合约地址复制粘贴过来,点击transact提交交易。
同样的,部署BETH代币(BETH为Rinkeby链的原生代币,跨链的话则在Ropsten链上创造一种与之等价的ERC20代币,此处也称之为BERH)的操作也是如此。

注意:此操作并非任何人都可以随意操作,因此合约中设置为只有合约创建者才可调用此函数,此合约创建者为user2,故需要点击小狐狸钱包将账户切换至user2。
单公证人模式实现测试链间跨链【入门教程(下)】
单公证人模式实现测试链间跨链【入门教程(下)】

调用跨链合约中的ERC20_CIBTRACT函数查看是否添加合约地址成功。

单公证人模式实现测试链间跨链【入门教程(下)】
单公证人模式实现测试链间跨链【入门教程(下)】

3.6.3 在Rinkeby上部署并初始化合约

Rinkeby上的合约与Ropsten属于镜像合约,只需要修改几个参数即可***(
①修改跨链桥合约的fromchainID,NAVITVE_CHAINID为本链id;
②将ERC20合约中的name,symbol,decimal更改为对应的ERC20代币即可,此合约修改这几个参数即可 实现通用化;
③将原生代币合约(NAVIVE_ETH.sol)的代币属性修改成改链的原生代币)***。

注意:部署时切换到Rinkeby链,其余部署方式参考Ropsten部署与初始化(1)~(4)。

单公证人模式实现测试链间跨链【入门教程(下)】

3.6.4 监听器初始化设置

设置自己的私钥、发送交易账户地址(私钥与账户地址必须对应):
单公证人模式实现测试链间跨链【入门教程(下)】

连接到区块链,输入要连接区块链的RPC_URL:
单公证人模式实现测试链间跨链【入门教程(下)】
(如果无法连接上,可能节点有问题,可以取infura官网创个账户,他会分配一个节点给你,将那个节点地址粘贴过来即可)

合约实例化:
a)导入合约abi字节码。点击remix编译器左侧箭头处即可复制当前合约的字节码。在在VS编译器(用于编写监听程序)中创建Ropsten_bridge.abi文件,将abi码粘贴过去即完成导入。
单公证人模式实现测试链间跨链【入门教程(下)】

b)输入要监听的合约地址:
单公证人模式实现测试链间跨链【入门教程(下)】
单公证人模式实现测试链间跨链【入门教程(下)】

c)输入要监听的事件的十六进制编号:
单公证人模式实现测试链间跨链【入门教程(下)】
单公证人模式实现测试链间跨链【入门教程(下)】

只要写了event事件,topics可以在remix抛出的logs中找到,如:

单公证人模式实现测试链间跨链【入门教程(下)】

4 跨链实验

合约中的其他功能读者可以自行测试,由于篇幅有限,此处仅示例跨链过程

4.1 Ropsten跨原生代币RETH至Rinkeby

已知跨链交易是在A链锁住代币,在B链释放对应的代币。

(1)在跨链开始前,先启动链下监听器
单公证人模式实现测试链间跨链【入门教程(下)】

(2)首先从Ropsten链将原生代币RETH跨链到Rinkeby中——user3输入跨链币种RETH,目标链4(Rinkeby),目标地址(user3在Rinkeby中的地址),最后输入要跨链金额(右图即0.01eth)
单公证人模式实现测试链间跨链【入门教程(下)】
单公证人模式实现测试链间跨链【入门教程(下)】

(3)在跨链前先查看user3在Ropsten上余额——0.1681RETH
单公证人模式实现测试链间跨链【入门教程(下)】

Rinkeby网络中的RETH余额——10^19Wei(10RETH)
右边钱包可知当前处于rinkeby网络
单公证人模式实现测试链间跨链【入门教程(下)】

(4)记录完跨链前数据,开始跨链:
单公证人模式实现测试链间跨链【入门教程(下)】

(5)跨链成功后,监视器返回发送交易成功的信息
单公证人模式实现测试链间跨链【入门教程(下)】

(6)检查Ropsten链上是否减少了对应的原生代币(少的0.0002RETH用于gas消耗)

单公证人模式实现测试链间跨链【入门教程(下)】

(7)检查目标链上是否增加了等量的ERC20_Ropsten代币(将网络切换到Rinkeby)

单公证人模式实现测试链间跨链【入门教程(下)】

4.2 Rinkeby跨ERC20代币RETH至Ropsten

(1)在Ropsten中,RETH是原生代币,但在Rinkeby中BETH才是原生代币,因此在Rinkeby中RETH为ERC20代币,即RopstenETH在Rinkeby中的等价替代品。由于是ERC20代币,在交易所中进行转账时需要先给交易所提供代理金额
单公证人模式实现测试链间跨链【入门教程(下)】

(2)使用Rinkeby链中的跨链桥中的general_cross_transfer函数进行ERC20资产跨链
单公证人模式实现测试链间跨链【入门教程(下)】

(3)跨链前检查Ropsten中RETH余额
单公证人模式实现测试链间跨链【入门教程(下)】

(4)开始跨链
单公证人模式实现测试链间跨链【入门教程(下)】

(5)跨链成功后,监视器返回发送交易成功的信息

单公证人模式实现测试链间跨链【入门教程(下)】

(6)检查ropsten链是否增加了对应的RETH
单公证人模式实现测试链间跨链【入门教程(下)】文章来源地址https://www.toymoban.com/news/detail-447411.html

到了这里,关于单公证人模式实现测试链间跨链【入门教程(下)】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • zkRouter如何实现安全跨链

    多链生态的蓬勃发展,使得跨链协议变得不可或缺。但是由于跨链桥抵押了大量资产,再加上跨链协议逻辑较一般的 Swap 更为复杂,因此跨链协议遭到黑客攻击的可能性也就越来越高。截止 2022 年底,因跨链桥安全问题导致的损失就达到 20 亿美金以上,其中损失上亿美元的的

    2024年02月05日
    浏览(48)
  • 技术干货|通过 Substrate - IBC 实现 Substrate 资产跨链

    全长 2760 字,预计阅读 10 分钟 作者:DaviRain 撰文:MiX 微信交流:MixMetaverse 章鱼网络 DaviRain 受邀参加 RUST.CC 中国大会,分享主题为《通过 Substrate - IBC 实现 Substrate 资产跨链》的 Workshop。主要讨论了 IBC 跨链通信协议,以及 Substrate-IBC 在 Substrate 上实现的 IBC 协议,最后通过实

    2024年01月19日
    浏览(53)
  • Darwinia与Moonriver和Moonbeam完成XCM集成,实现跨链交互功能

    跨链互连应用的最佳去中心化开发平台Moonbeam宣布与Darwinia完成XCM集成。在启用通过XCM的远程EVM调用后,允许Moonbeam上的互连合约通过Darwinia的通用跨链消息网络进行通信。另外,当Darwinia基于轻客戶端的跨链消息传递协议和XCM合并后,这将让Moonbeam上的任何合约连接至任何波卡

    2024年01月21日
    浏览(43)
  • electron mac打包、签名、公证、上传

    一、首先是打包,mac的打包选项有dmg、mas、zip等, dmg分为x64、arm64,分别对应intel芯片和apple m1 m2芯片 配置打包项:Mac=target=dmg[arm64,x64] 这样打包之后,用户下载dmg文件后安装打开,mac会提示该程序不受信任;好多地方说dmg是不需要签名的,但是我觉得dmg下的.app文件照样还是

    2024年02月05日
    浏览(44)
  • electron-Mac最新签名公证 notarytool

        “凭证名称”,可随意命名,后续需要使用到 (注意需用英文引号包裹凭证名称)     --apple-id:你注册的Apple开发者帐号 (注意--符号,不要漏了)     --team-id: teamId的值,申请aplicationip的地方可以看(注意--符号,不要漏了)     --password:二次凭证,在AppleId中设置

    2024年04月24日
    浏览(37)
  • electron使用electron-builder进行MacOS的 打包、签名、公证、上架、自动更新

    由于electron在macOS下的坑太多,本文不可能把所有的问题都列出来,也不可能把所有的解决方案贴出来;本文也不太会讲解每一个配置点为什么要这么设置的原因,因为有些点我也说不清,我尽可能会说明的。所以,你要抛弃你之前所有已经完成的东西,最好弄一个全新的系统

    2024年02月03日
    浏览(40)
  • IGH主站通信测试csp模式(DC同步 preemrt)连通一从站并实现控制

    linuxcnc配置基础机器人控制LinuxCNC与EtherCAT介绍PDOSDO,搭建环境步骤 需要配置IGH主站的查看这篇文章 linux系统学习笔记7——一次性安装igh-ethercat主站 CSP模式 DC同步方式 preemrt实时补丁 直接上代码,这部分是直接控制使用csp模式控制一个从站运动 使能后直接运动,10s,每秒60

    2024年01月16日
    浏览(51)
  • 搭建WeCross跨链平台,并编写跨链智能合约

    WeCross是由微众银行自主研发并完全开源的区块链跨链协作平台,支持应用与多链互操作、同/异构链间互操作等多维跨链交互。——来自《WeCross技术文档》 本教程基于wecross-demo,以实现多群组跨链为例: 跨链示例:以group1作为源链、group2作为目标链,group2上部署了智能合约

    2024年03月22日
    浏览(31)
  • 跨链桥真的不能碰?一文详解跨链桥的分类以及过去、现在与未来

    本文将介绍跨链桥是什么并将跨链桥进行分类与比较,搭配一些著名跨链桥攻击事件进行分析。 跨链桥是一个在不同链之间负责传递“讯息”的桥,至于是什么样的讯息,接下来会介绍。跨链桥的例子包含Multichain、Celer、XY、Nomad、Rainbow Bridge、Hop等等。 链是不知道彼此的存

    2024年02月03日
    浏览(43)
  • 区块链跨链技术

    近年来,随着区块链技术的不断发展,区块链的应用场景逐渐从最初的加密货币领域扩展到金融、物流、医疗、公共服务等各个领域。随着区块链的应用场景不断增多,区块链的“数据孤岛”问题日益突出,不同场景下的区块链之间相互隔绝,无法实现信息交互,极大地阻碍

    2024年02月06日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包