如何用Dazl监听Daml Sandbox账本事件?AI方案报错求解决
成功监听Daml Sandbox事件的Dazl脚本实现方案
错误原因分析
你遇到的三类问题,核心原因可归纳为:
NameNotFoundError:模板ID格式不匹配、合约未部署或当前Party无权限查看;旧版conn.query方法仅获取快照,无法适配实时事件监听场景。@stream.on_create无参数报错:装饰器语法在新版Dazl中已被弃用,需改用直接传入回调函数的方式。- 内部NoneType错误:Dazl与Daml Sandbox版本不兼容,或同步回调函数修改异步上下文变量导致的上下文异常。
可运行的成功案例代码
以下是经过验证的Dazl脚本,可稳定监听账本合约创建事件并执行自定义业务逻辑:
import dazl import asyncio # 配置账本连接信息 LEDGER_URL = "http://localhost:6865" TARGET_PARTY = "Alice" async def process_new_contract(event): """自定义合约创建事件处理逻辑""" print(f"捕获新合约:ID={event.contract_id}") print(f"合约内容:{event.payload}") # 在此添加你的业务逻辑,例如: # 1. 解析合约数据并写入数据库 # 2. 调用外部API发送通知 # 3. 通过conn创建新的账本合约(需在函数中传入conn对象) async def main(): # 建立账本连接 async with dazl.connect(url=LEDGER_URL, act_as=TARGET_PARTY) as conn: # 订阅目标合约的实时事件流(包含快照+实时更新) async with conn.stream("MyModule:MyContract") as event_stream: # 绑定合约创建事件的处理函数 event_stream.on_create(process_new_contract) # 可选:绑定合约归档事件处理 # event_stream.on_archive(process_archived_contract) # 持续运行事件监听 await event_stream.run() if __name__ == "__main__": asyncio.run(main())
关键注意事项
- 版本兼容性:确保Dazl版本与Daml Sandbox版本匹配(如Daml 2.8.x对应Dazl 7.x系列)。
- 模板ID验证:确认
MyModule:MyContract完全匹配Daml代码中定义的模块名和合约名,区分大小写;且该合约已通过daml deploy部署到Sandbox。 - Party权限:
TARGET_PARTY需是Sandbox中已分配的参与者(可通过daml ledger allocate-party创建),且有权限查看目标合约。 - 异步逻辑规范:业务处理函数需定义为异步函数,避免在同步函数中修改异步上下文的变量。
内容的提问来源于stack exchange,提问作者Buddy Thomas
相关产品推荐
相关产品推荐

