Я пытался подключиться к своему узлу через IPC, используя web3_ipc
. Но меня поразило:
You tried to send "eth_getBalance" synchronously. Synchronous requests are not supported by the IPC provider.
Мой код такой:
var web3_extended = require('web3_ipc');
var path = require('path');
var absolutePath = path.relative('./','/home/pr.singh/.ethereum/geth.ipc');
var options = {
host : absolutePath,
// host: 'http://10.10.23.139:8013',
ipc : true,
personal: true,
admin: true,
debug: false
};
var web3 = web3_extended.create(options);
exports.checkBalance = function(req, res) {
var bal = req.body.balance;
var accountBalance=web3.eth.getBalance(bal).toNumber();
console.log(accountBalance);
}
Если я подключаюсь с помощью rpc, все работает хорошо, но при подключении через IPC я получаю сообщение об ошибке. Любая помощь?
Кажется, что IPC не поддерживает синхронный вызов, который имеет смысл с точки зрения неблокирующего выполнения кода в такой архитектуре. Metamask имеет такое же ограничение.
В любом случае, на мой взгляд, хорошей практикой является использование асинхронного вызова с методом обратного вызова: вы можете напрямую передать функцию обратного вызова в вызове Web3:
exports.checkBalance = function(req, res) {
var bal = req.body.balance;
web3.eth.getBalance(bal, function(error, result) {
// This is executed once I got the response
console.log("Response received");
if(error != null) {
console.error(error);
return;
}
var accountBalance = result.toNumber();
console.log(accountBalance);
});
// This is executed just after the request is sent no matter the response
console.log("Request sent");
}
Или для лучшего повторного использования определите функцию обратного вызова и введите ее в качестве параметра:
exports.checkBalance = function(req, res) {
var bal = req.body.balance;
web3.eth.getBalance(bal, exports.checkBalanceCallback);
}
exports.checkBalanceCallback = function(error, result) {
if(error != null) {
console.error(error);
return;
}
var accountBalance = result.toNumber();
console.log(accountBalance);
}
РЕДАКТИРОВАТЬ: только что отредактировал мой ответ, согласно документации Web3 об обратном вызове, сигнатура метода - функция (ошибка, результат);
Прашант Прабхакар Сингх
result
значение null и, следовательноresult.toNumber()
, выдаю ошибку.Грег Джинмарт