node.js如何发送以太坊交易?

“ 注意:在本教程中我使用web3js 1.0版本 ”

大家好,我将解释如何从NodeJS后端发送交易。我将使用rinkeby testnet并将创建一个路由器,还添加一些节点模块并使用infura http接口来完成教程。

我们需要web3jsexpressethereumjs-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(con??tractABI)。你可以通过以太坊钱包或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!‘))

如果希望快速进行以太坊开发,那请看我们精心打造的教程:

以太坊开发实战进阶,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。

原文地址:http://blog.51cto.com/13697184/2287118

时间: 2024-11-02 11:32:29

node.js如何发送以太坊交易?的相关文章

转:Node.js邮件发送组件- Nodemailer 1.0发布

原文来自于http://www.infoq.com/cn/news/2014/07/node.js-nodemailer1.0-publish Nodemailer是一个简单易用的Node.js邮件发送组件(通过SMTP.sendmail或者Amazon SES实现邮件发送),且支持 Unicode编码.近日,Nodemailer 1.0发布,此版本包括许多新特性,稳定性也得到了提高,第一次不支持向后兼容.该版本对整个代码进行了重构,降低了代码复杂度,使代码更加简单,更加易于维护.该版本还新增了

使用PHP和树莓派开发一个比特币和以太坊交易机器人

我最近得到了Raspberry Pi Zero Wifi,我告诉你这个东西是改变游戏规则的.我之前使用过RasPis,但由于该设备的占地面积小得多,耗电少,价格便宜且无线上网,因此非常适合低端或物联网项目. 注:目前我已经扩展了机器人以便能够交易以太坊! 我希望它能够在不必太多关注的情况下做事,而我想到的第一件事就是: 为什么不创建一个可以自动进行比特币和以太坊的简单交易机器人. 这个想法很简单:Raspberry Pi Zero使用Coinbase API定期检查价格,并在有意义的时候购买和销

node.js EventEmitter发送和接收事件

EventEmitter是nodejs核心的一部分.很多nodejs对象继承自EventEmitter,用来处理事件,及回调.api文档地址: http://nodejs.org/api/events.html#events_class_events_eventemitter Event: Many objects in Node emit events: a net.Server emits an event each time a peer connects to it, a fs.read

EOS和以太坊那个区块链平台更好?

显然,你已经听说过两个最受欢迎的智能合约区块链,但想知道EOS与以太坊之中哪个更好?或许你想比较一下两种技术?好吧,你来对了地方,因为我要告诉你你需要知道的一切! 在这个EOS vs Ethereum指南中,我将首先解释每个项目的基础知识,然后概述每个区块链的执行情况.这将包括交易时间,交易费用和可扩展性等内容. 之后,我将简要介绍如何在没有第三方的情况下验证交易.这将包括以太坊使用的工作量证明(Proof of Work)与EOS使用的股份授权证明(Delegated Proof of Sta

以太坊RPC机制与API实例

上一篇文章介绍了以太坊的基础知识,我们了解了web3.js的调用方式是通过以太坊RPC技术,本篇文章旨在研究如何开发.编译.运行与使用以太坊RPC接口. 关键字:以太坊,RPC,JSON-RPC,client,server,api,web3.js,api实例,Postman 以太坊JSON RPC API geth命令api相关 之前介绍过这些API都可以在geth console中调用,而在实际应用中,纯正完整的RPC的调用方式, geth --rpc --rpcapi "db,eth,net

区块链学习(2)--以太坊中基本概念

1.以太币单位换算.以太坊的单位,沿袭了科学界的传统,用做过杰出贡献的数学.密码学专家的名字命名.以太坊的最小单位是 Wei. Kwei(Babbage)= 10 的 3 次方 Wei Mwei(Lovelace)= 10 的 6 次方 Wei Gwei(Shannon)= 10 的 9 次方 Wei MicroEther(Szabo)= 10 的 12 次方 Wei MilliEther(Finney)= 10 的 15 次方 Wei Ether = 10 的 18 次方 Wei 2.以太坊账

科普贴 | 以太坊代币钱包MyEtherWallet使用教程,一步步教你玩转MEW

MyEtherWallet 是一个以太坊的网页钱包,使用非常简单,打开网页就可以使用,源代码开源,不会在服务器上存储用户的钱包信息如私钥和密码.支持 Ledger Wallet.TREZOR 等硬件钱包,功能极为丰富.是一把我们经常会用到的瑞士军刀! Myetherwallet 支持符合 ERC20 标准的代币(即以太坊系代币). 官网:https://www.myetherwallet.com/ ,一定要认准网址. 创建钱包1. 打开官网,将页面切换为中文,设置一个钱包密码(不少于9位,一定要

【区块链】以太坊(Ethereum )高级进阶实战视频教程

[区块链]以太坊(Ethereum )高级进阶实战视频教程视频教程地址:http://edu.51cto.com/course/14785.html 课程大纲: 课程概要介绍使用bootnode搭建以太坊私有链web3j介绍及基本使用使用web3j管理账户default block parameter以太坊交易详解ERC20代币介绍使用web3j部署ERC20代币合约账户解锁web3j调用代币合约方法(一)web3j调用代币合约方法(二)web3j调用代币合约方法(三)深入sendTransac

以太坊代币合约详析

以太坊代币 在以太坊系统中,存在作为基础货币的 Ether(以太),以及同样可以作为货币使用的 Token(代币). 以太坊与其他加密货币的主要不同在于,以太坊不是单纯的货币,而是一个环境/平台.在这个平台上,任何人都可以利用区块链的技术,通过智能合约来构建自己的项目和DAPPS(去中心化应用). 如果把以太坊理解成互联网,DAPPS则是在上面运行的网页.DAPPS是去中心化的,意味着它不属于某个人,而是属于一群人.DAPPS发布的方式通常是采用被称为 ICO 的众筹方式.简单来说,你需要用你的