Почему вызов allEvents работает из консоли Truffle, но не из моего приложения?

Я пытаюсь получить события, связанные с контрактом MetaCoin по умолчанию в Truffle. Я могу сделать это из консоли Truffle, но не изнутри app.js. Я использую Truffle 4.0.1 с Webpack и TestRPC. Сокращенный вариант договора выглядит следующим образом:

contract MetaCoin {
    mapping (address => uint) balances;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    function MetaCoin() {
        balances[tx.origin] = 10000;
    }

    function sendCoin(address receiver, uint amount) returns(bool sufficient) {
        if (balances[msg.sender] < amount) return false;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Transfer(msg.sender, receiver, amount);
        return true;
    }
}

В app.js проекта я делаю следующее при использовании sendCoin, чтобы убедиться, что событие работает.

MetaCoin.deployed().then(function(instance) {
  meta = instance;
  return meta.sendCoin(receiver, amount, {from: account});
}).then(function(tx) {
  self.setStatus("Transaction complete!");
  console.log("the transaction:", tx);
});

Когда я просматриваю транзакцию в консоли Javascript браузера, я могу убедиться, что объект транзакции действительно имеет запись в разделе logswith _from, _to, и _value, похоже, это работает. Проблема, с которой я сталкиваюсь, заключается в использовании allEventsAPI Javascript для получения всех прошлых событий. В моем app.js я добавил дополнительную функцию:

fetchLogs: function() {
var self = this;
var meta;
var event_data;
var event_data2;
MetaCoin.deployed().then(function(instance) {
  meta = instance;
  console.log("working");
  var events = meta.allEvents({fromBlock: 0, toBlock: 'latest'});
  events.get(function(error, log) {
    event_data = log;
    console.log(event_data);
  });
});

},

Когда я просматриваю консоль браузера, я получаю сообщение «работает», а затем undefined, где я должен получить объект со всеми прошлыми журналами.

Однако, используя тот же Javascript в консоли Truffle, я могу просматривать журналы, выполнив следующий процесс:

> var meta;
> MetaCoin.deployed().then(function(instance) { meta = instance});
> var events = meta.allEvents({fromBlock: 0, toBlock: 'latest'});
> var event_data;
> events.get( (error, log) => {event_data = log;});
> event_data;

Когда я делаю это в Truffle Console, я получаю список объектов, соответствующих каждой транзакции, которая была выполнена до сих пор. Так почему же это работает в консоли, а не в моем приложении Truffle?

Вы проверили, есть ли у ошибки дополнительная информация?
Похоже, что эта часть кода даже не выполняется. Я добавил еще один console.log() в обратный вызов, и похоже, что он никогда не вызывается.

Ответы (1)

Используете ли вы MetaMask, внедренный web3?

У меня была точно такая же проблема, а затем я нашел эту проблему на github.

Оказывается, если я изменю свой код, чтобы использовать не внедренный web3, а локальный, я могу получать события. Так что это похоже на проблему с MetaMask.

Надеюсь, это также решит вашу проблему ... мне потребовалось почти 2 дня, чтобы понять, что это связано с MetaMask.

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