Json-Rpc
無法從契約中擷取每個事件(日誌) - 而是擷取幾個隨機事件
我的契約有一個觸發事件的交易。當我手動發送交易時,我能夠捕捉到每個事件。
但現在我循環發送 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