Синхронные запросы не поддерживаются провайдером IPC

Я пытался подключиться к своему узлу через 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 я получаю сообщение об ошибке. Любая помощь?

Ответы (1)

Кажется, что 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(), выдаю ошибку.
Только что отредактировал мой ответ, согласно документации Web3 об обратном вызове, сигнатура метода - функция (ошибка, результат);