References: https://github.com/ethereum/wiki/wiki/JavaScript-API
Version to use: 0.20.6 (don't use 1.0 yet, breaking changes, beta, without documentation) Install specifically 0.20.6 version
const Web3 = require('web3')
Check what providers are provided
Web3.providers
{ HttpProvider: [Function: HttpProvider],
IpcProvider: [Function: IpcProvider] }
const net = require('net')
const web3 = new Web3(new Web3.providers.IpcProvider('/home/bing/.ethereum/testnet/geth.ipc', net))
web3.version
{ api: '0.20.6',
node: [Getter],
getNode: { [Function: get] request: [Function: bound ] },
network: [Getter],
getNetwork: { [Function: get] request: [Function: bound ] },
ethereum: [Getter],
getEthereum: { [Function: get] request: [Function: bound ] },
whisper: [Getter],
getWhisper: { [Function: get] request: [Function: bound ] } }
Check if we are connected & ontain some information from the node
// web3.version.node - this would throw error in IPC, only async version works
var lastData
function cb (error, data){
if (error) {
console.log("ERROR:"+JSON.stringify(error))
} else {
console.log(data)
lastData = data
}
}
web3.version.getNode(cb)
Geth/v1.8.16-stable-477eb093/linux-amd64/go1.10.1
So when calling remotely via IPC don't use synchronous getter
web3.eth.getBlockNumber(cb)
4111119
web3.eth.getSyncing(cb) // it's not syncing, because it's a light client, and it still works!
false
var mainTest = "0x30514f8346771d10D8C74f873AbfC4050FB17aCB" // my main test account address
var vscTokenAddr = "0xf5e888afb9d545300070887af6261f5c8f7a007c"
var oneTxHash = "0x84bc81372d3500a871486c6b7651905521d10e62d7cc3ddacadc3e4aafd6853a"
var oneTxBlock = 3397473
var oneTxFrom = "0x627306090abab3a6e1400e9345bc60c78a8bef57"
var oneTxTo = "0x30514f8346771d10d8c74f873abfc4050fb17acb"
var vscAbi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initialSupply","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]
var vscContract = web3.eth.contract(vscAbi)
var vscContractDeployedInst = vscContract.at(vscTokenAddr)
web3.eth.getBalance(mainTest,undefined,cb)
BigNumber { s: 1, e: 19, c: [ 414234, 2526400291376 ] }
lastData.toString()
'41423402526400291376'
var options = {
fromBlock: oneTxBlock-1,
toBlock: oneTxBlock+1,
address: vscTokenAddr
}
var filter = web3.eth.filter(options)
filter.get(cb)
Filter {
requestManager:
RequestManager {
provider:
IpcProvider {
responseCallbacks: [Object],
path: '/home/bing/.ethereum/testnet/geth.ipc',
connection: [Object],
lastChunk: null },
polls: {},
timeout: null },
options:
{ topics: [],
from: undefined,
to: undefined,
address: '0xf5e888afb9d545300070887af6261f5c8f7a007c',
fromBlock: '0x33d760',
toBlock: '0x33d762' },
implementation:
{ newFilter: { [Function: send] request: [Function: bound ], call: [Function: newFilterCall] },
uninstallFilter: { [Function: send] request: [Function: bound ], call: 'eth_uninstallFilter' },
getLogs: { [Function: send] request: [Function: bound ], call: 'eth_getFilterLogs' },
poll: { [Function: send] request: [Function: bound ], call: 'eth_getFilterChanges' } },
filterId: '0x817e8e23a867f821267d493afe747cf9',
callbacks: [],
getLogsCallbacks: [],
pollFilters: [],
formatter: [Function: outputLogFormatter] }
[ { address: '0xf5e888afb9d545300070887af6261f5c8f7a007c',
topics:
[ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57',
'0x00000000000000000000000030514f8346771d10d8c74f873abfc4050fb17acb' ],
data: '0x000000000000000000000000000000000000000000000000257853b1dd8e0000',
blockNumber: 3397473,
transactionHash: '0x84bc81372d3500a871486c6b7651905521d10e62d7cc3ddacadc3e4aafd6853a',
transactionIndex: 5,
blockHash: '0x08debcb7aec26474114c63681c947f99ece819796417b74aadec42a8c5177de5',
logIndex: 21,
removed: false } ]
lastData
[ { address: '0xf5e888afb9d545300070887af6261f5c8f7a007c',
topics:
[ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57',
'0x00000000000000000000000030514f8346771d10d8c74f873abfc4050fb17acb' ],
data: '0x000000000000000000000000000000000000000000000000257853b1dd8e0000',
blockNumber: 3397473,
transactionHash: '0x84bc81372d3500a871486c6b7651905521d10e62d7cc3ddacadc3e4aafd6853a',
transactionIndex: 5,
blockHash: '0x08debcb7aec26474114c63681c947f99ece819796417b74aadec42a8c5177de5',
logIndex: 21,
removed: false } ]
lastData[0].address === vscTokenAddr &&
lastData[0].blockNumber === oneTxBlock &&
lastData[0].transactionHash === oneTxHash
true
console.log(web3.sha3('VscPurchase(address,address,uint256,uint256)'))
console.log(web3.sha3('Transfer(address,address,uint256)'))
0xb29a1ebb2cc4c2f224e1f61fbd81a023813c1eec8955b1ec1b6a3b339fea8ba3
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
var transferEventFilter = vscContractDeployedInst.Transfer({},{
fromBlock: oneTxBlock-1,
toBlock: oneTxBlock+1,
})
transferEventFilter.options // see what's the actual options like
{ topics:
[ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
null,
null ],
from: undefined,
to: undefined,
address: '0xf5e888afb9d545300070887af6261f5c8f7a007c',
fromBlock: '0x33d760',
toBlock: '0x33d762' }
transferEventFilter.get(cb)
Filter {
requestManager:
RequestManager {
provider:
IpcProvider {
responseCallbacks: [Object],
path: '/home/bing/.ethereum/testnet/geth.ipc',
connection: [Object],
lastChunk: null },
polls: {},
timeout: null },
options:
{ topics:
[ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
null,
null ],
from: undefined,
to: undefined,
address: '0xf5e888afb9d545300070887af6261f5c8f7a007c',
fromBlock: '0x33d760',
toBlock: '0x33d762' },
implementation:
{ newFilter: { [Function: send] request: [Function: bound ], call: [Function: newFilterCall] },
uninstallFilter: { [Function: send] request: [Function: bound ], call: 'eth_uninstallFilter' },
getLogs: { [Function: send] request: [Function: bound ], call: 'eth_getFilterLogs' },
poll: { [Function: send] request: [Function: bound ], call: 'eth_getFilterChanges' } },
filterId: '0xbf9ede0690f22424eab36db16d9aaf92',
callbacks: [],
getLogsCallbacks: [],
pollFilters: [],
formatter: [Function: bound ] }
[ { address: '0xf5e888afb9d545300070887af6261f5c8f7a007c',
blockNumber: 3397473,
transactionHash: '0x84bc81372d3500a871486c6b7651905521d10e62d7cc3ddacadc3e4aafd6853a',
transactionIndex: 5,
blockHash: '0x08debcb7aec26474114c63681c947f99ece819796417b74aadec42a8c5177de5',
logIndex: 21,
removed: false,
event: 'Transfer',
args:
{ from: '0x627306090abab3a6e1400e9345bc60c78a8bef57',
to: '0x30514f8346771d10d8c74f873abfc4050fb17acb',
value: [Object] } } ]
lastData
[ { address: '0xf5e888afb9d545300070887af6261f5c8f7a007c',
blockNumber: 3397473,
transactionHash: '0x84bc81372d3500a871486c6b7651905521d10e62d7cc3ddacadc3e4aafd6853a',
transactionIndex: 5,
blockHash: '0x08debcb7aec26474114c63681c947f99ece819796417b74aadec42a8c5177de5',
logIndex: 21,
removed: false,
event: 'Transfer',
args:
{ from: '0x627306090abab3a6e1400e9345bc60c78a8bef57',
to: '0x30514f8346771d10d8c74f873abfc4050fb17acb',
value: [Object] } } ]
lastData[0].address === vscTokenAddr &&
lastData[0].blockNumber === oneTxBlock &&
lastData[0].transactionHash === oneTxHash &&
lastData[0].event === 'Transfer' &&
lastData[0].args.from === oneTxFrom &&
lastData[0].args.to === oneTxTo &&
lastData[0].args.value.toString() === '2700000000000000000'
true
Lessens learnt: