Web3js

如何從我的活動中僅獲取最新日誌?

  • January 10, 2019

我目前在我的契約中使用 Oraclize,我從我的前端呼叫了一個契約函式,並且不想繼續下一個呼叫,直到 Oraclize 函式返回。所以我決定使用一個帶有過濾器的事件,它第一次完美執行,然後在下一次呼叫時它實際上並沒有等待 Oraclize 函式再次返回,它只是從前一個 Oraclize 函式中獲取返回值使用它是因為它使用舊的記錄事件,而不是等待最新的事件。

這讓我質疑為什麼我的過濾器在最後一次呼叫中監聽/使用智能合約發出的事件,而不是等待新事件被呼叫。如果我不使用 myEvent.stopListening() 它稍後會返回新的 Oraclize 值,所以我知道 Oraclize 在第一次呼叫後仍在工作。

我的問題是你如何只聽/反應最後一個事件?現在它正在接受之前觸發的任何事件並被觸發。

這是我觀看活動的前端程式碼: 程式碼

我也嘗試過對過濾器使用各種組合,例如:{fromBlock: ’latest’, toBlock:’latest} 或 {fromBlock: ’latest'}

兩者實際上都不起作用,它們第一次不會觸發,然後如果我再次呼叫該函式,它們會遇到同樣的問題並立即觸發先前記錄的事件。

有人可以向我解釋“最新”的作用,因為我似乎理解不好。此外,如果這有什麼不同,我的智能合約中的事件呼叫發生在 Oraclize 的 __callback() 中,我的前端監視程式碼被放置在使用者點擊按鈕並輸入數字並發送交易的回調中。回調函式中的位置是否會導致這個奇怪的錯誤?

感謝您的幫助或理解,我已經閱讀了有關契約事件和 web3.eth.filters 的文件,但無法弄清楚這一點。對不起,大量的文字牆。

TL:DR 你如何讓你的 watch() 只尋找新的事件日誌,而不是對過去觸發的事件日誌做出反應?謝謝!

修改程式碼如下:

var num=contractInstance.Result({},{fromBlock: 0, toBlock: 'latest' });
    num.watch(function(error,result){
});

在這裡,我們從塊 0 中檢索事件,這是通過將fromBlock參數添加toBlock到事件中來向目前塊添加參數來完成的。

如果您要獲取從 0 到 latest的事件,您將始終獲得所有已發生的事件。如果你之前已經送出了數據,並且只是從給定的到塊和從塊開始監視,你會看到很快你就會得到所有送出的東西。

試試這個:

var event = conInst.YourEventName({},{
    fromBlock:'latest', 
    toBlock:'pending'}, 
  function(error, result) {
   if (!error)
       console.log(result.args);
  });

這將為您提供即將被探勘的數據。問題是你可能沒有一直擁有所有日誌(取決於誰在與你的智能合約互動)。但它肯定會為您提供即將在區塊鏈上進行的最早的事情。

以完全證明的方式執行此操作的另一種方法是在內部過濾它們。假設您有一個從 ID 到結構的映射,現在對於一個 ID,您更改了一些數據,現在您將獲得同一個 ID 的舊 ID 和新 ID。所以你可以做的是在事件中傳遞“blockNumber”,所以當你得到記錄時,你循環遍歷它,看看你是否有多個相同的 ID,你取最高的 blockNumber。

這就是我這樣做的方式,但它很慢。你可以通過其他方式,但你明白了。

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