web3简介

注意 web3.js 有两个不兼容的版本:0.20.x及1.0beta,1.0对0.20版本做了重构。

本文档是web3.js 0.20.x版本翻译,其对应的官方文档地址在 JavaScript-API 。 如果你使用的是 web3.js 1.0版本,其对应的官方文档地址在 Web3js Readthedocs 。

Web3是一套和以太坊节点进行通信的API,如果我们需要基于以太坊来开发去中心化应用,则web3是必须要了解的内容,例如需要通过Web3来获取节点状态,获取账号信息,调用合约、监听合约事件等等。

译者注: 智能合约是运行在节点提供的虚拟机上,因此调用智能合约也需要像节点发送请求。

基于以太坊开发DApp(去中心化应用程序),可以使用 web3.js库 提供的 web3 对象, 在底层实现上, web3 通 过 RPC调用 与本地节点通信, web3.js 可以与任何暴露了RPC接口的以太坊节点连接。

web3 包含下面几个对象:

  • web3.eth 用来与以太坊区块链及合约的交互

  • web3.shh 用来与Whisper协议相关交互

  • web3.net 用来获取网络相关信息

  • web3 主对象 包含一些工具

web3.js使用示例

  • 使用web3.js API在页面中转账

  • 使用web3.js 与合约交互及监听合约事件

  • 多个API 使用Demo

  • 官方示例

  • Dapp 模式

想要学习去中心化应用(DAPP)开发,这门课程不容错过 区块链全栈-以太坊DAPP开发实战

引入web3

首先你需要将web3引入到应用工程中,可以通过如下几个方法:

  • npm: npm install web3

  • bower: bower install web3

  • meteor: meteor add ethereum:web3

  • vanilla: 链接 dist/web3.min.js

然后你需要创建一个 web3 的实例,设置一个provider。为了保证你不会覆盖一个已有的provider(Mist浏览器或安装了MetaMak的浏览器会提供Provider),需要先检查是否 web3 实例已存在,示例代码如下:

if (typeof web3 !== 'undefined') {web3 = new Web3(web3.currentProvider);
} else {// set the provider you want from Web3.providersweb3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}

译者注: 官方文档中对于web3的没有更新,现在新的检查方式为:

// 检查是否是新的MetaMask 或 DApp浏览器
var web3Provider;
if (window.ethereum) {web3Provider = window.ethereum;try {// 请求用户授权await window.ethereum.enable();} catch (error) {// 用户不授权时console.error("User denied account access")}
} else if (window.web3) {   // 老版 MetaMask Legacy dapp browsers...web3Provider = window.web3.currentProvider;
} else {web3Provider = new Web3.providers.HttpProvider('http://localhost:8545');
}
web3 = new Web3(web3Provider);

成功引入后,你现在可以使用 web3 对象的API 了。

使用回调

由于这套API被设计来与本地的RPC结点交互,所有函数默认使用同步的HTTP的请求。

如果你想发起一个异步的请求。大多数函数允许传一个跟在参数列表后的可选的回调函数来支持异步,回调函数支持 Error-first回调 的风格。

web3.eth.getBlock(48, function(error, result){if(!error)console.log(JSON.stringify(result));elseconsole.error(error);
})

批量请求

可以允许将多个请求放入队列,并一次执行。

注意:批量请求并不会更快,在某些情况下,同时发起多个异步请求,也许更快。这里的批量请求主要目的是用来保证请求的串行执行。

var batch = web3.createBatch();
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2));
batch.execute();

web3.js中的大数处理

如果是一个数据类型的返回结果,通常会得到一个BigNumber对象,因为Javascript不能正确的处理BigNumber,看看下面的例子:

"101010100324325345346456456456456456456"
// "101010100324325345346456456456456456456"
101010100324325345346456456456456456456
// 1.0101010032432535e+38

所以web3.js依赖 BigNumber Library <https://github.com/MikeMcl/bignumber.js>_ 。

var balance = new BigNumber('131242344353464564564574574567456');
// or var balance = web3.eth.getBalance(someAddress);balance.plus(21).toString(10); // 转化为字符串
// "131242344353464564564574574567477"

下一个例子中,我们会看到,如果有20位以上的浮点值,仍会导致出错。所以推荐尽量让帐户余额以wei为单位,仅仅在需要向用户展示时,才转换为其它单位。

var balance = new BigNumber('13124.234435346456466666457455567456');balance.plus(21).toString(10); // toString(10) converts it to a number string, but can only show upto 20 digits
// "13145.23443534645646666646" // your number will be truncated after the 20th digit

Web3.js 0.2x.x API 手册

  • 主对象 web3

    • web3
    • web3.version
    • web3.isConnected
    • web3.setProvider
    • web3.currentProvider
    • web3.reset
    • web3.sha3
    • web3.toHex
    • web3.toAscii
    • web3.fromAscii
    • web3.toDecimal
    • web3.fromDecimal
    • web3.fromWei
    • web3.toWei
    • web3.toBigNumber
    • web3.isAddress
  • 网络对象 net
    • web3.net.listening
    • web3.net.peerCount
  • 以太坊交互对象 eth
    • web3.eth.defaultAccount
    • web3.eth.defaultBlock
    • web3.eth.syncing
    • web3.eth.isSyncing
    • web3.eth.coinbase
    • web3.eth.mining
    • web3.eth.hashrate
    • web3.eth.gasPrice
    • 帐户列表 accounts
    • 区块号 blockNumber
    • web3.eth.register
    • web3.eth.unRegister
    • 余额 getBalance
    • web3.eth.getStorageAt
    • web3.eth.getCode
    • 区块 getBlock
    • web3.eth.getBlockTransactionCount
    • web3.eth.getUncle
    • 获取交易 getTransaction
    • 通过区块获取交易 getTransactionFromBlock
    • 获取交易收据 getTransactionReceipt
    • 交易数量 getTransactionCount
    • 发送交易 sendTransaction
    • 发送离线签名交易 sendRawTransaction
    • 签名 sign
    • 消息调用 call
    • 估算 gasLimit estimateGas
    • web3.eth.filter
    • 合约对象 contract
    • 调用合约方法 Contract Methods
    • 监听合约事件 Contract Events
    • 合约所有事件 Contract allEvents
    • web3.eth.getCompilers
    • web3.eth.compile.solidity
    • web3.eth.compile.lll
    • web3.eth.compile.serpent
    • web3.eth.namereg
    • web3.eth.sendIBANTransaction
    • web3.eth.iban
  • 数据对象 db
    • web3.db.putString
    • web3.db.getString
    • web3.db.putHex
    • web3.db.getHex
  • 通信协议对象 shh
    • 示例
    • web3.shh.post
    • web3.shh.newIdentity
    • web3.shh.hasIdentity
    • web3.shh.newGroup
    • web3.shh.addToGroup
    • web3.shh.filter

Indices and tables

  • 索引

  • 搜索页面

以太坊:Web3.js 0.20 使用说明相关推荐

  1. Web3.js 0.20.x API 中文版翻译 1

    2019独角兽企业重金招聘Python工程师标准>>> 本文首发于深入浅出区块链社区 原文链接:Web3.js 0.20.x API 中文版翻译原文已更新,请读者前往原文阅读 文档原 ...

  2. 以太坊web3.js文档翻译及说明

    这些天,为了录制以太坊DAPP开发实战课程,我准备把web3文档全部翻译一下(并做适当的补充),目前**web3.js 0.20.x 版本** 已经翻译完成,欢迎大家前往查阅. 这里还几个实用DEMO ...

  3. Web3.js 0.20.x API 中文版翻译

    文档原始链接为:https://web3.learnblockchain.cn/0.2x.x/,欢迎大家前往查阅,本文只是节选开头部分的介绍及API列表索引,以下为翻译正文: 为了开发一个基于以太坊的 ...

  4. 以太坊Web3.js开发基础

    简介 web3.js是一个通过RPC调用和本地以太坊节点进行通信的js库.web3.js可以与任何暴露了RPC接口的以太坊节点连接 .web3中提供了eth对象 - web3.eth来与以太坊区块链进 ...

  5. 以太坊Solidity发布0.8.3版本

    官方消息,以太坊Solidity发布0.8.3版本.官方表示,一个错误修复版本,修复了优化器如何处理Keccak256操作码的一个重要错误.此外,它还包括对优化器的两个改进. 文章链接:https:/ ...

  6. 8支团队正在努力构建下一代以太坊Ethereum 2.0

    "我们不想在构建 Ethereum 2.0时重新造轮子." 谈到开发人员为 Ethereum 区块链进行两个独立的升级(一个称为 Ethereum 2.0,另一个称为 Ethere ...

  7. 8支团队正在努力构建下一代区块链以太坊Ethereum 2.0

    2019独角兽企业重金招聘Python工程师标准>>> "我们不想在构建 Ethereum 2.0时重新造轮子." 谈到开发人员为 Ethereum 区块链进行两 ...

  8. SIP.js 0.20.0版本简单Demo

    SIP.js的0.20.0版本是使用typescript开源的JavaScript库 首先从npm上加载SIP.js npm install sip.js 可以根据习惯使用ts或js来开发 <s ...

  9. 以太坊PHP离线交易签名生成,以太坊web3.sendRawTransaction离线签名交易

    工作中需要复现短地址攻击和thedao重入攻击,重入攻击可以直接通过eth.sendTransaction和remix来发送交易,但是短地址攻击由于钱包和remix这些都对input做了长度检测,无法 ...

最新文章

  1. 什么样的数学问题可以“下金蛋”?
  2. 大数据与 AI 生态中的开源技术总结
  3. 微型统计分析系统README
  4. C++ assert() 详解
  5. Linux下两种TCP网络服务器实现方式:循环服务并发服务
  6. osea/ 5.0-6.0
  7. linux 使用apidoc 生成Restful web Api文档
  8. 网站运营活动策划方案模板
  9. hrbusrt 1900 权限问题
  10. json转xml、xml转json
  11. 阿里云 vs Azure-大数据
  12. 微信公众号做淘宝优惠券找券查券搜券和返利机器人的详细配置教程
  13. 更改适配器设置无法和计算机连接,win10系统更改适配器没有无线网络连接的设置技巧...
  14. 深圳第一职业技术学校计算机分数线,2018年深圳第一职业技术学校第一批中招录取分数线:382分...
  15. Git, GitHub使用记录
  16. android usb充电电流,留心手机充电电流大小,别等到“机毁人伤”时才后悔!
  17. 华为在发布会带来了harmonyos,Mate 40发布会彩蛋!华为智选智能摄像头Pro发布
  18. git总结:如何从master分支创建自己的分支
  19. 【数据结构和算法】2谈谈算法
  20. C语言递归函数——汉诺塔问题笔记

热门文章

  1. 【DDD设计】 Domain model VS DAL Entity VS Presentation DTO
  2. 岛屿问题 通用解-463.岛屿周长-200.岛屿数量-695.岛屿的最大面积-827.最大人工岛
  3. 使用BULK INSERT高效导入大量数据到SQL Server数据库
  4. 传智播客西安中心之Android课程大纲
  5. 淘宝天猫店铺商品API,店铺商品分类接口代码对接教程
  6. 【论文分享】★★★「SOTA」小样本图神经网络分类模型 HGNN:Hybrid Graph Neural Networks for Few-Shot Learning
  7. android 触摸 唤醒屏幕,android 唤醒和解锁屏幕
  8. linux cat命令缩写,linux下cat命令详解
  9. cad添加自己线性_如何在CAD图纸中进行线性标注
  10. vue axios请求成功进入catch原因