Solidity
在 Web3 偵聽器中觸發的重複事件
我正在嘗試將乙太坊插入 React Web 應用程序,使用這個不錯的教程 repo 作為基礎(感謝 uzyn):https ://github.com/uzyn/ethereum-webpack-example-dapp
我成功連接到本地 TestRPC 3.0.3 實例,部署了 Solidity 0.4.8“MyToken”合約,並成功探勘了一個名為“transfer”的合約函式。我知道從更新的帳戶餘額中轉移只執行一次,但我的瀏覽器控制台中出現了兩個“轉移”事件實例。如果我取出發出事件的行,我在控制台中什麼也得不到。
誰能建議這是為什麼?謝謝!
我正在呼叫這個發出事件的合約函式:
/* Send coins */ function transfer(address _to, uint256 _value) { if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows balanceOf[msg.sender] -= _value; // Subtract from the sender balanceOf[_to] += _value; // Add the same to the recipient Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place }
使用此程式碼塊:
MyTokenContract.transfer.sendTransaction( web3.eth.accounts[1], 100, (error, result) => { if (error) { console.log(`Error occurred: ${error}`); return; } const accountOneBalance = MyTokenContract.balanceOf(web3.eth.accounts[0]); const accountTwoBalance = MyTokenContract.balanceOf(web3.eth.accounts[1]); console.log(`accountOneBalance: ${accountOneBalance}`); console.log(`accountTwoBalance: ${accountTwoBalance}`); } );
我讓這個 Web3 程式碼監聽合約事件:
MyTokenContract.allEvents((error, event) => { if (error) { console.log(`Event error: ${error}`); return; } const eventName = event.event; const accountFrom = event.args.from; const accountTo = event.args.to; const amount = event.args.value; console.log(`Event '${eventName}' from account ${accountFrom} to ${accountTo} of ${amount}`);
});
當它執行時,我的 Chrome 控制台中記錄了兩個事件:
accountOneBalance: 249900 accountTwoBalance: 100 Event 'Transfer' from account 0xdd0efd8df206cb598bda146ae567f5d398436226 to 0x7497ac386ae2e1eb58210d08e6c401b56417e04d of 100 Event 'Transfer' from account 0xdd0efd8df206cb598bda146ae567f5d398436226 to 0x7497ac386ae2e1eb58210d08e6c401b56417e04d of 100
我遇到了同樣的問題,如果 testrpc 正在執行並且已經觸發了一些事件,那麼上面的解決方案不起作用,然後啟動 Web3 程式碼,手錶會返回觸發的最新事件。解決問題並僅獲得新事件的是:
var latestBlock = web3.eth.blockNumber; //get the latest blocknumber contractInstance.MyEvent({fromBlock: latestBlock}, (error, event) => { if (error) { console.log(error); return; } else { if(event.blockNumber != latestBlock) { //accept only new events console.log(event); latestBlock = latestBlock + 1; //update the latest blockNumber } }
希望有幫助!
這對我有用
MyTokenContract.allEvents({fromBlock:’latest’}, (error, event) => { if (error) { console.log(
Event error: ${error}
); return; }即使文件說“最新”是預設設置,這也修復了我的重複事件觸發。我沒有使用 allEvents。我只看了契約上的一個事件。
希望能幫助到你。