Json-Rpc

無法從契約中擷取每個事件(日誌) - 而是擷取幾個隨機事件

  • August 15, 2016

我的契約有一個觸發事件的交易。當我手動發送交易時,我能夠捕捉到每個事件。

但現在我循環發送 100 筆交易,只收到 2..5 個事件。是的,隨機的——這讓我最困惑。每次執行我的程式碼時,我都會得到隨機數量的事件和**隨機最後一個事件。**請參閱下面的控制台輸出。

試圖在事務之間添加暫停。暫停時間越長,擷取的事件就越多。這也讓我感到困惑——不明白為什麼這對事件很重要。

我的 .sol 合約

contract Example {

   uint32 public value;

   event ValueSet(uint);

   function setValue(uint32 val) {
       value = val;
       ValueSet(val);
   }

}

我的 python 程式碼(對不起,程式碼太長了——怕把它弄亂了)

class MyContract:

   address = ""
   filter = ""

   def __init__(self):
       self.c = EthJsonRpc('127.0.0.1', 8545)

   def deploy(self):

       # get contract address
       compiled = '6060604052610.....' # shortening it here.
       contract_tx = self.c.create_contract(self.c.eth_coinbase(), compiled, gas=3000000)
       self.address = self.c.get_contract_address(contract_tx)

       # set new filter
       params = {
           "fromBlock": "0x01",
           "address": self.address
       }
       self.filter = str(self.new_filter(params))


   def send_transaction(self, foo, value):
       tx = self.c.call_with_transaction(self.c.eth_coinbase(), self.address, foo, value)
       return tx

   def new_filter(self, params):
       return self.c.eth_newFilter(params)

   def listen(self):
       return self.c.eth_getFilterLogs(self.filter)



def main():
   my_contract = MyContract()
   my_contract.deploy()

   #sending transactions which trigger events 
   for i in range(100):
       my_contract.send_transaction('setValue(uint32)', [i])
       time.sleep(1) # the more time the more events are caught 

   # retrieve all logs from the filter
   logs = my_contract.listen()

   print repr(logs)
   print "Quantity of events: " + str(len(logs))
   if logs:
       print "Data: " + str(int(logs[-1]['data'], 16))

控制台輸出

[
  {
     u'type':u'mined',
     u'blockHash':u'0xac739ae0feac68eae0cddb5216ef64c7931821cf26db327c85bd3da16f947f44',
     u'transactionHash':u'0x4d2465e9b978a275cca63fb9129a5da8f7a9dcc9b2c6e8b717ecf734be7ab950',
     u'data':u'0x0000000000000000000000000000000000000000000000000000000000000026',
     u'topics':[
        u'0x012c78e2b84325878b1bd9d250d772cfe5bda7722d795f45036fa5e1e6e303fc'
     ],
     u'blockNumber':u'0x0223',
     u'address':u'0x9062a6b9299af4bdb535a5ecdbfeb8a28e6cf4c1',
     u'logIndex':u'0x00',
     u'transactionIndex':u'0x0'
  },
  {
     u'type':u'mined',
     u'blockHash':u'0x1014603151080201cc26990c6b4f1dd01a5b65545b19a570a01c9ad11532c7f2',
     u'transactionHash':u'0xe79af54c765368e73e3c9ca996de667e43363e92856ca234459633fda86c77ca',
     u'data':u'0x000000000000000000000000000000000000000000000000000000000000005f',
     u'topics':[
        u'0x012c78e2b84325878b1bd9d250d772cfe5bda7722d795f45036fa5e1e6e303fc'
     ],
     u'blockNumber':u'0x025c',
     u'address':u'0x9062a6b9299af4bdb535a5ecdbfeb8a28e6cf4c1',
     u'logIndex':u'0x00',
     u'transactionIndex':u'0x0'
  }
]
Quantity of events: 2
Data: 95

有關的

如何列出來自賬戶地址的交易?

如何使用 Ethereum RPC 呼叫為新事務創建偵聽器?

使用 Python 創建 eth_newFilter 主題監聽器

為什麼問

我正在嘗試編寫一個程式碼,它將契約事件以“實時”模式(擷取新事件)和“回顧”模式(檢索所有契約事件)保存到數據庫中。並且只想了解事件是如何工作的。

我將 ethjsonrpc 與 testrpc (Ethereumjs) 一起使用。

非常感謝你!

只需添加收據 = self.c.eth_getTransactionReceipt(tx)。我想它可以確保交易被探勘。

現在它擷取了所有 100 個事件。

我還嘗試在每次交易後添加一個計時器。每筆交易後 5 秒足以擷取所有事件。但是 eth_getTransactionReceipt 的工作速度要快得多(所有 100 筆交易只需幾秒鐘)。

有人可以解釋一下嗎?生產區塊鏈的程式碼是什麼樣的?

   def send_transaction(self, foo, value):
       tx = self.c.call_with_transaction(self.c.eth_coinbase(), self.address, foo, value)
       receipt = self.c.eth_getTransactionReceipt(tx)
       return tx

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