以太坊教程:通過NodeJS後端傳送交易
“ 注意:在本教程中我使用web3js 1.0版本 ”
大家好,我將解釋如何從NodeJS後端傳送交易。我將使用 rinkeby testnet
並將建立一個路由器,還新增一些節點模組並使用infura http介面來完成教程。
我們需要 web3js
, express
和 ethereumjs-tx
模組來執行交易。之後你需要從 ofollow,noindex">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檔案中。
在第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的開發。
匯智網原創翻譯,轉載請標明出處。這裡是 原文