比特币脚本语言 - 第 2 篇
2024-06-28 18:31
登链社区
2024-06-28 18:31
订阅此专栏
收藏此文章

  • 原文链接:https://davidederosa.com/basic-blockchain-programming/bitcoin-script-language-part-two/
  • 译者:AI 翻译官[1],校对:翻译小组[2]
  • 本文永久链接:learnblockchain.cn/article…[3]

在 GitHub 上查看 Demo 代码"比特币脚本语言"[4]

第一部分[5]中,我介绍了用于常量和推送数据的 Script 操作码。我们正在慢慢接近你将在比特币实际交易中包含的脚本。具体来说,我们必然会在某个时候处理哈希和 ECDSA 签名,这就是为什么 Script 甚至有用于加密函数的操作码。

算术

看看一些常见的算术操作码:

操作码编码
OP_ADD93
OP_SUB94

这两者都是完全基于堆栈的操作,意味着它们不需要显式参数。OP_ADDOP_SUB)弹出堆栈顶部的两个项目并将它们相加(相减)。操作的结果然后再次推到顶部。

示例:

55 59 93 56 94

或者:

OP_5 OP_9 OP_ADD OP_6 OP_SUB

这是堆栈的演变过程:

[]
[5]
[59]
[14]
[146]
[8]

脚本返回 8。

比较

同样,脚本用于交易验证,比较是验证者的主要需求:

操作码编码
OP_EQUAL87

OP_EQUAL 弹出并比较堆栈顶部的两个项目,然后如果它们相等则推送 OP_TRUE,否则推送 OP_FALSE

示例:

02 c3 72 02 03 72 01 c0 93 87

或者:

[c3 72] [03 72] [c0] OP_ADD OP_EQUAL

这是堆栈的演变过程:

[]
[c3 72]
[c3 7203 72]
[c3 7203 72, c0]
[c3 72, c3 72]
[1]

值得注意的是,脚本最终“成功”,因为它返回 OP_TRUE

堆栈操作

这是你将用于堆栈操作的唯一操作码:

操作码编码
OP_DUP76

OP_DUP 不需要参数,它只是复制堆栈顶部的项目。

示例:

02 c3 72 02 03 72 01 c0 93 87

或者:

[b9 0c a2 fe] OP_DUP OP_EQUAL

这是堆栈的演变过程:

[]
[b9 0c a2 fe]
[b9 0c a2 fe, b9 0c a2 fe]
[1]

显然,脚本成功,因为 OP_EQUALOP_DUP 之后永远不会失败!

加密

这些操作码无疑是最有趣的:

操作码编码
OP_HASH160a9
OP_CHECKSIGac

OP_HASH160 弹出堆栈顶部的项目,对其执行 hash160,然后将结果推回。基本上,这个操作码计算出比特币 P2PKH 地址,从 ECDSA 公钥生成。

OP_CHECKSIG 弹出堆栈顶部的两个项目,第一个是 ECDSA 公钥,第二个是 DER 编码的 ECDSA 签名。之后,如果签名对该公钥有效,则推送 OP_TRUE,否则推送 OP_FALSE。这是 Script 版本的 OpenSSL 的 ECDSA_verify

这两个操作码将在下一篇文章中描述。

代码在哪里?

本章没有代码示例。最终,脚本是一个数据数组,你唯一的贡献是将操作码名称映射到原始字节。我们本可以开发一个小型的 Script 解释器,但这远远超出了我们的目标。典型的比特币客户端不会运行脚本,因为这是一个挖矿任务,所以我们的关注点只是编写矿工会接受的格式良好的脚本。

下一篇?

你学习了一些更多的 Script 操作码,包括对 ECDSA 验证至关重要的加密函数。

下一篇文章[6]中,我们将探讨密钥和地址在_比特币标准脚本_中的作用。如果你喜欢这篇文章,请分享,并使用下面的表单提出问题和评论!

我是 AI 翻译官[7],为大家转译优秀英文文章,如有翻译不通的地方,在这里[8]修改,还请包涵~



参考资料
[1]

AI 翻译官: https://learnblockchain.cn/people/19584

[2]

翻译小组: https://learnblockchain.cn/people/412

[3]

learnblockchain.cn/article…: https://learnblockchain.cn/article/8521

[4]

比特币脚本语言: https://github.com/keeshux/basic-blockchain-programming

[5]

第一部分: https://learnblockchain.cn/article/8520

[6]

下一篇文章: https://learnblockchain.cn/article/8523

[7]

AI 翻译官: https://learnblockchain.cn/people/19584

[8]

这里: https://github.com/lbc-team/Pioneer/blob/master/translations/8521.md


【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

登链社区
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开