Я пытаюсь получить события, связанные с контрактом 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 браузера, я могу убедиться, что объект транзакции действительно имеет запись в разделе logs
with _from
, _to
, и _value
, похоже, это работает. Проблема, с которой я сталкиваюсь, заключается в использовании allEvents
API 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?
Используете ли вы MetaMask, внедренный web3?
У меня была точно такая же проблема, а затем я нашел эту проблему на github.
Оказывается, если я изменю свой код, чтобы использовать не внедренный web3, а локальный, я могу получать события. Так что это похоже на проблему с MetaMask.
Надеюсь, это также решит вашу проблему ... мне потребовалось почти 2 дня, чтобы понять, что это связано с MetaMask.
Исмаэль
Маккензи