Web3.js的学习(2)
Web3.js的学习(2)
常用API-基本信息查询
Web3通用工具方法
Web账户相关
区块相关信息查询
交易相关
消息调用
消息调用就是调用那些不改变状态的合约函数,此时不使用交易调用而应该使用消息调用
日志过滤
小例子:
-
检测出块-latest
Node下
geth控制台下,启动挖矿:
Node下收到消息:
-
检测交易-pending
geth控制台下发起一个交易:
pending只管当前在pending的交易,至于之后交易是否进块是不管的。
合约相关
部署合约实例:
合约内容(C就是一个简单的更新余额的合约,D合约可以不看,这里使用的也是c合约):
var Web3 = require('web3') //引入
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')) //创建对象
var abi = [{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
var binData = '0x' + '608060405234801561001057600080fd5b5061015f806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327e235e31461005157806382ab890a146100a8575b600080fd5b34801561005d57600080fd5b50610092600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506100d5565b6040518082815260200191505060405180910390f35b3480156100b457600080fd5b506100d3600480360381019080803590602001909291905050506100ed565b005b60006020528060005260406000206000915090505481565b806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505600a165627a7a72305820f53a984234b2bc55c9abf6a21d2129c609ca27a289988a1832a4513610af648d0029'
var MyContract = web3.eth.contract(abi)
var contractInstance = MyContract.new({data:binData, from:web3.eth.accounts[0], gas:90000})
console.log(contractInstance)
abi和字节码都是通过solcjs编译合约得到(详细可看第一节-Web3.js的学习(1)):
solcjs --bin demo.sol
和 solcjs --abi demo.sol
注意点:二进制的字节码前面要加上0x前缀!,账户需要解锁,不然报错:
gas不能太大超过区块的总gas,不然报错:
gas不能太小,不足以发布合约:
调整适当的gas后成功得到合约对象:
检查日志文件:
与返回的交易hash是一样的。
但是合约未入块,所以还没有地址。
挖矿后,查询地址:
调用合约
注意: 只有被写到区块链中的合约才能够调用。否则会显示无此函数。
实例:采用第一种自动决定函数类型调用方式:
因为这个函数是view,所以是call调用,不会产生任何交易记录。与call调用无差别:
使用sendTransaction调用update函数:
因为是改变状态,所以一定需要发起交易。可以在log中查看到发布的交易号是对应的:
注意:函数的调用都需要指明from,否则会报错invalid address!,时刻检查账户是否被锁上了,有时候调用函数一直undefind,可能就是时间过长账户又被锁上了。
挖矿,交易写入区块。
最后检查余额:
监听合约事件
原来的合约中没有定义event事件,所以先修改下合约内容,然后重新部署到区块链上。
pragma solidity >=0.4.0;
contract C{
event ChangeBalance(address indexed who, uint indexed value);
mapping(address=>uint) public balances;
function update(uint _value) public {
balances[msg.sender] = _value;
emit ChangeBalance(msg.sender, _value);
}
}
监听的是latest,当挖矿开始时,就会返回数据:
推荐阅读
-
Servlet学习:(一)使用IDEA搭建一个简易的servlet程序
-
Web3.js的学习(2)
-
ASP.net网站性能提高办法 无意中从网上浏览到了一篇提高网站性能的帖子转来学习下。 博客分类: asp.net开发ASP.net网站性能提高办法 asp.net多线程
-
分享一个It学习的好网站itsoku 博客分类: cjava javacjqueryaspsql
-
32位应用程序如何使用大于2GB的内存?
-
使 32 位程序使用大于 2GB 的内存
-
cleanCode[2]:函数编写的几大规则
-
postman学习测试心得之接口测试报告的导出(重要)
-
Leetcode的第2题,持续改进算法到cleancode
-
基于SpringMVC的Java Web学习笔记01 - 下载jar 博客分类: 开发技术 webjar