如何从pyethereum获取事件日志信息?

时间:2015-12-14 01:55:47

标签: python ethereum

我有一些测试用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,看起来它是相关的,但我无法弄清楚如何处理它。

1 个答案:

答案 0 :(得分: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)