Web3js

js監聽區塊鏈事件

  • April 2, 2018

我希望所有 js 客戶端對儲存到區塊鏈的新事件做出反應:

contract MainContract{
   event Evt(address indexed _sender,string jsn);
   function deposit(string jsn) returns (int256) {
       Evt(msg.sender, jsn);
   }
}

在這裡,我希望執行 watch 回調。

   var contract = web3.eth.contract(abi).at("0xe45866ac5d51067ce292bc656c790e94ddcf0766");
   var myEvent = contract.Evt({},{fromBlock: 0, toBlock: 'latest'});
   myEvent.watch(function(error, result){
       console.log("on watch"); 
       console.log(arguments);
   });
   // this call saves event data successfully!
   contract.deposit('hello there',function (res) {
       console.log(arguments)
   });

但我在控制台中沒有看到“正在觀看”。這可能嗎?我怎樣才能做到這一點?有什麼例子嗎?

更新:我現在最好的猜測是這是 metamask.io 問題(https://github.com/MetaMask/metamask-plugin/issues/792

UPDATE2:看起來像乙太坊核心中的一個錯誤,有些人報告了同樣的經歷:https ://github.com/ethereum/go-ethereum/issues/14670

我已經解決了我的問題:我使用了錯誤的合約地址。請注意,該API 不會讓您知道合約地址不正確

如果您使用的是 truffle,則部署的實例應該有事件,以便您可以收聽更改:

let Contract = artifacts.require('./Contract.sol');

contract('Contract', accounts => {

   let MyEvent;

   Contract.deployed().then(instance => {
       MyEvent = instance.SolidityEventMethod({});

       MyEvent.watch((error, result) => {
           if (error) {
               console.log(error);
           }

           console.log(result);
       });
   });

   it('should do something and trigger event', () => {
       return Contract.deployed().then(instance => {
           return instance.myEventTriggeringFunction();
       }).then(res => {
           // at this point the MyEvent.watch method should have logged the result
       }).catch(error => {
           console.log(error);
       });
   });
});

引用自:https://ethereum.stackexchange.com/questions/21048