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

LIGO中能否在Tezos智能合约内部创建其他智能合约?

核心结论

LIGO 原生支持在智能合约内部创建、部署其他Tezos智能合约,父合约批量发起子合约部署的需求可以直接通过内置指令实现,不需要额外引入第三方工具或链下逻辑。

实现原理

Tezos网络中部署新合约的本质是构造一笔特殊的操作:这笔操作的接收地址为空,操作内容携带待部署合约的Michelson代码、初始存储值,以及部署时要转入的XTZ数量。LIGO封装了专门的内置函数生成这类操作,只要父合约在执行时把多个部署操作按顺序放入返回的操作列表,链上就会按顺序完成所有子合约的部署流程。

具体实现步骤
  • 提前完成所有子合约的开发编译,拿到每个子合约对应的Michelson代码段,明确每个子合约的初始存储结构
  • 在父合约中调用内置的Tezos.create_contract函数生成单合约部署操作,该函数接收4个入参:子合约代码、可选的合约委托配置、部署时转入子合约的XTZ金额、子合约初始存储;返回值为两个:新部署子合约的链上地址、对应的部署操作
  • 批量部署场景下,按你需要的子合约数量循环调用Tezos.create_contract,把每次生成的部署操作收集到同一个操作列表中,最后将这个列表作为父合约执行返回的操作集即可
  • 每次调用得到的子合约地址可以直接存入父合约存储,方便后续父合约对子合约发起跨合约调用
代码示例(CameLIGO 语法)
// 预编译好的子合约Michelson代码,实际开发替换为你自己的子合约编译产物
let child_contract : _ = [%Michelson {|
  parameter unit;
  storage nat;
  code { CDR; NIL operation; PAIR }
|}]

// 父合约入口点定义:传入要部署的子合约数量即可触发批量部署
type parameter = | DeployChildren of nat
type storage = address list // 存储所有已部署子合约的地址

let main (input, stored_addrs : parameter * storage) : operation list * storage =
  match input with
  | DeployChildren deploy_num ->
    // 递归生成批量部署操作
    let rec batch_deploy (remain : nat) (op_list : operation list) (addr_list : address list) =
      if remain = 0n then (op_list, addr_list)
      else
        // 生成单个子合约部署操作:不质押XTZ,子合约初始存储值为0
        let new_child_addr, deploy_op = Tezos.create_contract child_contract None 0mutez 0n in
        batch_deploy (remain - 1n) (deploy_op :: op_list) (new_child_addr :: addr_list)
    in
    let all_deploy_ops, new_child_addrs = batch_deploy deploy_num [] [] in
    (all_deploy_ops, new_child_addrs @ stored_addrs)

注意事项

  • Tezos单笔交易存在gas上限,单次批量部署的子合约数量不要超过当前网络的gas限制,否则会触发gas不足错误导致交易回滚
  • 传入Tezos.create_contract的初始存储类型必须和子合约代码定义的存储类型完全匹配,否则会出现类型校验错误导致部署失败
  • 函数返回的子合约地址是链上预生成的确定地址,部署完成后即可正常使用,不需要额外等待其他确认流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:06:20