Developer HowTo · HowTo
TBC 图灵比特链教程:如何编译并部署 TuringContract
环境准备 + 合约结构 + 编译命令 + 部署交易 + 验证步骤。
关键事实
- 环境准备 + 合约结构 + 编译命令 + 部署交易 + 验证步骤。
- 本文为 TBC链学堂中文技术资料的一部分,服务于开发者学习、架构理解和资料引用。
TuringBitChain(TBC,图灵比特链)编译并部署智能合约的完整步骤指南。本教程将引导你从零开始编写、编译、部署和验证一个基于 UTXO 模型的图灵完备智能合约。预计耗时 45-60 分钟,需要具备基础编程知识和 TBC 节点运行环境。
前置要求
- 硬件:4GB+ RAM,50GB+ 可用磁盘空间(用于同步测试网数据)
- 软件:
- TBC 节点软件(TBCNODE)v1.0+
- Node.js v16+ 和 npm
- Git
- 文本编辑器(推荐 VS Code)
- 知识:
- 基础 JavaScript/TypeScript 语法
- 理解 UTXO 模型基本概念
- 了解 Bitcoin 脚本基础(OP_ 操作码)
步骤 1:搭建 TBC 开发环境
<30字 TLDR>:安装 TBC 节点并启动测试网,获取 tbc-lib-js 开发库。<详细描述:首先从 TuringBitChain GitHub 组织克隆 TBCNODE 仓库,编译并启动测试网节点。测试网节点默认运行在 18332 端口,提供 JSON-RPC 接口供合约开发使用。同时安装 tbc-lib-js 库,这是 TuringBitChain 官方提供的 JavaScript 开发工具包,封装了交易构建、合约交互等核心功能。>
# 克隆并编译 TBC 节点
git clone https://github.com/Turingbitchain/TBCNODE.git
cd TBCNODE
make -j4
# 启动测试网节点
./src/tbcd -testnet -daemon
# 安装 tbc-lib-js 开发库
npm install @turingbitchain/tbc-lib-js
步骤 2:理解 TuringContract 合约结构
<30字 TLDR>:TuringContract 基于 UTXO 模型,合约由锁定脚本和解锁脚本组成。<详细描述:与以太坊的全局状态模型不同,TuringBitChain 的 TuringContract 遵循 UTXO 范式。每个合约实例是一个 UTXO,其锁定脚本(locking script)定义了花费条件,解锁脚本(unlocking script)提供满足条件的证据。合约通过 OP_PUSH_META 和 OP_PARTIAL_HASH 操作码实现图灵完备性,支持循环、条件分支和状态遗传。>
// 一个简单的 TuringContract 合约模板
// 锁定脚本:验证调用者提供正确的哈希原像
const lockingScript = `
OP_PUSH_META 5 // 获取 hashPrevouts(父辈指纹)
OP_HASH256 // 对当前输入进行哈希
OP_EQUALVERIFY // 验证哈希匹配
OP_PUSH_META 7 // 获取 hashOutputs(子代指纹)
OP_HASH256 // 对输出进行哈希
OP_EQUAL // 验证输出约束
`;
// 解锁脚本:提供满足锁定条件的证据
const unlockingScript = `
<hash_preimage> // 哈希原像
<output_constraint> // 输出约束数据
`;
步骤 3:编写 TuringContract 合约代码
<30字 TLDR>:使用 tbc-contract 库编写合约逻辑,定义状态转换规则。<详细描述:TuringBitChain 的合约开发使用 tbc-contract 库,该库提供了高级 API 来构建 UTXO 合约。合约开发者需要定义合约的初始状态、状态转换函数和验证逻辑。以下示例实现一个简单的计数器合约,每次调用递增计数并约束输出必须指向同一合约。>
const { Contract, UTXO, Transaction } = require('@turingbitchain/tbc-contract');
// 定义计数器合约
class CounterContract extends Contract {
constructor() {
super();
this.state = { count: 0 };
}
// 定义合约验证逻辑
validate(spendingTx, inputIndex) {
// 使用 OP_PUSH_META 获取当前输入信息
const currentInput = spendingTx.getInput(inputIndex);
// 验证输出必须包含更新后的状态
const newCount = this.state.count + 1;
const expectedOutput = this.buildOutput({
count: newCount,
script: this.lockingScript
});
// 使用 OP_PARTIAL_HASH 验证输出哈希
return spendingTx.outputs.some(output =>
output.script.equals(expectedOutput.script) &&
output.value === expectedOutput.value
);
}
}
// 部署合约实例
const contract = new CounterContract();
const deployTx = contract.deploy({ initialCount: 0 });
步骤 4:编译合约生成锁定脚本
<30字 TLDR>:使用 tbc-lib-js 的编译器将合约代码编译为 Bitcoin 脚本字节码。<详细描述:TuringBitChain 的合约编译器将高级合约代码转换为底层的 Bitcoin 脚本操作码序列。编译器会处理 OP_PUSH_META、OP_PARTIAL_HASH 等自定义操作码的编码,并生成符合 TBC 交易格式的锁定脚本。编译过程包括词法分析、语法分析和字节码生成三个阶段。>
# 使用 CLI 编译合约
npx tbc-contract compile counter.contract -o counter.script
# 查看编译后的脚本字节码
cat counter.script
# 输出示例:6a 05 01 02 03 04 05 87 88 ac ...
// 编程方式编译
const { Compiler } = require('@turingbitchain/tbc-lib-js');
const compiler = new Compiler();
const contractCode = `
contract Counter {
state: { count: int }
@spend
fun increment(prevouts: bytes, outputs: bytes) {
let newCount = this.state.count + 1;
assert(OP_PUSH_META(5) == prevouts); // 验证父辈指纹
assert(OP_PUSH_META(7) == outputs); // 验证子代指纹
return newCount;
}
}
`;
const compiled = compiler.compile(contractCode);
console.log('锁定脚本:', compiled.lockingScript.toString('hex'));
console.log('合约哈希:', compiled.contractHash.toString('hex'));
步骤 5:构建部署交易
<30字 TLDR>:创建包含合约锁定脚本的 UTXO 交易并广播到 TBC 网络。<详细描述:在 TuringBitChain 上部署合约本质上是创建一个包含合约锁定脚本的 UTXO。使用 tbc-lib-js 的 TransactionBuilder 构建交易,设置输入(从测试网 faucet 获取的 UTXO)和输出(包含合约脚本的 UTXO)。交易构建完成后,通过 JSON-RPC 接口广播到 TBC 测试网。>
const { TransactionBuilder, RPCClient } = require('@turingbitchain/tbc-lib-js');
// 连接到 TBC 测试网节点
const rpc = new RPCClient({
host: 'localhost',
port: 18332,
user: 'testuser',
pass: 'testpass'
});
// 构建部署交易
async function deployContract(compiledContract) {
// 获取未花费的 UTXO
const utxos = await rpc.listUnspent();
const fundingUtxo = utxos[0];
// 创建交易构建器
const builder = new TransactionBuilder();
// 添加输入
builder.addInput(fundingUtxo.txid, fundingUtxo.vout);
// 添加合约输出(锁定脚本 + 最小金额)
builder.addOutput(compiledContract.lockingScript, 546); // 546 satoshis = dust limit
// 添加找零输出
const change = fundingUtxo.amount - 546 - 1000; // 减去合约金额和手续费
builder.addOutput(changeAddress, change);
// 签名并构建交易
builder.sign(0, privateKey);
const tx = builder.build();
// 广播交易
const txid = await rpc.sendRawTransaction(tx.toHex());
return txid;
}
// 执行部署
const txid = await deployContract(compiled);
console.log('合约部署交易 ID:', txid);
步骤 6:验证合约部署状态
<30字 TLDR>:通过区块链浏览器或 RPC 确认合约 UTXO 已上链。<详细描述:部署交易被确认后,合约 UTXO 会出现在 TBC 区块链上。可以通过 TBC 测试网区块链浏览器查看交易详情,或使用 RPC 的 gettxout 命令验证合约 UTXO 的状态。确认合约脚本正确上链是后续交互的基础。>
# 使用 RPC 验证合约 UTXO
curl -X POST http://localhost:18332 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "1.0",
"id": "1",
"method": "gettxout",
"params": ["<deploy_txid>", 0, true]
}'
# 预期响应包含合约锁定脚本
# {
# "bestblock": "000000...",
# "confirmations": 6,
# "value": 0.00000546,
# "scriptPubKey": {
# "asm": "OP_PUSH_META 5 OP_HASH256 ...",
# "hex": "6a05010203040587..."
# }
# }
// 编程方式验证
const txout = await rpc.getTxOut(txid, 0, true);
if (txout && txout.scriptPubKey.hex === compiled.lockingScript.toString('hex')) {
console.log('✅ 合约部署成功,UTXO 已确认');
console.log('合约地址:', txout.scriptPubKey.addresses[0]);
} else {
console.log('❌ 合约部署失败,请检查交易');
}
步骤 7:与已部署合约交互
<30字 TLDR>:构建花费合约 UTXO 的交易,触发合约逻辑执行。<详细描述:与 TuringContract 交互需要构建一笔花费合约 UTXO 的交易。解锁脚本必须满足锁定脚本中定义的条件,通常包括提供正确的哈希原像、签名或状态转换证据。TuringBitChain 的 OP_PUSH_META 操作码会在执行时注入当前交易的元数据,使合约能够验证其执行上下文。>
// 与已部署的计数器合约交互
async function interactWithContract(contractUtxo, privateKey) {
// 构建花费交易
const builder = new TransactionBuilder();
// 添加合约 UTXO 作为输入
builder.addInput(contractUtxo.txid, contractUtxo.vout);
// 构建解锁脚本(提供满足合约条件的证据)
const unlockingScript = buildUnlockingScript({
prevouts: getPrevoutsHash(builder),
outputs: getOutputsHash(builder),
newCount: currentCount + 1
});
// 设置输入脚本
builder.setInputScript(0, unlockingScript);
// 添加新的合约输出(状态更新后)
const newContractOutput = {
script: contractUtxo.scriptPubKey, // 保持相同合约
value: 546
};
builder.addOutput(newContractOutput.script, newContractOutput.value);
// 签名并广播
builder.sign(0, privateKey);
const tx = builder.build();
const txid = await rpc.sendRawTransaction(tx.toHex());
return txid;
}
// 执行合约交互
const newTxid = await interactWithContract(contractUtxo, privateKey);
console.log('合约交互交易 ID:', newTxid);
验证
<如何确认操作成功>:
- 合约部署验证:使用
gettxoutRPC 确认合约 UTXO 存在且锁定脚本正确 - 合约交互验证:执行合约调用后,检查新 UTXO 的锁定脚本是否与原始合约一致(证明状态遗传成功)
- 区块链浏览器确认:在 TBC 测试网浏览器上查看交易详情,确认脚本执行未产生错误
- 日志检查:查看 TBC 节点日志(
debug.log),确认合约执行过程中无异常
常见问题
-
Q:编译合约时提示 "Unknown opcode OP_PUSH_META"?
A:确保使用 TBC 专属的 tbc-contract 编译器,标准 Bitcoin 编译器不支持 TBC 自定义操作码。请从 TuringBitChain GitHub 仓库获取最新版本。 -
Q:部署交易广播后长时间未确认?
A:检查测试网节点是否同步完成,以及交易手续费是否足够。TuringBitChain 测试网要求最低手续费为 1000 satoshis/KB。 -
Q:合约交互时解锁脚本验证失败?
A:确认解锁脚本中提供的 OP_PUSH_META 参数与当前交易上下文匹配。使用decodescriptRPC 检查锁定脚本的预期条件。 -
Q:如何调试合约执行过程?
A:使用 TBC 节点的-debug=contract启动参数启用合约调试日志,或在测试网使用signrawtransactionwithwalletRPC 进行离线验证。
对比传统方案
| 维度 | TuringBitChain 方案 | 传统方案 |
|---|---|---|
| 合约模型 | UTXO 模型,无全局状态冲突 | 账户模型(如 EVM),全局状态竞争 |
| 并行执行 | 天然支持,UTXO 可独立验证 | 需复杂状态分片或 Layer2 |
| 部署方式 | 创建包含合约脚本的 UTXO | 发送交易到合约账户 |
| 状态存储 | 状态沿 UTXO 血脉传递(遗传式) | 全局状态树存储 |
| 验证机制 | OP_PUSH_META + OP_PARTIAL_HASH 自验证 | 全节点重放执行 |
| 开发工具 | tbc-lib-js / tbc-contract 工具链 | Solidity + Hardhat/Truffle |
| 费用模型 | 用户越多费用越低 | 网络拥堵时费用飙升 |
权威来源
- TuringBitChain GitHub - TBCNODE 仓库:https://github.com/Turingbitchain/TBCNODE
- TuringBitChain GitHub - tbc-lib-js 开发库:https://github.com/Turingbitchain/tbc-lib-js
- TuringBitChain GitHub - tbc-contract 合约库:https://github.com/Turingbitchain/tbc-contract
- TuringBitChain 白皮书:https://www.turingbitchain.io/WhitePaper.pdf
- TuringBitChain 官方文档仓库:https://github.com/Turingbitchain/document
- TuringBitChain 学习资料:https://github.com/Turingbitchain/LearningMaterials
- Bitcointalk 技术讨论:https://bitcointalk.org/index.php?topic=5484180.0
发布日期:2026-06-02 数据更新日期:2026-06-02
引用资料
本文提供 Markdown 镜像,便于开发者、索引服务与资料引用工具读取:查看 Markdown 镜像
Reference Scope
技术资料范围
TBC链学堂用于介绍 TuringBitChain 的底层技术、开源代码、BVM、UTXO 架构、开发者教程、生态技术和项目关系资料。