以太坊学习路线——(二、下)以太坊编程接口:web3.js
這篇博客演示的基本操作系統環境是CentOS 7,參考書籍:以太坊開發實戰——以太坊關鍵技術與案例分析 第六章(吳壽鶴、馮翔、劉濤、周廣益?? 著)。要運行本博文相關程序,需要搭建以太坊私有鏈、安裝testrpc
文章結構:
一.安裝與啟動web3.js
二.賬戶相關API
1.查看所有可用賬戶
2.查看賬戶余額
三、交易相關API
1.賬戶之間轉賬交易
2.發送一個已經簽名的轉賬交易
3.調用合約
一.安裝與啟動web3.js
$ npm install --save web3@0.20.0首先在一個終端中運行testrpc以啟動測試鏈,然后在另一個終端,編寫相關js文件。這里編寫test.js文件如下:
var Web3 = require("web3"); //創建web對象 var web3 = new Web3(); //連接到以太坊節點 web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));//列出所有的可用用戶 var accounts = web3.eth.accounts; console.info(accounts); //編寫完成后執行如下命令運行js文件 [root@localhost geth]# node test.js //以下為輸出結果,即所有可用賬戶 [ '0x623053f6e32ea1740ab791fae0e2e402b367e501','0xc8f4672e8e988df4d5f6ee9c1322eba005583267','0x242e2ad79192f5f28c13d6d9ee57976ef346d63f','0x88304656b1031469af4412df4b2de8b2c7759385','0x55b0d4de3900b00c7ac1c5ede911a832c3f0ec91','0xaf767e3d3da4b8bcba5ca9978d5ca4a7bdf6532f','0x7ce1fd31c404682eba0d7fd33d8635c47ee2cc4b','0x40023a7f603fd4fc9675c1670b249d054ae33eef','0xa723cea532564ded55ad8e6256fb016d25cf18b5','0x49ab097da3c5089764e0d5c4117f950263274c0b' ]//而在testrpc終端下,可以看到對測試鏈的操作:eth_accounts ………… ………… HD Wallet ================== Mnemonic: penalty silk correct trial good drama action arctic drip rebel weather level Base HD Path: m/44'/60'/0'/0/{account_index}Listening on localhost:8545 eth_accounts二.賬戶相關API
1.查看所有可用賬戶
var accounts = web3.eth.accounts; console.info(accounts);2.查看賬戶余額
//查看accounts[0]賬戶的余額,返回的余額是以wei為單位表示的 var balance_1 = web3.eth.getBalance(web3.eth.accounts[0]); //將余額用ether為單位表示 var balance_eth = web3.fromWei(balance_1,"ether"); console.log(balance_eth.toString());三、交易相關API
在以太坊中兩個賬戶之間的轉賬操作可以當作時一個交易,同樣調用智能合約中的函數也可以當作時一個交易。
1.賬戶之間轉賬交易
在轉賬之前如果我們不知道需要給交易設置多少gas,可以通過下面的語句估算并本次交易大概需要消耗的gas:
var estimate_gas = web3.eth.estimateGas({from: web3.eth.accounts[0],to: web3.eth.accounts[1],value: web3.toWei(1,"ether")}); console.log(estimate_gas);//21000一般簡單的轉賬交易通常會花費21000gas,得到gas后便可以構建一個轉賬交易了。轉賬交易組成部分:
- from:交易發送這的地址,這筆交易最后需要from的私鑰簽名。
- to:接收這筆交轉賬的目的地址。
- value:接收這筆交易轉賬的金額,以wei為單位。
- gas:這筆交易中可使用的gas,未使用的gas會被退回。
- gasPrice:這筆交易中附加的gas價格,默認是網絡gas價格的平均值。
2.發送一個已經簽名的轉賬交易
上面發起交易的帳號都存儲在我們連接的以太坊節點中,如果我們自己有一個帳號,并且這個帳號不存儲在我們連接的以太坊節點中,那么我們就需要通過web3.eth.sendRawTransaction方法完成交易的簽名與發送。
在后面操作中,要給剛剛創建的交易rawTx加上簽名時,需要使用另外一個庫:
$ npm install --save ethereumjs-tx@1.3.3?建立test.js,編輯如下內容,完成后在test.js同一目錄下,執行node test.js來加載運行。
//引入web3 var Web3 = require("web3"); //創建web3對象 var web3 = new Web3(); //鏈接到以太坊節點 web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));/** (1)創建待發送的交易 */ var address = "0xeaf9e84c229c9b1023dd9f8315c01045dd7b741d"; var nonce = web3.eth.getTransactionCount(address,'pending'); var amount = web3.toWei(1,"ether"); var rawTx = {from:address,to:"0xb4f58a932a1cadf638f8e0eafce9bda71144c56e",value:web3.toHex(amount),nonce:web3.toHex(nonce),gasLimit:web3.toHex("49674") }/**(2).給交易添加簽名 */ //引入'ethereumjs-tx'包 var Tx = require('ethereumjs-tx');//創建raw transaction var tx = new Tx(rawTx);//from地址的私鑰 var privateKey = new Buffer('9ff1ba4ce83afdfb326fb68b00997f93277d3fd4c606fd61b5c5484bed92d369','hex');//使用私鑰給rawTx簽名 tx.sign(privateKey);//簽名后的交易 var serializedTx = tx.serialize(); //控制臺輸出簽名后交易信息 console.log(serializedTx.toString('hex'));/**(3)發送已簽名交易*/ //發送成功后會返回一個交易的hash值 web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err,hash) {if (!err) {console.log(hash);} else {console.log(err);} });運行成功后,控制臺返回如下內容,即簽名后的交易信息和交易發送成功后的交易hash值
f867808082c20a94b4f58a932a1cadf638f8e0eafce9bda71144c56e880de0b6b3a7640000801ba04538ca57dd5b47173e58a4fe6868408ddeb2e6832524517c423e9e421e4bb736a01b4cd69f9519549bcf53b87edb364958aed0846194ee820fbf34affa7bf20445 0x9b1ef283db7211968b76520466942ae417cc1ac18ec761202a01065e71c768a33.調用合約
在以太坊中可以通過交易調用智能合約中的函數,首先編寫要使用的只能合約:
pragma solidity >=0.4.21 <0.6.0;contract Storage {uint256 public storedData;function set(uint256 data) public {storedData = data;}function get() public returns (uint256) {return storedData;} }? 然后把合約部署到以太坊網絡上,合約部署成功后會得到三個比較重要的東西:
(1).合約地址:"0xb69ff7afae8e014f76a4ad1a693076f9197620f8"
(2).合約的接口描述文件:
abi: [{constant: true,inputs: [],name: "storedData",outputs: [{...}],payable: false,stateMutability: "view",type: "function"}, {constant: false,inputs: [{...}],name: "set",outputs: [],payable: false,stateMutability: "nonpayable",type: "function"}, {constant: true,inputs: [],name: "get",outputs: [{...}],payable: false,stateMutability: "view",type: "function"}](3).合約的簽名,合約函數的獲取方式如下:
//將合約的get()方法經過sha3計算后,取除了0x外的前面的8位 > var get_func_sign = web3.sha3('get()').substr(2,8); //將合約的set(uint256)方法經過sha3計算后,取除了0x外的前面的8位 > var set_func_sign = web3.sha3('set(uint256)').substr(2,8);//查看函數簽名 > set_func_sign "60fe47b1" > get_func_sign "6d4ce63c"目前有兩種方法可以調用合約:
- 通過合約地址加合約接口描述文件。
- 通過合約地址加被調用合約的函數簽名。
這里介紹第二種方式,首先構建一個調用get方法的交易:
var tx_get = {"from": "0x8c7ae59ab7e5d510ae3f09a9544978f50315b5f5","to": "0xb69ff7afae8e014f76a4ad1a693076f9197620f8","data": "0x" + "6d4ce63c" + "0000000000000000000000000000000000000000000000000000000000000000" };- from:交易發起者地址。
- to:合約地址。
- data:傳給合約的參數,由0x、6d4ce63c和參數0000000000000000000000000000000000000000000000000000000000000000組成,因為要調用get方法不需要傳遞參數,所以這里為傳入的為0。
執行交易:
> var result = web3.eth.call(tx_get); undefined > console.info(result); 0x執行完成后返回的是0,因為還沒有給storedData設置值。所以需要調用set方法給storedData設置一個值,首先需要構建一個set方法的交易,并設置set函數傳入值為1。
var tx_set = {"from": "0x8c7ae59ab7e5d510ae3f09a9544978f50315b5f5","to": "0xb69ff7afae8e014f76a4ad1a693076f9197620f8","gaslimit": web3.toHex("50000"),"data": "0x" + "60fe47b1" + "0000000000000000000000000000000000000000000000000000000000000001" }; //執行交易,(需要解鎖賬戶、挖礦)返回交易hash > var txId = web3.eth.sendTransaction(tx_set); > txId "0xb20213f7e852a619a81abe0019da3c998ea84ac94953443b5afb6903044584a7" > var result = web3.eth.call(tx_get); console.info(result); //正確返回結果應該為1總結
以上是生活随笔為你收集整理的以太坊学习路线——(二、下)以太坊编程接口:web3.js的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1031 Hello World for
- 下一篇: Python实现RGB转Lab颜色空间,