web3.js
- Web3 JavaScript app API
- web3.js是一個JavaScript API庫,一般使得DApp在以太坊上運行
- web3.js通過RPC調用與本節點通信,用于任何暴露了RPC層的以太坊節點之間通信
- web3包含了eth對象,即web3.eth(專門和以太坊區塊鏈交互)和shh對象,即web3.shh(用于和Whisper交互,消息傳遞)
DEV模式的私有鏈
- 在myDevChain文件夾下面,搭建了私有鏈,使用命令啟動私有鏈,geth --datadir . --networid 15 console 2>output.log
- 輸入web3即可查看關于web3的相關組件
- 比如bzz、dp(操作數據庫的,一般是mongdb)、eth等等
web3模塊加載
- 新建一個文件夾,使用命令cnpm init初始化
- 初始化完成之后,會生成一個package.json的包管理文件,然后安裝指定的web3模塊的版本
- 首先需要將web3模塊安裝在項目中,使用命令如下
- --save-dev是將環境添加到開發環境的依賴中去
cnpm install web3@0.20.1 --save-dev
- 可以使用此刻最新版@1.2.6,安裝完成之后,會在文件夾下面生成node_modules文件夾,cd進入之后,使用ls命令,可以看到web3模塊
- 使用命令cnpm list web3,查看web3的相關內容
- 查看安裝web3的版本
cnpm list web3
- 然后創建一個web3實例,設置一個“provider”
- provider是指服務的啟動者,使用provider啟動接口服務
- 為了保證MetaMask設置好的provider不被覆蓋掉,在引入web3之前需要進行環境檢查(以v0.20.1為例)
-
if(typedef web3 !== 'undefined'){web3 == new Web3(web3.currentProvider); }else{web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); }
異步回調(callback)
- 使用eth.blocknumber()返回區塊的高度
- 使用eth.getBlock(x),返回高度為x的區塊的具體內容?
- web3.js設計的最初目的是為了和本地的RPC共同使用,所以默認情況下發送的是同步的HTTP請求(同步容易堵塞,一般都是采用異步的方式)
- 如果發送的是異步的請求,可以在函數的最后一個參數位置上,傳入一個回調函數。回調函數是可選的(optional)
- 回調風格一般采用“錯誤優先”的方式
- 其中function為回調函數
-
web3.eth.getBlock(48,function(error,result)){if(!error)console.log(JSON.stringify(result));elseconsole.error(error); }
回調Promise事件(V1.0.0)
應用二進制接口(ABI)
- web3.js通過以太坊智能合約的json接口(Application Binary Interface,ABI)創建一個JavaScript對象,用來在js代碼中描述
- 函數(functions)
- type:函數類型,默認是“function”,也可能是“constructor”
- constant、payable和stateMutability:函數的狀態是可變性
- inputs、outputs:函數輸入、函數輸出參數描述列表
- 事件(events)
- type:類型,總是“event”
- inputs:輸入對象的列表,包括name、type和indexed
- 使用
- 在web3文件夾下面,創建合約文件夾,mkdir contract
- cd contract,進入合約文件夾下,touch Coin.sol創建合約,將remix中的合約拷貝進去
- 執行編譯 solcjs --abi Coin.sol
- 就會在當前文件夾下面生成一個以abi結尾的文件
- 查看這個以abi結尾的文件,具體內容如下,主要包含兩類內容:事件和函數
[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"miner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"send","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Sent","type":"event"}
]
- solcjs --bin Coin.sol生成bin文件,bin文件就是提交合約最后部署的文件
- 輸入node,打開控制臺,也就是js執行環境?
操作(引入web3)
- 先在本地啟動一個區塊鏈私有鏈
- 輸入node進入 node.js頁面
- 輸入 var web3 = require('web3')
- 輸入web3
- 輸入var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'))
- 輸入web3,可以查看已經創建好了web3
- 輸入web3.isConnected()查看是否連接區塊鏈,如果返回為false,需要在myDevChain文件夾下面啟動私有區塊鏈,并且開啟rpc服務
- 輸入web3.version查看web3的版本
批處理請求(batch requests)
- 批處理請求允許將請求排序,然后一起處理
- 注意:批量請求不會更快。實際上,在某些情況下,一次性發出多個請求反而會更快,因為請求是采用異步處理的方式進行的
- 批處理請求主要確保請求的順序,并且采用串行處理的方式
大數處理(big numbers)
- JavaScript默認處理的數字精確度比較小,所以web3.js會自動添加一個依賴庫文件BigNumber,專門用于處理大數據
- 對于數值,應該習慣將它轉化為BigNumber對象來處理
- BigNumber.tostring(10)對小數只保留20位浮點精確度。所以推薦做法是內部使用wei來顯示余額(大整數),只有需要給用戶看的時候才轉化為ether或者其他單位
- 例子
var BigNumber = require('bignumber.js')
var balance = new BigNumber('1231231231123325647673565363777373733833222');
balance.plus(21).tostring(10);//或者直接輸入balance就可以,tostring(位數)轉化進制//s表示正負數,1表示正數,-1表示負數
//e表示科學技法中的10的位數
//c數組,每14位切割一次定義成數組
- 使用balance.tostring()將所有的數字拼接成一個字符串輸出,也可以在在()中加入數字,表示進制的轉化,但是如果改成浮點數,會造成精度的缺失?
?
常用的API基本信息查詢
- 不同web3版本之間使用的差異
- web3.js V1.2.6版本參考鏈接
- 初始完provider還可以重新設定provider
- 輸入geth --help 在API AND CONSOLE OPTIONS選項下面,可以看到其余的連接方式
- 除了Http其余的連接方式:--ws(8546端口,推薦)、ipcdisable方式(進程之間調用)?
- 使用命令啟動區塊鏈之后,會在當前目錄下面生成geth.ipc文件。命令為?
- geth --datadir "/Users/chy/Desktop/myeth/chaindata" --rpc ?--networkid 6666?console 2>output.log
- 此處的netwokid是在gensis.json里面寫死的,如果忘記,可以使用cat gensis.json查看,chainid后面的內容
web3通用工具方法
- 以太單位轉換 web3.fromWei? ?web3.toWei
- 數據類型轉換 web3.toString? web3.toDecimal? ?web3.toBigNumber
- 字符編碼轉換 web3.toHex? web3.toAscii? web3.toUtf8? web3.fromUtf8
- 地址相關 web3.isAddress web3.toChecksumAddress
web3.eth 賬戶相關
?
?
- 如果已經啟動了一個監聽器,再次定義新的監聽器,需要將先前的監聽器干掉,使用命令filter.stopWatching()命令?
?
?
注意
- ctrl+L清屏
- web3不同的版本之間命令發生了變化。需要看官方的文檔
相關命令
- web3.eth.getBlock(2) //2是區塊的位置,會顯示相關的信息,但是其包含的交易只顯示哈希值
- web3.eth.getBlock(2,true) //2是區塊的位置,會顯示相關的更加具體的信息,包括其中交易的哈希值