Web3.js 學習

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是區塊的位置,會顯示相關的更加具體的信息,包括其中交易的哈希值

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447159.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言指針入門

指針的用途非常廣泛,比如如果你想通過函數改變一個變量的值,就得用指針而不能用值傳遞。還有在很多時候變量,特別是對象的數據量實在太大,程序員就會用指針來做形參,只需要傳遞一個地址就行,大大提高了效率…

搭建基于飛槳的OCR工具庫,總模型僅8.6M的超輕量級中文OCR,單模型支持中英文數字組合識別、豎排文本識別、長文本識別的PaddleOCR

介紹 基于飛槳的OCR工具庫,包含總模型僅8.6M的超輕量級中文OCR,單模型支持中英文數字組合識別、豎排文本識別、長文本識別。同時支持多種文本檢測、文本識別的訓練算法。 相關鏈接 PaddleOCR項目地址飛槳開源深度學習平臺效果展示頁面中文OCR在線體驗地…

macos 10.15 django2.2+apache2.4+ladon+wsgi寫webseverice接口

他的文檔不夠完善,使用起來可能有坑,因為不知道如何將ladondjangoapache綁定在一起使用,所以放棄了。 提醒:最好用個虛擬環境,防止庫沖突我使用的是anaconda 安裝apache macos本身自帶apache,其他平臺百度…

使用軟鏈接的方式遷移Docker

確認Docker安裝的位置 使用命令sudo docker info | grep "Docker Root Dir" 查看Docker的安裝位置如果是默認安裝的方式 ,一般會安裝在/var/lib/docker 路徑下面 前置工作 下文以 /store/software/docker 這個路徑作為要遷移的新 Docker 安裝(存儲)目錄…

Qt tableWidget導入\導出Excel表格 自用

首先在.pro文件中添加以下代碼:QTaxcontainer 代碼是轉載的,找不到源博客鏈接 void excel_01::on_pushButton_clicked() {//導出ui->progressBar->setValue(0); //設置進度條的值為0QString fileName QFileDialog::getSaveFileName(this,tr(&q…

基于HubServing的PaddleOCR部署

前提要求 服務器的部署需要鑒于先前安裝配置的docker環境,因此相關步驟查看我之前的博客 參考鏈接 服務部署 先前介紹 參考鏈接 官方推薦本博客采用基于HubServing的部署,這種方式已經集成到PaddleOCR里面,在先前的docker鏡像里面就可以…

我的職業生涯規劃學習日記(軟件工程)整理時間線

學習路線 語言只是工具不過學c一直都做不出來東西是為什么呢,下圖要第六部才做項目 概述 大一上學期:C,C,數據結構,cstl源碼,python爬蟲進入物聯網實驗室python方向,進入算法協會運維部學習算…

PaddleOCR和ChineseOCR的對比

PaddleOCR和ChineseOCR的對比 ChineseOCRPaddleOCR 對比 識別時間 chineseOCR識別的速度相對于PaddleOCR較慢,單純使用CPU對于單張圖片的識別時間可以達到20秒,如果使用GPU識別的時間一般控制在5秒以內(圖片包含的文字比較少的情形&#x…

C++內存管理(1)

根據侯捷老師的視頻:https://www.bilibili.com/video/BV1Kb411B7N8 這篇文章歸納內存管理的面試題和一些知識點梳理 正在更新中 首先為什么想要內存管理 不知道有沒有人好奇delete[]或者delete的時候為什么系統會自動這個變量 占了多少字節。 答案是因為cookies&a…

web3@0.20.1 在依據abi創建智能合約的時候報錯 TypeError: web3.eth.contract is not a function

前面的代碼不變 var web3 new Web3(new Web3.providers.HttpProvider("Http://localhost:8545")); var abi JSON.parse([{"constant":true,"inputs":[{"name":"candidate","type":"bytes32"}],"…

Linux學習筆記(一)------實操排雷

參考兄弟連b站網課 1.1如果沒有ifconfig 使用sudo apt install net-tools 下載;(ifconfig已經被淘汰所以需要另外下載) 1.2如果網卡是ens33; (1). vi /etc/sysconfig/network-scripts/ifcfg-ens33 將里面的…

Dapp簡單的投票小例子

準備工作 相關命令 mkdir simple_voting_dapp //創建文件夾cd simple_voting_dapp //進入文件夾npm init //初始化npm包管理文件,輸入ls 可以看到創建的package.json文件npm intsall web30.20.1 //安裝web3npm install solc0.4.25 //安裝solcnpm install -g ga…

使用mocha進行測試 區塊鏈

mocha安裝 npm install mocha --save-dev mocha簡介 mocha是一個JavaScript的單元測試的框架,既可以運行在瀏覽器環境中,也可以運行在node.js環境中,只需要編寫測試用例,mocha就會將測試自動的運行,并且給出測試的結…

Linux學習筆記(六)

參考書籍:linux就該這么學 6.存儲結構與磁盤劃分 6.1 文件系統與數據資料 6.2 掛載硬件設備 6.2.1 mount 命令用于掛載文件系統 6.2.2 umount 命令用于撤銷已經掛載的設備文件 6.3 添加硬盤 6.3.1 fdisk 命令用于管理磁盤分區 6.3.2 用于查看文件數據占用量的 du 命…

實現Linux系統外部和容器內部的文件傳輸

主機和容器之間進行文件傳輸,需要使用容器的ID即可 獲取方法如下 輸入指令 docker ps -a只需要CONTAINER ID傳輸命令 docker cp 本地文件路徑 容器ID:容器的路徑將文件從容器拷貝到本地的原理是一致的,只需要將對應路徑的位置進行更換即可

Linux學習筆記(五)

參考書籍:linux就該這么學 5 用戶身份與文件權限 5.1 用戶身份與能力 強烈推薦大家在學習時使用 root 管理員權限!因為在 Linux 的學習過程中如果使用普通用戶身份進行操作,則在配置服務之后出現錯誤時很難判斷是系統自身的問題還是因為權限不…

清除Docker的占用空間問題

使用命令查看磁盤的空間 docker system df ,類似于Linux的df命令,用于查看Docker使用的磁盤空間Docker鏡像占據了4.789GBDocker容器占據了348BDocker數據卷占據了0B 執行刪除命令 docker system prune命令可以用于清理磁盤,刪除關閉的容器、…

集訓01-03 (c++實現)

#include<bits/stdc.h>與using namespace std;在第一第二行加上就行&#xff0c;無需了解 cin cout endl為c的輸入&#xff0c;輸出與換行符 Istringsteam 是string流,用來string轉換為int 五個函數&#xff08;需要稍微了解c迭代器&#xff0c;lambda(類似函數)&#xf…

區塊鏈的完整流程 自動化執行代碼

通過npm script機制&#xff0c; 在package.json文件中&#xff0c;輸入對應的代碼&#xff0c;就可以自動化執行相關的函數使用npm run test執行package.json中的內容&#xff0c;因為package.json包含test&#xff0c;所以可行&#xff0c;但是使用npm run compile會報錯

集訓04-06 (c++實現)

極力推薦《算法筆記》這本書&#xff01;&#xff01;&#xff01; 極力推薦《算法筆記》這本書&#xff01;&#xff01;&#xff01; 極力推薦《算法筆記》這本書&#xff01;&#xff01;&#xff01; &#xff08;重要的事情說三遍&#xff09; 數據結構和算法講的很好&…