内容简介:“ 注意:在本教程中我使用web3js 1.0版本 ”大家好,我将解释如何从NodeJS后端发送交易。我将使用我们需要
“ 注意:在本教程中我使用web3js 1.0版本 ”
大家好,我将解释如何从NodeJS后端发送交易。我将使用 rinkeby testnet
并将创建一个路由器,还添加一些节点模块并使用infura http接口来完成教程。
我们需要 web3js
, express
和 ethereumjs-tx
模块来执行交易。之后你需要从 Infura 输入你自己的api key,登录到infura。
开始
首先,你需要为此项目创建一个空文件夹,以便更轻松地访问它。创建文件夹后,你需要在该文件夹中打开命令shell。我假设你的计算机上安装了 npm
。npm是由nodejs分发的,所以如果你安装了nodejs,你也会得到npm。如果你没有从 这个网站 下载包含npm的nodejs。安装npm后你需要调用它。
npm init
如果要保留默认设置(包括默认名称,即文件夹名称),可以通过输入 enter
键跳过所有行。在此过程结束时,你将拥有一个 package.json
文件。
启动项目后,在文件夹中需要创建一个js文件,其中包含你想要的名称,这将是我们的后端。
获取模块
在我的代码中,你可以看到有模块要求,我们只需通过npm下载将它们包含到项目中。他们的npm调用:
npm install web3 --save npm install express --save npm install ethereumjs-tx --save
你需要从命令行单独调用此行以将它们安装到项目中。完成安装过程后,可以看到有一个文件夹名称是节点模块,它是模块下载的文件夹。
INFURA
完成下载模块后。你需要一个infura api密钥。Api 密钥是完成本教程的关键部分。你可以通过登录Infura来获得它。获得infura api密钥后,需要使用api密钥更改第7行(YOUR_API_KEY)。
顺便说一句,infura是非常好的接口。你也可以通过infura api访问 ipfs ,这是一个区块链存储服务。可以从他们的网站获得有关ipfs的更多信息。
通过获取infura api密钥,我们完成了代码的预请求。我们可以开始编码了。从现在开始,我将逐行解释代码。
在前3行,我将模块添加到js文件中。
- web3是将与以太坊交互的模块。
- 创建路由器需要Express。
- ethereumjs-tx是创建交易所必需的。
在第5行,我使用 Express
模块创建我的应用程序。
创建应用程序后,我们需要编写文件的最后一行:
app.listen(3000, () => console.log('Example app listening on port 3000!'))
在第8行,我使用 httpprovider
创建 web3js
对象,这是在nodejs后端的infura。如果你在看到本教程之前搜索过以太坊后端开发,你可以看到其中许多都是由reactjs编码的,并且他们使用 metamask
作为接口服务。NodeJS后端无法访问浏览器资源,因此NodeJS后端无法使用 metamask
作为服务接口程序,我对其进行了处理并使用infura作为接口服务提供程序。
在web3的某些功能中,需要web3的websocket提供程序,因此需要在用的时候更改第8行。
web3js = new web3(new web3.providers.WebsocketProvider('wss://mainnet.infura.io/_ws'));
在第10行,我创建了我的路由器,这是一个get,但它需要在逻辑上发布。我创建本教程只是为了展示如何完成发送交易,所以这个无关紧要。
在路由器内部我需要我的rinkeby以太坊地址(myAddress),我将发送我的交易地址(toAddress),合约地址(contractAddress)和合约abi(contractABI)。你可以通过以太坊钱包或etherscan搜索合约abi 。我从ethereum wallet部署本教程合约,你不需要部署任何合约。你可以简单地使用现有的一个。
我们需要的最后一件事是我的私钥(privateKey)。这不是一种安全的方式,但由于我们的前端没有任何钱包(因为我们没有前端:))我们此时手动执行操作。你无法通过以太坊钱包访问你的私钥,因此你需要将你的rinkeby以太坊帐户导入类似 MyEtherWallet 的网站。
在定义变量后的路由器中,我们创建原始交易,然后使用我们的私钥对其进行签名。签署交易后,我们通过web3js将其发送到rinkeby testnet。
完成编码后,我们需要对其进行测试。在同一文件夹中打开命令 shell 并启动后端。我的文件名是backend.js所以我是通过代码启动的。
node backend.js
这意味着可以使用代码启动后端:
node <filename with extension>
启动后端后,需要打开浏览器,并且需要将http://localhost:3000/sendtx写入地址行。
如此而已。我们为以太坊创建了我们的一个极小的后端。代码如下:
const web3 = require('web3'); const express = require('express'); const Tx = require('ethereumjs-tx'); const app = express(); //Infura HttpProvider Endpoint web3js = new web3(new web3.providers.HttpProvider("https://rinkeby.infura.io/YOUR_API_KEY")); app.get('/sendtx',function(req,res){ var myAddress = 'ADDRESS_THAT_SENDS_TRANSACTION'; var privateKey = Buffer.from('YOUR_PRIVATE_KEY', 'hex') var toAddress = 'ADRESS_TO_SEND_TRANSACTION'; //contract abi is the array that you can get from the ethereum wallet or etherscan var contractABI =YOUR_CONTRACT_ABI; var contractAddress ="YOUR_CONTRACT_ADDRESS"; //creating contract object var contract = new web3js.eth.Contract(contractABI,contractAddress); var count; // get transaction count, later will used as nonce web3js.eth.getTransactionCount(myAddress).then(function(v){ console.log("Count: "+v); count = v; var amount = web3js.utils.toHex(1e16); //creating raw tranaction var rawTransaction = {"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); //creating tranaction via ethereumjs-tx var transaction = new Tx(rawTransaction); //signing transaction with private key transaction.sign(privateKey); //sending transacton via web3js module 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('Example app listening on port 3000!'))
如果希望快速进行以太坊开发,那请看我们精心打造的教程:以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
其他区块链教程如下:
- 以太坊开发进阶教程,主要是介绍使用node.js、 mongodb 、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- java以太坊开发教程,主要是针对 java 和android程序员进行区块链以太坊开发的web3j详解。
- python以太坊,主要是针对 python 工程师使用web3.py进行区块链以太坊开发的详解。
- php以太坊,主要是介绍使用 php 进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
- EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
汇智网原创翻译,转载请标明出处。这里是 原文
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- java通过smtp服务 给指定邮箱发送邮件含附件
- 让 PHP 的 mail() 通过代理 SMTP 服务器发送邮件
- FreeBuf 早报 | WeTransfer发生安全事件,文件通过电子邮件发送给错误的人;恶意软件滥用Android调...
- SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式
- Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件
- Android 快速发送邮件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出Node.js
朴灵 / 人民邮电出版社 / 2013-12-1 / CNY 69.00
本书从不同的视角介绍了 Node 内在的特点和结构。由首章Node 介绍为索引,涉及Node 的各个方面,主要内容包含模块机制的揭示、异步I/O 实现原理的展现、异步编程的探讨、内存控制的介绍、二进制数据Buffer 的细节、Node 中的网络编程基础、Node 中的Web 开发、进程间的消息传递、Node 测试以及通过Node 构建产品需要的注意事项。最后的附录介绍了Node 的安装、调试、编码......一起来看看 《深入浅出Node.js》 这本书的介绍吧!