2015-12-14 37 views
2

我有一些測試可以與pyethereum創建合同,並與他們做各種事情,但我對如何獲取關於他們登錄的事件的信息感到困惑。如何從pyethereum獲取事件日誌信息?

一個簡單的例子:

from ethereum import tester as t 

s = t.state() 
code = """contract LogTest { 
      event LogMyNumber(uint); 

      function LogTest() { 
      } 

      function logSomething() { 
       LogMyNumber(4); 
      } 
     }""" 

logtest = t.state().abi_contract(code, language='solidity', sender=t.k0) 
logtest.logSomething() 

#number_i_logged = WHAT DO I DO HERE? 
#print "You logged the number %d" % (number_i_logged) 

我跑這一點,得到:

No handlers could be found for logger "eth.pow" 
{'': 4, '_event_type': 'LogMyNumber'} 

這是天色印製的json是我想要的信息,但有人可以解釋或指向我一個例子,我如何捕獲它並將其加載到python中的變量中,以便我可以檢查它並對它做些什麼?似乎有一種叫做log_listener的東西,你可以將它傳遞給abi_contract,看起來像是相關的,但我無法弄清楚如何處理它。

回答

3

我知道你一直在等待很長時間的答案,但如果別人想知道,這裏是: 你提到的log_listeners是要走的路。您可以在pyethereum's tests使用它的一些示例代碼,這裏是你的固定碼:

from ethereum import tester as t 

s = t.state() 
code = """contract LogTest { 
      event LogMyNumber(uint loggedNumber); 

      function LogTest() { 
      } 

      function logSomething() { 
       LogMyNumber(4); 
      } 
     }""" 

c = s.abi_contract(code, language='solidity', sender=t.k0) 
o = [] 
s.block.log_listeners.append(lambda x: o.append(c._translator.listen(x))) 

c.logSomething() 

assert len(o) == 1 
assert o == [{"_event_type": 'LogMyNumber', "loggedNumber": 4}] 

number_i_logged = o[0]["loggedNumber"] 
print "You logged the number %d" % (number_i_logged) 
+0

謝謝,是有道理的,我給它一個去。 –

+0

工作得很好,正好趕上我需要再次這樣做。再次感謝。 –

+0

太好了,很高興它有幫助。 – 4gn3s

相關問題