web3.js提供了用于和geth通信的JavaScript API。它内部使用JSON-RPC与geth通信。web3.js还可以与所有种类的、支持JSON-RPC的以太坊节点通信。它把所有JSON- RPC API当作JavaScript API,也就是说,它不仅支持所有与以太坊相关的API,还支持与Whisper和Swarm相关的API。

随着不同项目的创建,我们会越来越了解web3.js。目前我们先来看一些最常用的web3.js API,然后使用web3.js创建一个所有权智能合约前端。

在写本书时,web3.js的最新版本是0.16.0。本章所述内容也是这个版本。

web3.js托管在https://github.com/ethereum/web3.js ,完整文档在https://github.com/ethereum/wiki/wiki/JavaScript-API 。

4.1.1 导入web3.js

为了在node.js中使用web3.js,可以在项目目录中运行npm install web3,且在源代码中可以使用“require("web3");”导入它。

为了在客户端JavaScript使用web3.js,可以使web3.js文件入队,该文件可以在项目源代码的dist目录中找到。现在,Web3对象对全局可用。

4.1.2 连接至节点

web3.js可以与使用HTTP或者IPC的节点通信。我们将使用HTTP与节点建立通信。web3.js允许与多个节点建立连接。一个web3实例代表与节点的一个连接。该实例公开了API。

当在Mist中运行一个App时,它自动使一个连接到mist节点的web3实例可用。实例变量名是web3。

为了连接到节点所使用的基础代码如下:

首先,通过检查web3是否是undefined,来确定代码是否在Mist中运行。如果web3被定义了,则使用已 经可用的实例;否则,通过连接至自定义节点创建一个实例。如果无论App是否在Mist中运行都连接到自定义节点,则从程序代码中删除if。这里假设自定 义节点在8545端口本地运行。

Web3.providers对象使用多种协议显示构造函数(在此称为providers),以建立连接和传输信息。 Web3.providers.HttpProvider允许建立HTTP连接,Web3.providers.IpcProvider允许建立IPC连 接。

web3.currentProvider属性被自动分配给当前的provider实例。在创建web3实例之后,可使用web3.setProvider()方法改变provider。它有一个实参,即新provider的实例。

记住:geth默认禁用HTTP-RPC。所以在运行geth时通过--rpc选项以使用HTTP-RPC。HTTP-RPC默认在8545端口运行。

web3显示isConnected()方法,可用于查询是否已经与节点连接。根据连接状态的不同,返回true或者false。

4.1.3 API结构

web3包含一个eth对象(web3.eth),专门用于以太坊区块链交互;还包含一个shh对象(web3.shh),用于whisper交互。web3.js的大部分API都在这两个对象中。

所有API都是默认同步的。如果想发出异步请求,可以把一个可选回调函数作为最后的参数传送给大多数函数。所有回调函数都采用错误优先(error-first)回调方式。

一些API对于异步请求采用别名。例如web3.eth.coinbase()是同步的,web3.eth.getCoinbase()是异步的。示例如下:

getBlock使用区块序号或者哈希值获取区块信息。或者,它可以使用一个字符串,例如"earliest"(创世 区块)、"latest"(区块链最上面的区块)或者"pending"(正在挖的区块)。如果不传送实参,则默认是 web3.eth.defaultBlock,默认分配"latest"。

所有需要区块身份证明作为输入的API可以用序号、哈希值或者一个可读字符串作为输入。如果值未通过,则这些API默认使用web3.eth.defaultBlock。

4.1.4 BigNumber.js

JavaScript本质上对于正确处理大数字不在行。因此,需要处理大数字和进行完美计算的应用会使用BigNumber.js库。

web3.js还依赖于BigNumber.js,且自动进行加载。web3.js总是对序号值返回BigNumber对象。它可以用JavaScript数字、数字字符串和BigNumber实例作为输入,示例如下:

这里使用web3.eth.getBalance()方法获取地址余额,该方法返回一个BigNumber对象。需要在BigNumber对象上调用toString(),把它转换成数字字符串。

BigNumber.js不能正确处理有超过20个浮点数位的大数字,因此推荐以wei为单位存储余额,在显示时再转换成其他单位。web3.js自身总是以wei为单位返回和调取余额。例如,getBalance()方法以wei为单位返回该地址的余额。

4.1.5 单位转换

web3.js提供了把wei余额转换成任何其他单位和把任何其他单位余额转换成wei的API。

web3.fromWei()方法用于将wei转换成其他单位,而web3.toWei()方法用于将以其他单位表示的数字转化成以wei为单位的数字。示例如下:

第一行代码将wei转换为ether;第二行代码将ether转换为wei。方法中的第二个实参可以是以下字符串之一:

·kwei/ada

·mwei/babbage

·gwei/shannon

·szabo

·finney

·ether

·kether/grand/einstein

·mether

·gether

·tether

4.1.6 检索gas价格、余额和交易细节

让我们看看API如何检索gas价格、地址余额和交易信息:

上述方法的执行过程如下:

·web3.eth.gasPrice()。由x个最新区块的gas价格中位数决定gas价格。

·web3.ethgetBalance()。返回任何给定地址的余额。所有web3.js API哈希地址应当是十六进制的字符串,而不是十六进制的文字。solidity地址类型的输入也应当是十六进制的字符串。

·web3.eth.getTransactionReceipt()。用于获取交易使用其哈希的细节。如果在区块链中发现交易,则返回交易收据对象;否则,返回null。交易收据对象包含下列属性:

·blockHash。该交易所在区块的哈希地址。

·blockNumber。该交易所在区块的序号。

·transactionHash。交易哈希。

·transactionIndex。区块中交易索引位置的整数部分。

·from。发起人地址。

·to。接收者地址;如果是合约创建交易,则为null。

·cumulativeGasUsed。在区块中执行该交易时使用的gas总量。

·gasUsed。这个特定交易独自使用的gas量。

·contractAddress。如果交易是合约创建,表示被创建的合约地址;否则,为null。

·logs。该交易生成的日志对象数组。

4.1.7 发送以太币

让我们看看如何向任意地址发送以太币。为了发送以太币,需要使用 web3.eth.sendTransaction()方法。该方法可用于发送任意种类的交易,但主要用于发送以太币,原因是使用这种方法部署合约或者调 用合约方法比较麻烦——它要求生成交易数据而不是自动生成交易数据。该方法的交易对象包含下列属性:

·from。发送账户的地址。如未标明,使用web3.eth.defaultAccount属性。

·to。可选项。信息目的地的地址,对于合约创建交易,该项未定义。

·value。可选项。通常在转账中单位为wei(在合约创建交易情况下,作为合约的资金注入,单位也是wei)。

·gas。可选项。交易使用的gas量(未使用的gas被退回)。如果不提供,则自动决定该项。

·gasPrice。可选项。交易中以wei为单位的gas价格,默认为网络平均gas价格。

·data。可选项。它或者是包含信息相关数据的字节字符串,或者是初始代码(在合约创建交易情况下)。

·nonce。可选项。它是个整数。每一个交易都有一个相关计数nonce。该数字表示交易发起人发送的交易数量。如 果未提供nonce,则自动确定。它的作用是防止重播攻击。nonce不是与挖区块相关的那个随机数。如果使用的nonce大于交易应当有的nonce, 则交易被放入一个队列直到其他交易数量到达。例如,如果下一个交易的nonce应该是4,而nonce被设为10,则geth在广播这个交易之前将等待之 间的6个交易。nonce为10的交易称为排队交易,而不是待定交易。

向一个地址发送以太币的示例如下:

这里从账户0向账户1发送一个以太币。在运行geth时,确保使用unlock选项解锁两个账户。在geth交互接口 上,提示输入密码,但是如果账户被锁定,交互接口以外的web3.js API将返回error。这个方法返回交易哈希。然后可以使用getTransactionReceipt()方法检查是否挖出了交易。

还可以用web3.personal.listAccounts()、web3.personal.unlockAccount(addr,pwd)和web3.personal.newAccount(pwd)实时管理账户。

4.1.8 处理合约

让我们学习如何部署一个新合约、如何使用一个已部署合约的地址获取其引用、如何向合约发送以太币、如何发送交易以调用合约的函数(方法),以及如何估算一个函数调用的gas。

若要部署一个新合约或者获取一个已部署合约的引用,首先需要使用web3.eth.contract()方法创建一个合约对象。该方法以合约ABI作为一个实参,并返回合约对象。

创建合约对象的代码如下:

有了合约之后,可以使用合约对象的新方法部署它,或者使用at方法获取与ABI匹配的、一个已部署合约的引用。

部署合约的示例如下:

其中,new方法的调用是异步的,所以如果成功创建和广播交易,回调函数将被调用两次。第一次,广播交易之后调用它; 第二次,挖出交易之后调用它。如果不提供回调函数,则proof变量的address属性被设成undefined。挖出交易之后,address属性将 被设置。

在proof合约中,没有构造函数,但是如果有构造函数,则构造函数实参应当放在new方法的开头。传送的对象包含 from地址、合约字节码和使用的gas上限。这三个属性必须存在,否则无法创建交易。该对象可以有被传送给sendTransaction方法的对象所 展示的属性,但是这里,data是合约字节码,且to属性被忽略。

可以用at方法引用一个已经部署的合约。相关代码如下:

现在让我们看看如何发送交易以调用合约方法。相关代码如下:

这里调用方法同名对象的sendTransaction方法。被传送给这个sendTransaction方法的对象属性与web3.eth.sendTransaction()相同,只是data和to属性被忽略了。

如果想调用节点本地的方法,而非创建交易并广播,则可使用call而非sendTransaction。示例如下:

有时必须发现找到调用方法所需的gas,这样可以决定是否调用。web3.eth.estimateGas可用于此目的。然而,直接使用web3.eth.estimateGas()要求生成交易,因此可以使用方法同名对象的estimateGas()方法。示例如下:

如果只想发送一些以太币到合约,而不调用任何方法,则可以使用web3.eth.sendTransaction方法。

4.1.9 检索和监听合约事件

现在让我们看看如何监听一个合约事件。监听事件很重要,因为通过交易调用方法的结果通常是以触发事件的形式返回的。

在了解如何检索和监听事件之前,我们需要学习事件的索引参数。一个事件最多有三个参数可以有被索引(indexed)属性。该属性用于提示节点对它进行索 引,这样应用客户端可以用匹配返回值来检索事件。如果不使用indexed属性,则必须检索所有事件,并筛选出需要的那些事件。例如,可以这样编写 logFileAddedStatus事件:

下面是给出了监听合约事件的一个示例:

上述代码的执行过程如下:

1)调用一个合约实例的事件同名的方法获取事件对象。该方法用两个对象作为实参,用于筛选事件:

·第一个对象用索引返回数值筛选事件。例如,{'valueA':1,'valueB':[myFirstAddress,mySecondAddress]}。所有筛选数值都默认设置为null。这意味着它们将匹配该合约发出的任意类型事件。

·第二个对象可以包含三个属性,即fromBlock(搜索起始区块,默认为"latest")、toBlock(搜索截至区块,默认为"latest")和address(仅获取日志的地址列表;默认为合约地址)。

2)事件对象显示三种方法:get、watch和stopWatching。get用于获取区块范围内的所有事件。watch与get类似,但是它在获取事件后还监听变化。stopWatching可以用于停止监听变化。

3)合约实例的allEvents方法用于检索合约的所有事件。

4)每一个事件由一个包含下列属性的对象代表。

·args。一个带有来自事件的实参的对象。

·event。用一个字符串表示事件名。

·logIndex。用一个整数表示区块中的日志索引位置。

·transactionIndex。用一个整数表示日志最初的交易索引位置。

·transactionHash。用一个字符串表示日志最初的交易哈希。

·address。用一个字符串表示日志最初的地址。

·blockHash。用一个字符串表示日志所在区块的哈希。如待定,则为null。

·blockNumber。日志所在区块的序号。如待定,则为null。

web3.js提供web3.eth.filter API以检索和监听事件。用户可以使用这个API,但是处理事件的Event方法更简便。要想学习更多内容,请访问https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter 。

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=565

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })(); '); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

4.1 web3.js概述相关推荐

  1. 【区块链】以太坊Solidity编程:合约调用与web3.js

    以太坊Solidity编程:合约调用与Web3.js 合约部署方法 合约的编译 使用浏览器编译器Remix 使用truffle编译,目前是最常用的编译方式 Solc或者Web3.js编译合约,使用相对 ...

  2. 【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端

    概述 web3.js内部使用JSONRPC与geth通信.它把所有JSON-RPC API当作JavaScript API,也就是说,它不仅支持所有与以太坊相关的API,还支持与Whisper和Swa ...

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

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

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

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

  5. 【以太坊】web3.js的1.0版本和0.2.0版本的安装及区别

    一.前言 博主在安装web3.js的时候,偶然间安装了不同版本的web3.js,API操作也不相同,虽然都能达到目标,但是到底区别在哪呢?网上查找半天并没有人专门总结一下这块,所以今天斗胆总结一下,也 ...

  6. 使用web3.js进行开发

    参考地址:here and here 零.在私有链上部署合约 // 本文中用到的MetaCoin合约 pragma solidity ^0.4.2;contract MetaCoin {mapping ...

  7. 如何用web3.js在以太坊区块链上保存数据?

    2019独角兽企业重金招聘Python工程师标准>>> 虽然有北大博士讲,95%的区块链项目都没有前途,但我们知道区块链还是有它的优势,比如数据的不可篡改性对于版权保护有相当大的意义 ...

  8. Web3.js 学习

    web3.js Web3 JavaScript app API web3.js是一个JavaScript API库,一般使得DApp在以太坊上运行 web3.js通过RPC调用与本节点通信,用于任何暴 ...

  9. 向别人网页注入js_区块链研究实验室 | Web3 .js基于以太坊的Javascript API

    web3.js是一个库集合,你可以使用HTTP或IPC连接本地或远程以太它节点进行交互. web3的JavaScript库能够与以太坊区块链交互. 它可以检索用户帐户,发送交易,与智能合约交互等. V ...

最新文章

  1. 一款DIY矢量网络分析仪:NanoVNA
  2. CFileDialog的使用方法简单介绍
  3. mysql 创建师徒_mysql基础整理
  4. 【Java自顶向下】试手小公司,面试官问我ConcurrentHashMap,我微微一笑……
  5. GPU上的相似性检查(PNSR和SSIM)
  6. SQL注入漏洞全接触--高级篇
  7. day05【后台】菜单维护
  8. 注册flash.ocx inno setup (转)
  9. 获取文本上每个字符出现的次数并保留在map中,再将map中的数据写入文件
  10. table函数--Matplotlib
  11. mysql with roll up_GROUP BY...WITH ROLL UP 分组统计后的再合计
  12. python epub转txt_怎么将很多个TXT合并成epub?
  13. 数据库可视化软件:Navicat系列
  14. 纯干货,用好PPT中的异形,提高页面的设计感,建议收藏!
  15. 百度地图开放平台web api 获取上海市所有小区信息
  16. word文档打破折号
  17. SpringBoot项目遇到AopAutoConfiguration matched: - @ConditionalOnProperty (spring.aop.auto=true)错误
  18. Kali Linux 2022新版发布
  19. python发送soap报文_使用Python将带附件的XML发送到SOAP ws
  20. scons构建mdk工程

热门文章

  1. 解决GitHub文件无法下载的问题
  2. OpenCV单目视觉定位实现方法
  3. 弹性均质圆环法计算过程_第十章盾构隧道衬砌计算方法综述.ppt
  4. 啥前浪后浪的,一行代码下载B站等全网视频!
  5. linux查询用户执行过的命令,linux纪录系统用户执行过的命令
  6. java 23种设计模式
  7. 写给设计师的移动页面适配知识
  8. 破解linux root密码(方式 重置root密码)
  9. css+js实现三维空间图片旋转,炫酷旋转
  10. 使用openfiler配置iSCSI存储并挂载