如何使用TruffleL2Box桥接区块链网络这些问题具有广泛的影响,从交易时间变慢到交易费用增加,以及用户体验下降。一种解决方案是使用L2(第二层)区块链使Web3多链。以太坊L2(例如Optimism、Arbitrum和Polygon)建立在以太坊网络之上,但比以太坊更快、更便宜。然而,作为权衡,它们通常不如以太坊安全。这就是为什么L2处理日常用户活动,同时仍然依赖以太坊L1作为安全、去中心化结算和数据可用性层的幕后基础。这是一个很好的解决方案,仅在以太坊上就有很多L2,每个L2都是一个独立的网络,具有自己的细微差别和经验。构建和使用在这些网络和以太坊L1之间互操作和移动的dApp可能既乏味又困难,并且对用户和开发人员来说体验不佳。现在需要的是Web3成为一种多链体验,消费者不需要知道他们正在使用哪个区块链(坦率地说不关心),开发人员可以依赖最能支持他们的dApp需求的网络.通过转向区块链的多链互联网,Web3为所有相关人员提供了更好的体验。不幸的是,允许dApp在区块链之间移动是一项艰巨的技术挑战。本文研究了一个解决方案——使用InfuraRPC端点和TruffleBoxes构建——并无缝桥接这些网络。具体来说,将使用OptimismBridge的TruffleBox在以太坊Goerli测试网上创建一个项目,并连接到OptimismGoerli。使用Infura和TruffleBoxes运行多链dApp作为示例解决方案的核心,TruffleBox将依赖于来自ConsenSys的“零食”样板(例如合同、库、模块,甚至是功能齐全的dApp),企业可以使用这些样板来构建自己的dApp。对于多链解决方案,它们构建在许多L2网络的InfuraRPC节点之上。如上所述,特别依赖OptimismBridge的TruffleBox。TruffleBox包含L1和L2与OptimismBridge交互所需的所有合约,以及用于部署、调用函数和层间传递消息/值的一组迁移。它甚至有一个帮助脚本,可以完成您需要它做的一切。只需打开TruffleBox即可获得所需的一切!TruffleBox包括:通过OptimismBridge发送消息的L1合约。将发送消息从以太坊迁移到OptimismBridge。通过OptimismBridge发送消息的L2合约。将发送消息从OptimismBridge迁移到以太坊。自动编译合约、运行迁移和发送消息的脚本。通过OptimismBridge自动发送ETH和DAO的脚本。注:桥(Bridge)是一个允许独立的区块链相互通信并发送令牌、NFT等的工具。先决条件在开始之前,需要以下先决条件:Node.js及其包管理器,NPM。使用以下终端命令验证是否安装了Node.js:node-v&&npm-vInfuraaccountMetaMaskaccount基本了解JavaScript和Solidity步骤1:创建用于Web访问的Infura帐户完成先决条件后,登录Infura网站(或注册新帐户)。注册成功后,页面重定向到Infura仪表板,可以在其中创建新的API密钥,如下图所示:单击“创建新密钥”按钮并填写所需信息。创建API密钥后,项目ID将显示在仪表板的API密钥部分下,如下所示。复制它并将其保存在某个地方,您将在本教程的后面部分需要它。第2步:设置和安装接下来,将设置TruffleOptimismBridgeBox。可以使用以下命令在选择的任何目录中运行unbox命令。npxtruffleunboxoptimism-bridge将替换为您选择的目录名称。或者,可以全局安装Truffle并运行unbox命令。npminstall-gtruffletruffleunboxoptimism-bridge此命令应下载并运行npminstall作为拆箱过程的一部分。现在,运行以下命令将目录更改为刚刚创建的新目录。cdtruffle-bridge-demo注意:truffle-bridge-demo是创建的目录名。您应该会得到类似于下图所示的结果。.dotenvnpm包已安装,但需要将一些信息添加到开箱即用创建的.env文件中。truulu-config.ovm.js文件期望.env文件中的GOERLI_MNEMONIC值用于在EthereumGoerli和OptimismGoerli测试网上运行命令,并期望INFURA_KEY连接到网络。GOERLI_MNEMONIC=""INFURA_KEY=""将替换为您之前从Infura仪表板获得的信息。【注意:切勿与任何人分享私钥(助记词),并妥善保管】。将替换为您的助记词,如下所示:要从Metamask检索您的助记词,请单击Metamask上显示的图标。接下来,点击导出私钥按钮复制助记词。Git忽略此项目中的.env文件以帮助保护私有数据。避免向GitHub泄露私钥是一种良好的安全做法。第3步:使用TruffleL2Boxes进行桥接在对项目进行拆箱时,创建了项目所需的所有合约和脚本。在下一步中,我们将详细介绍各个契约和迁移,以了解网络之间如何进行桥接和交互。合约contract/ethereum/GreeterL1.sol显示了如何通过Optimismbridge从L1向L2发送消息。//SPDX-License-Identifier:Unlicense//这个合约在L1上运行,在L2上控制一个Greeter.pragmasolidity^0.8.0;import{ICrossDomainMessenger}from"@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";contractGreeterL1{地址crossDomainMessengerAddr=0x5086d1eEF304eb5284A0f6720f79403b4e9bE294;地址greeterL2Addr=0xC0836cCc8FBa87637e782Dde6e6572aD624fb984;functionsetGreeting(stringcalldata_greeting)public{bytesmemorymessage;message=abi.encodeWithSignature("setGreeting(string)",_greeting);ICrossDomainMessenger(crossDomainMessengerAddr).sendMessage(greeterL2Addr,message,1000000//在免费gas数量之内);}//functionsetGreeting}//contractGreeterL1迁移migrations/3_set_L2_greeting.js使用上面的结合从以太坊发送消息给optimistic。varGreeter=artifacts.require("GreeterL1");/***设置L2问候语*在L1上运行此迁移以更新L1问候语。*/module.exports=asyncfunction(deployer){console.log("从L1更新L2Greetings合约!");constinstance=awaitGreeter.deployed();consttx=awaitinstance.setGreeting("来自Truffle的问候!");console.log(`Greetertxn在L1上确认!${tx.receipt.transactionHash}`);console.log(`桥接消息到L2Greeter合约...`);console.log(`大约1分钟后,查看Greeter合约“读取”功能:https://goerli-optimism.etherscan.io/address/0xC0836cCc8FBa87637e782Dde6e6572aD624fb984#readContract`);};接下来,contracts/optimism/GreeterL2.sol合约通过Optimismbridge向另一个方向(L2->L1)发送消息。/SPDX-License-Identifier:Unlicense//这个合约在L2上运行,在L1上控制一个Greeter.pragmasolidity^0.8.0;import{ICrossDomainMessenger}from"@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";contractGreeterL2{地址crossDomainMessengerAddr=0x4200000000000000000000000000000000000007;地址greeterL1Addr=0x7fA4D972bB15B71358da2D937E4A830A9084cf2e;functionsetGreeting(stringcalldata_greeting)public{bytesmemorymessage;message=abi.encodeWithSignature("setGreeting(string)",_greeting);ICrossDomainMessenger(crossDomainMessengerAddr).sendMessage(greeterL1Addr,message,1000000//此处无关紧要);}//functionsetGreeting}//contractGreeterL2迁移migrations/4_set_L1_greeting.js使用上记合约将消息从Optimism发送到以太坊。require("dotenv").config();constsdk=require("@eth-optimism/sdk");constethers=require("ethers");constGreeter=artifacts.require("GreeterL2");constgoerliMnemonic=process.env["GOERLI_MNEMONIC"];constinfuraKey=process.env["INFURA_KEY"];constsleep=(milliseconds)=>{returnnewPromise((resolve)=>setTimeout(resolve,milliseconds));};/***设置L1问候语*在L1上运行此迁移以更新L1问候语。*/module.exports=asyncfunction(deployer){constnewGreeting="来自Truffle的问候!";//<----将此值更改为您的名字!!!constinstance=awaitGreeter.deployed();console.log("正在从L2更新L1Greetings合约!");consttx=awaitinstance.setGreeting(newGreeting);consttxHash=tx.receipt.transactionHash;console.log(`Greetertxn在L2上确认!${txHash}`);console.log(`将消息桥接到L1Greeter合约。\n这至少需要1-5分钟...`);//为Optimis设置提供者msdkconstl1Provider=newethers.providers.JsonRpcProvider("https://goerli.infura.io/v3/"+infuraKey);constl2Provider=newethers.providers.JsonRpcProvider("https://optimism-goerli.infura.io/v3/"+infuraKey);//连接一个L1签名者constwallet=ethers.Wallet.fromMnemonic(goerliMnemonic);constl1Signer=wallet.connect(l1Provider);//初始化sdkmessengerconstcrossChainMessenger=newsdk.CrossChainMessenger({l1ChainId:5,l2ChainId:420,l1SignerOrProvider:l1Signer,l2SignerOrProvider:l2Provider,});让statusReady=false;//在L2->L1桥接期间休眠1分钟awaitsleep(60000);//60秒//轮询L1消息状态while(!statusReady){letstatus=null;status=awaitcrossChainMessenger.getMessageStatus(txHash);statusReady=status==sdk.MessageStatus.READY_FOR_RELAY;if(!statusReady){console.log("消息尚未在L1上收到。\n重试我n10seconds...");awaitsleep(10000);//10seconds}}console.log("Messagereceived!Finalizing...");//在L1上打开消息finalize=awaitcrossChainMessenger.finalizeMessage(txHash);console.log(`Messagefinalized.查看L1Greetercontract"read"函数:https://goerli.etherscan.io/address/0x7fA4D972bB15B71358da2D937E4A830A9084cf2e#readContract`);};在脚本目录下,还有messli_bridge_mjs和goerli_bridge_value.js来自动化编译合约、运行迁移和发送消息的过程第四步:完成合约编译、迁移以及以太坊歌尔里和Optimism歌尔里的桥接接下来,将合约部署到歌尔里,帮助脚本方便Ethereum在Goerli和OptimismGoerli之间编译、迁移和桥接消息。在这些网络上,需要testnetETH才能使用它。Optimism插件也需要添加到Infura账户。接下来,将运行以下命令启动项目.npmrun下面的deploy是一个URL,用于在迁移完成后确认(通过Etherscan)桥接消息。第四次迁移完成后,将提供通过Etherscan确认桥接消息的链接。第五步:使用区块浏览器在Goerli中测试在线验证项目是否成功之前打开的项目已经成功设置、安装、构建和部署。接下来,该项目将在歌尔力以太坊测试网上进行验证。进入GoerliEtherscan区块浏览器,粘贴txn地址0xbcc1746a9ebbfcfb71665225c1a353a8c8dc9a1aa528a3babcb5b046d615a353,该地址在部署时会显示在CLI上。https://goerli-optimism.etherscan.io/tx/0xbcc1746a9ebbfcfb71665225c1a353a8c8dc9a1aa528a3babcb5b046d615a353结论如果要继续改善用户和开发人员的体验,多链Web3世界必不可少。为此,dApp需要在区块链之间快速无缝地通信。希望使用OptimismBridgeTruffleBox的示例将提供一种相对简单快捷的入门方法。要了解更多信息,您可以查看官方文档。原标题:UsingTruffleL2BoxestoBridgeBlockchainNetworks,作者:JohnVester