Skip to content

Commit

Permalink
feature: add example explain
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel6075 committed Oct 25, 2024
1 parent dd60e16 commit 24d5b52
Showing 1 changed file with 60 additions and 0 deletions.
60 changes: 60 additions & 0 deletions BTC/Advanced/OP_CAT/example/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
你是对的,我在之前的示例中没有明确给出与 `OP_EQUAL` 验证的内容。在比特币脚本中,`OP_EQUAL` 用于验证栈顶两个元素是否相等。因此,我们需要在脚本中明确指定连接后的结果,并与这个结果进行比较。

### 完整示例

下面是一个更新后的示例,展示如何使用 `OP_CAT` 实现智能合约,并在脚本中验证连接后的结果是否等于 "HelloWorld":

```javascript
const bitcoin = require('bitcoinjs-lib');

// 创建一个包含 OP_CAT 的脚本
function createScript() {
// 连接的目标结果
const target = Buffer.from('HelloWorld');

const script = bitcoin.script.compile([
bitcoin.opcodes.OP_DUP,
bitcoin.opcodes.OP_HASH160,
Buffer.from('...'), // 使用适当的公钥哈希
bitcoin.opcodes.OP_EQUALVERIFY,
bitcoin.opcodes.OP_CHECKSIG,
// 连接两个字符串
Buffer.from('Hello'), // 第一个元素
Buffer.from('World'), // 第二个元素
bitcoin.opcodes.OP_CAT, // 连接操作
target, // 连接后的目标结果
bitcoin.opcodes.OP_EQUAL // 验证连接结果是否等于 'HelloWorld'
]);

return script;
}

// 创建和打印 P2SH 地址
function createP2SHAddress() {
const script = createScript();
const { address } = bitcoin.payments.p2sh({ redeem: { output: script, network: bitcoin.networks.bitcoin } });

console.log('P2SH Address:', address);
}

createP2SHAddress();
```

### 代码解析

1. **连接后的目标结果**
- 我们定义了一个 `target` 变量,表示连接后的目标结果 `HelloWorld`。在脚本中,我们将这个目标结果与连接后的结果进行比较。

2. **脚本逻辑**
- `OP_CAT``Buffer.from('Hello')``Buffer.from('World')` 连接起来,结果是 `HelloWorld`
- 然后,`target`(即 `HelloWorld`)被推入栈中。
- 最后,`OP_EQUAL` 用于检查连接的结果是否与 `target` 相等。

### 注意事项

- **脚本验证**:在比特币的环境中,脚本通常是在执行交易时被验证。因此,这段脚本需要在合适的环境中进行测试。
- **公钥哈希**:在实际应用中,`Buffer.from('...')` 应替换为实际的公钥哈希。

### 结论

现在这个脚本清楚地验证了连接后的结果是否与预期值 `HelloWorld` 相等。这种方式展示了如何在比特币脚本中使用 `OP_CAT` 进行数据连接和验证。虽然比特币的脚本语言有一定的限制,但通过合理组合操作码,依然可以实现复杂的逻辑。

0 comments on commit 24d5b52

Please sign in to comment.