Есть ли известная проблема с анализом событий, содержащих строки, в 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, не сталкиваясь с этой ошибкой?
Я видел это, когда мой блокчейн не был полностью синхронизирован. Контракт ожидал, что будет возвращена строка, но, поскольку эта строка еще не была установлена, он возвращал значение null, которое взорвется при синтаксическом анализе.
Я считаю, что то же самое может произойти при указании адреса, который на самом деле не реализует этот API. Если резервная функция не возвращает строку, у вас возникнут проблемы с разбором строки.
Просто убедитесь, что ваш блокчейн синхронизирован, и вы указываете правильный аккаунт.
new BigNumber() not a base 16 number
ошибке.Это воспроизводимая ошибка в web3.js.
Из проблемы Github:
Ошибка BigNumber() не является числовой ошибкой с основанием 16, которая может возникать во многих случаях, но причины не обязательно одни и те же. Я считаю, что проблема исходного сообщения связана с использованием событий, которые индексируют «строковые» типы, с которыми я также сталкиваюсь. Если мое событие контракта помечает тип «строка» как «индексированный», я получаю ту же ошибку. Но если я ограничу ключевое слово «индексированное» только типом «адрес», я в порядке. Я пытаюсь найти документацию о том, какие типы данных можно «индексировать» в событии контракта, но безрезультатно. Я чувствую, что все, что можно проанализировать как число (адрес, целые числа и т. д.), может быть в порядке. Я не думаю, что синхронизация блокчейна является проблемой здесь.
Поэтому попробуйте удалить все индексы для строковых полей в определении события, пока они не исправят ошибку.
Хадсон Джеймсон
bytes
из события. Пожалуйста, создайте отчет об ошибке в следующем репо - github.com/ethereum/web3.js/issuesконфиденциальностьisahumanright.eth