Что означает Web3 «BigNumber не ошибка числа 16»

Есть ли известная проблема с анализом событий, содержащих строки, в Truffle/Web3?

Я использую трюфель со следующим простым контрактом

contract Board
{
    string  foo;
    event Shout();
    event TextEvent(
        string  indexed text,
        uint timestamp
    );

    function shout(string _text)
    {
        foo=_text;
        Shout();
        TextEvent(_text,now);
    }

    function getFoo() returns(string){
        return foo;
    } 
}

Когда я вызываю Shout(_), foo устанавливается правильно, и запускается событие Shout, и я могу прослушать это без каких-либо проблем.

  var board = Board.deployed();
  var shouts=board.Shout();
  shouts.watch(function(error, result){
    if (!error)
      console.log("shout",result);
  });

Однако, когда я смотрю TextEvents со следующим кодом

    var board = Board.deployed();
    var textEvent=board.TextEvent();
    textEvent.watch(function(error, result){
        console.log("callback");
        if (!error) console.log("shout",result);
    });

Я получаю следующую ошибку, которая, похоже, связана с преобразованием bytes32 в строку:

Uncaught BigNumber Error: new BigNumber() not a base 16 number:

Итак, вопрос в том, как вы можете прослушивать события, содержащие строки в Web3, не сталкиваясь с этой ошибкой?

Похоже, это ошибка в web3. Я получаю аналогичную ошибку при попытке вернуться bytesиз события. Пожалуйста, создайте отчет об ошибке в следующем репо - github.com/ethereum/web3.js/issues
Скорее всего потому, что функции парсинга была передана строка с "0x" в начале, например "0x6c3c...".

Ответы (3)

Я видел это, когда мой блокчейн не был полностью синхронизирован. Контракт ожидал, что будет возвращена строка, но, поскольку эта строка еще не была установлена, он возвращал значение null, которое взорвется при синтаксическом анализе.

Я считаю, что то же самое может произойти при указании адреса, который на самом деле не реализует этот API. Если резервная функция не возвращает строку, у вас возникнут проблемы с разбором строки.

Просто убедитесь, что ваш блокчейн синхронизирован, и вы указываете правильный аккаунт.

Это должен быть принятый ответ. Кажется, это происходит, если web3 (например) пытается связаться с контрактом, который еще не синхронизирован локально.
Добавить. Я столкнулся с этой ошибкой, потому что ABI не соответствовал контракту. Он ожидал строку и поэтому выдал ошибку.
Также хочу отметить, что это может быть вызвано даже небольшими изменениями в ABI. Я получил эту ошибку, когда забыл обновить ABI на стороне клиента, поэтому одна часть кода ожидала индексированных полей в событиях, а другая не знала о них. Это также привело к new BigNumber() not a base 16 numberошибке.

Это воспроизводимая ошибка в web3.js.

исх. https://github.com/ethereum/web3.js/issues/434

Из проблемы Github:

Ошибка BigNumber() не является числовой ошибкой с основанием 16, которая может возникать во многих случаях, но причины не обязательно одни и те же. Я считаю, что проблема исходного сообщения связана с использованием событий, которые индексируют «строковые» типы, с которыми я также сталкиваюсь. Если мое событие контракта помечает тип «строка» как «индексированный», я получаю ту же ошибку. Но если я ограничу ключевое слово «индексированное» только типом «адрес», я в порядке. Я пытаюсь найти документацию о том, какие типы данных можно «индексировать» в событии контракта, но безрезультатно. Я чувствую, что все, что можно проанализировать как число (адрес, целые числа и т. д.), может быть в порядке. Я не думаю, что синхронизация блокчейна является проблемой здесь.

Поэтому попробуйте удалить все индексы для строковых полей в определении события, пока они не исправят ошибку.