sCrypt智能合约如何解决比特币上的安全挑战?

sCrypt是一种基于TypeScript的嵌入式领域特定语言(eDSL),专为在比特币链上编写智能合约而设计。sCrypt智能合约使用比特币支持的操作码,可以编译成Bitcoin Script。由此生成的类似汇编的脚本可用作交易中的锁定脚本。

本文将探讨sCrypt智能合约背后的概念,以及使用sCrypt编程的一些最佳实践和安全检查清单。

使用sCrypt编写智能合约:一个简单示例

比特币上的智能合约使用UTXO模型,每笔比特币交易由输入和输出组成:

输出包含:
- 比特币的数量
- 字节码(称为locking script,“锁定脚本”)

输入包含:
- 对上一笔交易输出的引用
- 字节码(unlocking script,“解锁脚本”)

未花费交易输出(UTXO)是指在任何交易中尚未被消耗的输出。低级字节码/操作码,称为Bitcoin Script,由比特币虚拟机解释执行。比特币支持的操作码可以编译为Bitcoin Script。生成的类似汇编的脚本用作交易中的锁定脚本。

如上图展示的两个交易,每个交易都有一个输入(绿色)和一个输出(红色)。右侧的交易使用了左侧交易的输出。锁定脚本可以视为一个布尔函数f(x),它定义了花费UTXO中比特币的条件,起到"锁"的作用。解锁脚本则提供了使f(x)结果为true的函数参数,充当"钥匙"来解锁它。只有当输入中的"钥匙"与先前输出的"锁"匹配时,才能花费该输出中包含的比特币。

在标准的比特币支付中,锁定脚本是"Pay To Pubkey Hash"(P2PKH)。它用于验证付款人是否拥有与地址对应的正确私钥,从而使他们能够在解锁脚本中生成有效的签名。sCrypt语言使得锁定脚本可以指定比简单的P2PKH更加复杂的花费条件,即P2TR/P2SH交易中的比特币智能合约。

sCrypt的智能合约在概念上类似于面向对象编程中的类。每个包都为特定类型的合约(例如P2PKH或多签名)提供了模板,可以实例化为具体的可执行合约对象。

部署和调用sCrypt智能合约

sCrypt使用支付到见证脚本哈希(P2WSH)来部署合约。部署过程包括将智能合约代码编译成脚本,对该脚本进行哈希处理,然后将哈希值放入一个P2WSH交易(Tx0),并将其广播到网络。当有人要调用已部署的合约时,他们会将完整的合约脚本和被调用方法的输入作为见证数据嵌入到花费Tx0的后续事务(Tx1)中。

部署和交易调用示意图展示了输入(绿色)与输出(红色)的交互关系。该图帮助理解如何通过哈希处理合约脚本,并将其嵌入到区块链中。

左侧表示输入,右侧表示输出的交易结构,形象展示了P2WSH部署机制及合约调用时的交易结构。

已知的sCrypt局限性

sCrypt可以在任何支持Bitcoin Script的区块链上运行,包括比特币分叉链和基于比特币的链,如Litecoin和Dogecoin。比特币禁用了许多脚本操作码,如OP_CAT和OP_MUL,这地限制了sCrypt能表述的智能合约类型。比特币社区正在积极讨论重新启用这些操作码并引入新的操作码。如果变更的提议得到采纳,sCrypt在比特币上的功能将比现在更。

与此同时,有些区块链具备完整的脚本操作码,例如比特币SV和MVC。如今,sCrypt在这些链上已达到满负荷运行。

回溯至创世问题(Back-to-Genesis)

使用sCrypt的智能合约实现同质化代币(FT)和非同质化代币(NFT)时,会引发回溯至创世问题,这是一个的安全挑战。该问题涉及在基于UTXO的区块链中追踪代币的创建交易。在比特币等区块链上,通过sCrypt创建的代币以UTXO形式存在,并可能被频繁转移。B2G问题的关键在于,当试图追踪或验证代币的完整历史记录时,需要找到其创世交易,以确认代币的来源和真实性。

▌伪造攻击示意图

上图展示了两种伪造基于sCrypt的FT和NFT的方法。每个框代表一个交易,左侧是输入,右侧是输出。箭头指向表示交易间的流转过程。具有相同输出颜色的交易使用相同的合约代码。

Back-to-Genesis问题可能会引发代币协议中的:
- 重放攻击(Replay Attack):攻击者可能会重新发行相同的代币
- 中间人攻击(Man-in-the-Middle Attack):攻击者可以从一个不相关的UTXO开始,复制交易链

解决方案

为了解决重放攻击,建议实施全局唯一的"GenesisID",代表发行交易的交易ID(txid)。当发行UTXO被消费时,该ID会被复制,并作为代币ID保留在所有后续代币传输UTXO中。

使用发行交易的TXID作为唯一的TokenID,确保代币来源的唯一性和可追溯性。

▌回溯验证机制

提前两步验证示意图展示了如何通过验证前两个交易来防止中间人攻击。当伪造的UTXO(UTXO1)被花费到另一个代币UTXO(UTXO2)时,通过验证UTXO1和UTXO2的合约一致性,可有效阻止攻击。

sCrypt安全提示与检查清单

以下是CertiK在完成对基于sCrypt的FT/NFT项目审计后总结的安全提示:

1. 验证代币的回溯准确性

通过验证UTXO的锁定脚本代码段是否与前一个UTXO匹配,确保代币历史真实连续。

2. 防伪造创世ID攻击

检查的genesisTxid是否与创世交易或前一个交易的ID匹配,确保代币来源的真实性。

3. 确认UTXO输入合法性

验证tokenTxHeader、prevTokenInputIndex、tokenTxInputProof等参数,防止伪造交易。

  1. 确保代币解锁授权 代币可以由所有者直接解锁,或通过智能合约解锁。必须验证有效签名,禁止解锁被烧毁的代币。
  2. 保持代币数量平衡 确保输入输出的代币总量相等,防止双花攻击。
  3. 选择适当SigHash类型 推荐使用SIGHASH_ALL标志,谨慎使用其他类型以避免安全漏洞。
  4. 验证合约完整性 通过比对脚本哈希值验证合约代码未被篡改。
  5. 验证交易完整性 使用sCrypt的Tx库检查整个交易预映像。
  6. 验证数据完整性 确保锁定脚本数据字段在正确索引位置访问存储。

总结

sCrypt作为一种比特币智能合约开发语言,为开发者提供了丰富的可能性。从回溯验证到防伪造代币和完整性检查,本文总结的安全提示与最佳实践建议,来源于业内领先的审计机构与开发者的实际经验。希望这些内容能够为开发者提供有价值的参考,助力构建更加安全、高效的Web3.0应用。

标签:

上一篇:去中心化存在哪些缺点?比特币作为典型代表将面临哪些挑战?
下一篇:比特币交易卡住怎么办?RBF与CPFP策略解析