强哥醚事件
django-ethereum-events的Python项目详细描述
Django中的以太坊合同事件日志监视
概述
这个包提供了一种简单的方法来监视以太坊区块链中调用Contract Events的、特别感兴趣的事务。
主要概念的灵感来自以下项目:
软件包版本0.2.x+支持web3 v4。
如果您想要python 2.7兼容性和/或web3 v3支持,请使用此包的0.1.x版本。
安装
使用pip安装:
pip install django-ethereum-events
确保在INSTALLED_APPS
中包含'django_ethereum_events'。INSTALLED_APPS+=('django_ethereum_events')
如果您使用的是管理后端,也可以在INSTALLED_APPS中包含solo。
进行必要的迁移
pythonmanage.pymigratedjango_ethereum_events
用法
在settings文件中,指定以下设置
ETHEREUM_NODE_URI='http://localhost:8545'
创建新的监视器devent
contract_abi=""" The whole contract abi goes here """event="MyEvent"# the emitted event nameevent_receiver="myapp.event_receivers.CustomEventReceiver"contract_address="0x10f683d9acc908cA6b7A34726271229B846b0292"# the address of the contract emitting the eventMonitoredEvent.object.register_event(event_name=event,contract_address=contract_address,contract_abi=contract_abi,event_receiver=event_receiver)
创建适当的事件接收器
fromdjango_ethereum_events.chaineventsimportAbstractEventReceiverclassCustomEventReceiver(AbsractEventReceiver):defsave(self,decoded_event):# custom logic goes here
decoded_event参数是从web3.utils.events.get_event_data方法提供的解码日志。
要开始监视区块链,请运行芹菜任务django_ethereum_events.tasks.event_listener或更高版本,使用celerybeat将其作为定期任务运行
fromcelery.beatimportcrontabCELERYBEAT_SCHEDULE={'ethereum_events':{'task':'django_ethereum_events.tasks.event_listener','schedule':crontab(minute='*/1')# run every minute}}
还可以设置可选的^ {tt9} $设置,它限制了可以从芹菜任务中一次读取的块的最大数量。
有关事件接收器的详细信息
建议将自定义事件接收器中的代码简单化,因为它是在event_listener任务运行时同步运行的。如果不是这样,请将参数decoded_event传递给您自己的芹菜任务
# inside the CustomEventReceiver.save methodfromdjango_ethereum_events.utilsimportHexJsonEncoderdecoded_event_data=json.dumps(decoded_event,cls=HexJsonEncoder)my_custom_task.delay(decoded_event_data)
如果在事件接收器中引发未处理的异常,event_listener任务将记录该错误并创建 包含所有相关事件信息的django_ethereum_events.models.FailedEventLog的新实例。
事件侦听器不尝试重新运行FailedEventLogs。这取决于客户端实现。
重置内部状态
块只处理一次。最后处理的块存储在.models.Daemon条目中。
若要重置已处理的块数,请运行reset_block_daemon命令(可选)指定要重置为(默认为零)的块数(-b,–block)。如果将其重置为零,则下次触发event_listener时,它将开始处理来自genesis块的块。
也可以从django管理后端更改Daemon项。