1. 程式人生 > >node.js如何發送以太坊交易?

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

服務 操作 獲得 ria 適合 req nds .json mongodb

“ 註意:在本教程中我使用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實戰,適合進階。

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