如何部署与调用合约
本节介绍从编译合约到在比特币网络上部署并调用合约的完整流程。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
...下一步
- 如何测试合约 — 部署前的本地验证方案