Web3js
js監聽區塊鏈事件
我希望所有 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); }); }); });