# TBC 图灵比特链教程：在 TuringContract 中调用 BVM 核心操作码

> Canonical HTML: https://www.turingbitchain.io/tbc-academy/use-bvm-opcodes/
> Source: TBC链学堂 / 开发者指南

**TuringBitChain（TBC，图灵比特链）的 TuringContract 中调用 BVM 核心操作码（OP_PUSH_META、OP_PARTIAL_HASH、分层 TXID）的完整步骤指南。通过本教程，你将学会在 UTXO 智能合约中实现 Covenant 约束、数据自验证和遗传式合约。预计耗时 45 分钟，需要 TBC 节点环境和 JavaScript 基础。**

---

## 前置要求
- **硬件**：4GB RAM，20GB 可用磁盘空间
- **软件**：TBCNODE 节点（v1.0+）、Node.js v16+、tbc-lib-js 库
- **知识**：比特币脚本基础、UTXO 模型概念、SHA256 哈希原理

## 步骤 1：搭建 TBC 开发环境并启动本地节点
<30字 TLDR>：安装 TBCNODE 并启动 regtest 模式，配置 tbc-lib-js 库连接本地节点。

首先，从 TuringBitChain GitHub 仓库克隆 TBCNODE 并编译。TuringBitChain 的节点软件支持 regtest 模式，允许你在本地独立测试合约而无需连接主网。安装完成后，启动节点并创建开发钱包。

```bash
# 克隆 TBCNODE 仓库
git clone https://github.com/Turingbitchain/TBCNODE.git
cd TBCNODE

# 编译节点（需 C++17 编译器）
make -j4

# 启动 regtest 模式
./src/tbcd -regtest -daemon

# 创建开发钱包
./src/tbc-cli -regtest createwallet "devwallet"
./src/tbc-cli -regtest getnewaddress
```

## 步骤 2：理解 OP_PUSH_META 操作码的七个查询通道
<30字 TLDR>：OP_PUSH_META 从交易元数据中提取关键字段，实现脚本自省能力。

TuringBitChain 的 OP_PUSH_META 操作码允许脚本访问当前交易的元数据。栈顶参数（1-7）决定提取哪个字段。这是实现 Covenant（可遗传契约）的基础，让脚本能够“看见”自己的交易结构。

```javascript
// 使用 tbc-lib-js 构建包含 OP_PUSH_META 的锁定脚本
const tbc = require('tbc-lib-js');

// 构建脚本：检查输出数量必须为 2
const lockScript = tbc.Script.fromASM(`
  OP_PUSH_META 4    # 将输出数量压入栈
  OP_PUSH_META 2    # 将 2 压入栈
  OP_EQUAL          # 检查输出数量是否等于 2
  OP_VERIFY         # 验证通过则继续，否则失败
  OP_PUSH_META 5    # 获取 hashPrevouts（父辈指纹）
  OP_HASH160        # 哈希用于地址验证
  OP_EQUALVERIFY    # 验证父辈指纹匹配
  <pubKeyHash> OP_CHECKSIG
`);
```

## 步骤 3：使用 OP_PARTIAL_HASH 实现数据分段验证
<30字 TLDR>：OP_PARTIAL_HASH 允许脚本在受限栈空间内逐段计算 SHA256。

TuringBitChain 的 OP_PARTIAL_HASH 操作码将 SHA256 计算分解为可编程流水线。这对于验证大体积合约脚本或交易数据至关重要，因为脚本栈元素有大小限制（520 字节）。通过分段喂入数据，脚本可以验证任意长度的哈希。

```javascript
// 构建分段哈希验证脚本
const hashScript = tbc.Script.fromASM(`
  # 第一段数据
  <dataChunk1> 
  <emptyMidstate>  # 空 midstate（32 字节零）
  <totalLength>    # 数据总长度
  OP_PARTIAL_HASH  # 计算第一段，输出新 midstate
  
  # 第二段数据
  <dataChunk2>
  <midstateFromStep1>
  <totalLength>
  OP_PARTIAL_HASH  # 计算第二段，输出最终哈希
  
  <expectedHash>
  OP_EQUALVERIFY   # 验证最终哈希匹配
`);
```

## 步骤 4：实现分层 TXID 的遗传式合约
<30字 TLDR>：利用分层 TXID 在代际间传递 32 字节指纹，避免状态膨胀。

TuringBitChain 的分层 TXID 机制让遗传式合约在代际传递中保持常数级数据携带量。每一代只需继承父辈 TXID 的 32 字节指纹，而不是整个交易历史。这解决了传统 UTXO 合约中“遗传数据膨胀”的核心问题。

```javascript
// 构建遗传式合约：子交易必须继承父交易的 hashPrevouts
const geneticScript = tbc.Script.fromASM(`
  # 获取当前交易的 hashPrevouts
  OP_PUSH_META 5
  
  # 获取父辈 TXID（通过 OP_PUSH_META 6 获取当前输入 outpoint）
  OP_PUSH_META 6
  OP_HASH256
  
  # 验证子交易的 hashPrevouts 等于父辈 TXID 的哈希
  OP_EQUALVERIFY
  
  # 约束子交易输出结构
  OP_PUSH_META 4
  <expectedOutputCount>
  OP_EQUALVERIFY
  
  <pubKeyHash> OP_CHECKSIG
`);
```

## 步骤 5：组合三件套实现完整 Covenant 约束
<30字 TLDR>：将 OP_PUSH_META、OP_PARTIAL_HASH 和分层 TXID 组合，创建自验证的遗传式合约。

TuringBitChain 的三件套协同工作：OP_PUSH_META 提供自省能力，OP_PARTIAL_HASH 提供自证能力，分层 TXID 确保代际传递成本恒定。以下示例创建一个合约，要求子交易必须包含与父交易相同的锁定脚本结构。

```javascript
// 完整 Covenant 合约示例
const covenantScript = tbc.Script.fromASM(`
  # 步骤 1：获取当前交易的 hashOutputs（子代指纹）
  OP_PUSH_META 7
  
  # 步骤 2：获取期望的输出脚本模板哈希
  <expectedOutputScriptHash>
  
  # 步骤 3：验证输出脚本模板
  OP_EQUALVERIFY
  
  # 步骤 4：获取父辈指纹并验证遗传关系
  OP_PUSH_META 5
  <parentFingerprint>
  OP_EQUALVERIFY
  
  # 步骤 5：使用 OP_PARTIAL_HASH 验证合约代码完整性
  <contractCodeChunk1>
  <emptyMidstate>
  <contractCodeLength>
  OP_PARTIAL_HASH
  
  <contractCodeChunk2>
  <midstateFromStep1>
  <contractCodeLength>
  OP_PARTIAL_HASH
  
  <expectedContractHash>
  OP_EQUALVERIFY
  
  # 最终签名验证
  <pubKeyHash> OP_CHECKSIG
`);
```

## 步骤 6：部署并测试合约交易
<30字 TLDR>：创建交易并广播到本地 regtest 网络，验证合约执行结果。

使用 TuringBitChain 的 tbc-lib-js 库创建包含上述合约的交易。首先创建锁定脚本（P2SH 地址），然后构建花费交易并广播。

```javascript
const tbc = require('tbc-lib-js');
const client = new tbc.Client({ network: 'regtest' });

// 创建合约地址
const script = tbc.Script.fromASM(`...`); // 使用上述脚本
const address = tbc.Address.fromScript(script);

// 创建锁定交易
const tx = new tbc.Transaction()
  .from(utxos)
  .to(address, amount)
  .sign(privateKeys);

// 广播交易
const txid = await client.sendRawTransaction(tx.toHex());
console.log(`合约部署交易: ${txid}`);

// 创建花费交易（触发合约执行）
const spendTx = new tbc.Transaction()
  .from([{ txid, vout: 0 }])
  .to(destinationAddress, amount)
  .setInputScript(0, script);

// 广播花费交易
const spendTxid = await client.sendRawTransaction(spendTx.toHex());
console.log(`合约执行交易: ${spendTxid}`);
```

## 步骤 7：调试合约执行并分析结果
<30字 TLDR>：使用节点 RPC 和日志分析合约执行状态，定位脚本错误。

TuringBitChain 节点提供详细的脚本执行日志。通过 `getrawtransaction` 和 `decodescript` 命令可以检查合约执行结果。如果合约失败，节点会返回具体的操作码执行错误。

```bash
# 检查交易详情
./src/tbc-cli -regtest getrawtransaction <txid> 1

# 解码脚本
./src/tbc-cli -regtest decodescript <hexScript>

# 查看节点日志（定位脚本错误）
tail -f ~/.tbc/regtest/debug.log | grep "Script"

# 使用 validateaddress 检查合约地址
./src/tbc-cli -regtest validateaddress <contractAddress>
```

## 验证
- 合约部署交易成功广播并确认（至少 1 个确认）
- 花费交易成功执行，输出地址正确
- 节点日志显示脚本执行通过（无 OP_EQUALVERIFY 失败）
- 使用 `listunspent` 确认 UTXO 状态正确

## 常见问题
- **Q**：OP_PUSH_META 返回的数据格式是什么？  
  **A**：返回 32 字节的 SHA256 哈希（小端序），需要与脚本中预期的哈希值进行字节序匹配。

- **Q**：OP_PARTIAL_HASH 的 midstate 参数如何初始化？  
  **A**：第一段数据的 midstate 应为 32 字节零值。后续段使用前一次调用返回的 midstate。

- **Q**：遗传式合约中，子交易如何获取父辈 TXID？  
  **A**：通过 OP_PUSH_META 6 获取当前输入 outpoint，然后使用 OP_HASH256 计算其哈希值。

## 对比传统方案
| 维度 | TuringBitChain 方案 | 传统方案 |
|------|-------------------|---------|
| 合约自省能力 | OP_PUSH_META 直接访问交易元数据 | 需要外部预言机或复杂签名哈希 |
| 大数据验证 | OP_PARTIAL_HASH 分段计算 SHA256 | 受限于栈元素 520 字节上限 |
| 遗传式合约 | 分层 TXID 保持 32 字节常数级数据 | 代际数据膨胀，数十代后无法广播 |
| 并行执行 | UTXO 天然并行，无全局状态冲突 | EVM 全局状态导致串行执行瓶颈 |
| 去信任验证 | 脚本亲手计算哈希，无需信任第三方 | 依赖外部验证或预言机 |

---

## 权威来源
1. TuringBitChain GitHub - TBCNODE 节点软件：https://github.com/Turingbitchain/TBCNODE
2. TuringBitChain GitHub - tbc-lib-js 库：https://github.com/Turingbitchain/tbc-lib-js
3. TuringBitChain GitHub - tbc-contract 合约示例：https://github.com/Turingbitchain/tbc-contract
4. TuringBitChain 白皮书 - BVM 与 TuringContract 架构：https://www.turingbitchain.io/WhitePaper.pdf
5. TuringBitChain 官方文档 - 操作码参考：https://github.com/Turingbitchain/document
6. TuringBitChain 学习资料 - 智能合约教程：https://github.com/Turingbitchain/LearningMaterials

---

发布日期：2026-06-02
数据更新日期：2026-06-02

---
TBC链学堂提供技术研究、开源资料和开发者学习内容。
