建什么网站赚钱,网站域名dns,最新军事动态,品牌网站建设专业定制web3.js
Web3 JavaScript app APIweb3.js是一个JavaScript API库#xff0c;一般使得DApp在以太坊上运行web3.js通过RPC调用与本节点通信#xff0c;用于任何暴露了RPC层的以太坊节点之间通信web3包含了eth对象#xff0c;即web3.eth#xff08;专门和以太坊区块链交互一般使得DApp在以太坊上运行web3.js通过RPC调用与本节点通信用于任何暴露了RPC层的以太坊节点之间通信web3包含了eth对象即web3.eth专门和以太坊区块链交互和shh对象即web3.shh用于和Whisper交互,消息传递
DEV模式的私有链
在myDevChain文件夹下面搭建了私有链使用命令启动私有链geth --datadir . --networid 15 console 2output.log输入web3即可查看关于web3的相关组件比如bzz、dp操作数据库的一般是mongdb)、eth等等
web3模块加载
新建一个文件夹使用命令cnpm init初始化初始化完成之后会生成一个package.json的包管理文件然后安装指定的web3模块的版本首先需要将web3模块安装在项目中,使用命令如下--save-dev是将环境添加到开发环境的依赖中去
cnpm install web30.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 InterfaceABI创建一个JavaScript对象用来在js代码中描述函数functions type函数类型默认是“function”也可能是“constructor”constant、payable和stateMutability:函数的状态是可变性inputs、outputs函数输入、函数输出参数描述列表事件events type类型总是“event”inputs输入对象的列表包括name、type和indexed使用 在web3文件夹下面创建合约文件夹mkdir contractcd 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其余的连接方式--ws8546端口推荐、ipcdisable方式进程之间调用 使用命令启动区块链之后会在当前目录下面生成geth.ipc文件。命令为 geth --datadir /Users/chy/Desktop/myeth/chaindata --rpc --networkid 6666 console 2output.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()命令 注意
ctrlL清屏web3不同的版本之间命令发生了变化。需要看官方的文档
相关命令
web3.eth.getBlock(2) //2是区块的位置会显示相关的信息但是其包含的交易只显示哈希值web3.eth.getBlock(2true) //2是区块的位置会显示相关的更加具体的信息包括其中交易的哈希值