You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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())

关键注意事项

  1. 版本兼容性:确保Dazl版本与Daml Sandbox版本匹配(如Daml 2.8.x对应Dazl 7.x系列)。
  2. 模板ID验证:确认MyModule:MyContract完全匹配Daml代码中定义的模块名和合约名,区分大小写;且该合约已通过daml deploy部署到Sandbox。
  3. Party权限:TARGET_PARTY需是Sandbox中已分配的参与者(可通过daml ledger allocate-party创建),且有权限查看目标合约。
  4. 异步逻辑规范:业务处理函数需定义为异步函数,避免在同步函数中修改异步上下文的变量。

内容的提问来源于stack exchange,提问作者Buddy Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:13:13