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
相关产品推荐
相关产品推荐

