Skip to content

如何部署与调用合约


本节介绍从编译合约到在比特币网络上部署并调用合约的完整流程。UTXO_Compiler 负责编译阶段,链上交互部分需要配合交易构建工具完成。


编译输出

运行编译器后,输出的是一段 JSON 格式的字节码描述:

bash
./utxo_compiler my_contract.ct

输出示例(已简化):

json
{
  "metadata": {
    ...
  },
  "abi": [
    {
      "type": "function",
      "name": "verify",
      "index": 0,
      "params": [
        {
          "name": "sig",
          "type": "hex"
        },
        {
          "name": "pubKey",
          "type": "hex"
        }
      ]
    }
  ],
  "lock": {
    "asm": "OP_DUP OP_HASH160 <self.pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG",
    "hex": "76a9<self.pubKeyHash>88ac"
  },
  "unlock": {
    "verify": "<sig><pubKey>"
  },
  "functions": [
    {
      "name": "verify",
      "type": "public",
      "params": [
        {
          "name": "sig",
          "type": "hex"
        },
        {
          "name": "pubKey",
          "type": "hex"
        }
      ]
    }
  ]
}

其中:

  • lock.hex:十六进制编码的字节码序列,直接用作交易输出的锁定脚本(locking script)
  • lock.asm:人类可读的操作码反汇编,方便审查
  • functions:函数列表及其参数,描述了解锁时需要提供哪些数据

部署合约

"部署合约"在 UTXO 模型里的含义是:构建一笔交易,其输出的锁定脚本包含编译好的合约字节码

部署交易结构

部署交易
├── 输入:某个现有 UTXO(提供资金)
└── 输出:
    ├── value:         要锁入合约的聪数量
    └── locking script: utxo_compiler 编译出的字节码

锁定脚本与 SuffixData

python
...

部署示例(伪代码)

python
...

调用合约

"调用合约"即构建一笔花费该合约 UTXO 的交易。调用方在输入的解锁脚本中,按照合约公有函数的参数列表,依次提供所需的数据。

解锁脚本结构

解锁脚本由调用方构建,其内容就是公有函数的入参,按顺序压栈:

# 以 P2PKH 合约的 unlock(sig: hex, pubKey: hex) 为例
解锁脚本 = <sig> <pubKey>

BVM 执行时,先将解锁脚本的内容压入主栈(sig 在下,pubKey 在上),再执行锁定脚本(合约字节码),锁定脚本从栈上消费这些参数。

公有函数执行顺序

对于包含多个公有函数的合约,公有函数会按其在源码中的声明顺序依次执行。顺序由定义位置决定,不需要在调用时单独指定“选择哪一个函数”。

调用方只需按约定顺序提供解锁参数,执行流程会按照公有函数的先后次序逐步消费并校验这些参数。

调用示例(伪代码)

python
...

注意事项

python
...

下一步


🇬🇧 English version

基于 MIT 许可发布