Solidity

在 Web3 偵聽器中觸發的重複事件

  • October 6, 2021

我正在嘗試將乙太坊插入 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。我只看了契約上的一個事件。

希望能幫助到你。

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