当前位置: 首页 > 后端技术 > Node.js

NODEJS如何发送以太坊交易

时间:2023-04-03 21:13:55 Node.js

"注意:在本教程中我使用web3js版本1.0"大家好,我将解释如何从NodeJS后端发送交易。我将使用rinkeby测试网并创建一个路由器,同时添加一些节点模块并使用infurahttp接口来完成本教程。我们需要web3js、express和ethereumjs-tx模块来执行交易。之后你需要从Infura输入你自己的apikey来登录infura。首先,您需要为此项目创建一个空文件夹,以便更轻松地访问它。创建文件夹后,您需要在该文件夹中打开命令外壳。我假设你的电脑上安装了npm。npm由nodejs分发,所以如果你安装了nodejs,你也会得到npm。如果您没有从该站点下载包含npm的nodejs。你需要在安装npm后调用它。npminit如果要保留默认设置(包括默认名称,即文件夹名称),可以通过键入回车键跳过所有行。在此过程结束时,您将拥有一个package.json文件。启动项目后,在文件夹中你需要用你想要的名字创建一个js文件,这将是我们的后端。获取模块在我的代码中,你可以看到有模块需求,我们只是通过npm下载将它们包含到项目中。他们的npm调用:npminstallweb3--savenpminstallexpress--savenpminstallethereumjs-tx--save你需要从命令行单独调用这一行来将它们安装到你的项目中。完成安装过程后,可以看到有一个名为node-modules的文件夹,就是下载模块的文件夹。INFURA完成模块下载后。您需要一个infuraapi密钥。Api密钥是完成本教程的关键部分。您可以通过登录Infura获取它。获得infuraapi密钥后,您需要使用您的api密钥更改第7行(YOUR_API_KEY)。顺便说一句,infura是非常好的界面。您还可以通过infuraapi访问区块链存储服务ipfs。有关ipfs的更多信息可以从他们的网站获得。通过获取infuraapikey,我们完成了代码的预请求。我们可以开始编码了。从现在开始,我将逐行解释代码。在前3行中,我将模块添加到js文件中。web3是将与以太坊接口的模块。创建路由器需要Express。创建交易需要ethereumjs-tx。在第5行,我使用Express模块创建我的应用程序。创建应用程序后,我们需要写入文件的最后一行:app.listen(3000,()=>console.log('Exampleapplisteningonport3000!'))在第8行,我创建了web3js对象使用httpprovider,这是nodejs后端的infura。如果你在看本教程之前搜索过ethereumbackenddevelopment,你可以看到很多都是用reactjs编码的,他们使用metamask作为接口服务。NodeJS后端无法访问浏览器资源,所以NodeJS后端无法使用metamask作为服务接口程序,我处理使用infura作为接口服务提供者。在web3的一些功能中,需要web3的websocketprovider,所以在使用的时候需要改一下第8行。web3js=newweb3(newweb3.providers.WebsocketProvider('wss://mainnet.infura.io/_ws'));在第10行,我创建了我的路由器,它是一个get,但它需要在逻辑中发布我创建这个教程只是为了展示发送事务是如何完成的,所以这是无关紧要的。在路由器内部,我需要我的rinkeby以太坊地址(myAddress),我将发送我的交易地址(toAddress)、合同地址(contractAddress)和合同abi(contractABI)。您可以通过以太坊钱包或etherscan搜索合约abi。我从以太坊钱包部署这个教程合约,你不需要部署任何合约。您可以简单地使用现有的。我们最不需要的是我的私钥(privateKey)。这不是一种安全的方式,但由于我们的前端没有任何钱包(因为我们没有前端:)),我们此时手动进行。您无法通过以太坊钱包访问您的私钥,因此您需要将您的rinkeby以太坊帐户导入MyEtherWallet等网站。在定义变量后的路由器中,我们创建原始交易,然后用我们的私钥对其进行签名。签署交易后,我们通过web3js将其发送到rinkeby测试网。编码后,我们需要对其进行测试。在同一文件夹中打开命令外壳并启动后端。我的文件名为backend.js,所以我通过代码启动它。nodebackend.js表示可以启动后端,代码:node启动后端后,需要打开浏览器,地址写入http://localhost:3000/sendtx线。这就对了。我们为以太坊创建了我们的微型后端。代码如下:constweb3=require('web3');constexpress=require('express');constTx=require('ethereumjs-tx');constapp=express();//InfuraHttpProviderEndpointweb3js=newweb3(newweb3.providers.HttpProvider("https://rinkeby.infura.io/YOUR_API_KEY"));app.get('/sendtx',function(req,res){varmyAddress='ADDRESS_THAT_SENDS_TRANSACTION';varprivateKey=Buffer.from('YOUR_PRIVATE_KEY','hex')vartoAddress='ADRESS_TO_SEND_TRANSACTION';//contractabi是你可以从以太坊钱包或etherscan中获取的数组varcontractABI=YOUR_CONTRACT_ABI;varcontractAddress="YOUR_CONTRACT_ADDRESS";//创建合约对象varcontract=newweb3js.eth.Contract(contractABI,contractAddress);varcount;//获取交易计数,稍后将用作随机数web3js.eth.getTransactionCount(myAddress).then(function(v){console.日志(“计数:”+v);计数=v;varamount=web3js.utils.toHex(1e16);//创建原始交易varrawTransaction={"from":myAddress,"gasPrice":web3js.utils.toHex(20*1e9),"gasLimit":web3js.utils.toHex(210000),"to":contractAddress,"value":"0x0","data":contract.methods.transfer(toAddress,amount).encodeABI(),"nonce":web3js.utils.toHex(count)}console.log(rawTransaction);//通过ethereumjs-tx创建交易vartransaction=newTx(rawTransaction);//使用私钥签署交易transaction.sign(privateKey);//通过web3js模块发送交易web3js.eth.sendSignedTransaction('0x'+transaction.serialize().toString('hex')).on('transactionHash',console.log);contract.methods.balanceOf(myAddress).call().then(function(balance){console.log(balance)});})});app.listen(3000,()=>console.log('Exampleapplisteningport3000!'))如果想快速开发以太坊,请看我们精心打造的教程:以太坊开发进阶,主要介绍node.js、mongodb、blockchain、ipfs的使用去中心化电商DApp实战实战,适合高级汇智原创翻译,转载请注明出处。这里是原文