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,當挖礦開始時,就會傳回資料: