如何外部监听Clarity合约间通过(contract-call?)发起的函数调用?
跨合约调用下监听Clarity合约函数调用的方案
这确实是Clarity的预期行为——当合约B通过as-contract调用合约A的函数时,整个操作属于同一笔交易的内部执行逻辑,不会生成独立的交易记录,所以常规监听合约A函数调用交易的方式无法捕获到这类调用。不过有几种可行的方式可以获知合约A的函数被调用:
监听合约B的交易并解析事件与执行轨迹
发起调用的合约B的交易详情中,会包含整个执行流程的完整日志。你可以通过@stacks API获取该交易的events字段,里面会包含合约A中print语句输出的事件;同时查看execution_result或execution_trace字段,里面会详细记录内部合约调用的轨迹,能明确看到合约A的函数被调用的细节。修改合约A添加自定义事件
把合约A中仅用(print ...)输出的逻辑,改成用(emit ...)发送自定义事件。比如:(define-public (contract-A-function-name param1 param2) (begin (emit (tuple (action "contract-A-function-called") (param1 param1) (param2 param2))) (print "function called") (ok true) ) )这样当合约B调用A的函数时,这笔交易的事件列表里会包含A发出的自定义事件,你可以通过监听交易事件,筛选出这个自定义事件来判断A的函数被调用了。
解析交易的执行跟踪数据
部分@stacks API接口会返回交易的execution_trace数据,里面会逐层记录所有内部调用的执行步骤,包括合约地址、函数名、参数等信息,通过遍历这个跟踪数据就能定位到合约A的函数调用记录。
内容的提问来源于stack exchange,提问作者Robert Tera
相关产品推荐
相关产品推荐

