1. 程式人生 > >以太坊教程:通過NodeJS後端傳送交易

以太坊教程:通過NodeJS後端傳送交易

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

其他區塊鏈教程如下:

  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和事件等內容。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和事件等。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。

匯智網原創翻譯,轉載請標明出處。這裡是原文