对于一个算法 f,两个互不信任的参与者,Alice 和 Bob,可以通过以下方式建立信任:
对于上述 2、3 和 4,设 x 为 Layer2 交易和初始状态,f 为 Layer2 共识程序,y 为交易的最终状态,这与区块链的 Layer2 扩展解决方案相对应。
表 1:建立信任的方法
另外,需要特别注意的是:
目前,得益于 Solidity 的图灵完备智能合约,欺诈证明和有效性证明技术在以太坊的 Layer2 扩展中得到了广泛应用。然而,在比特币的框架下,由于比特币的操作码功能有限、栈元素数量仅为 1000 以及其他限制,这些技术的应用仍处于探索阶段。本文总结了比特币框架下的局限性和突破性技术,研究了有效性证明和欺诈证明技术,并概述了比特币框架下独特的脚本分段技术。
在比特币的框架下存在许多局限性,但可以通过各种巧妙的方法或技术来克服这些局限性。例如,使用比特承诺可以突破 UTXO 的无状态限制,Taproot 可以解决脚本空间的限制,连接器输出可以克服 UTXO 消费方式的限制,而智能合约则可以突破预签名的限制。
比特币采用 UTXO 模型,其中每个 UTXO 都被锁定在一个锁定脚本中,该脚本定义了消费该 UTXO 所需满足的条件。比特币脚本存在以下限制:
当前,比特币脚本是完全无状态的。在执行比特币脚本时,每个脚本的执行环境在完成后会被重置。这使得比特币脚本无法原生支持约束脚本 1 和 2 共享相同的 x 值。不过,这个问题可以通过一些方法来解决,核心思想是以某种方式对一个值进行签名。如果能够为一个值生成签名,就能够实现有状态的比特币脚本。换句话说,通过检查脚本 1 和 2 中 x 值的签名,可以确保在这两个脚本中使用相同的 x 值。如果存在冲突的签名,即对同一个变量 x 签署了两个不同的值,则可以施加惩罚。这种方法被称为比特承诺。
比特承诺的原理相对简单。每个比特都对应两个不同的哈希值,hash0 和 hash1。如果待签名的比特值为 0,则揭示 hash0 的前像;如果比特值为 1,则揭示 hash1 的前像。
以单个比特消息 m ∈ {0,1} 为例,相应的比特承诺解锁脚本仅由一些前像构成:如果比特值为 0,则解锁脚本为 preimage0——“0xfa7fa5b1dea37d71a0b841967f6a3b119dbea140”;如果比特值为 1,则解锁脚本为 preimage1——“0x47c31e611a3bd2f3a7a42207613046703fa27496”。因此,通过比特承诺,可以突破 UTXO 的无状态限制,实现有状态的比特币脚本,进而使得各种有趣的新特性成为可能。
OP_HASH160
OP_DUP
0xf592e757267b7f307324f1e78b34472f8b6f46f3> // 这是hash1
OP_EQUAL
OP_DUP
OP_ROT
0x100b9f19ebd537fdc371fa1367d7ccc802dc2524> // 这是hash0
OP_EQUAL
OP_BOOLOR
OP_VERIFY
// 现在比特承诺的值在栈上。可以是 “0” 或 “1”。
目前,比特承诺有两种实现方式:
目前,BitVM2 库实现了基于 Blake3 哈希函数的 Winternitz 签名。对应于单个比特的签名长度约为 26 字节。因此,可以看出,通过比特承诺引入状态是有成本的。因此,在 BitVM2 的实现中,消息首先被哈希以获得 256 位的哈希值,然后对该哈希值进行比特承诺,以节省开销,而不是直接对原始较长消息的每个比特进行承诺。
比特币的 Taproot 软分叉升级于 2021 年 11 月激活,包含三个提案:Schnorr 签名(BIP 340)、Taproot(BIP 341)和 TapScript(BIP 342)。该升级引入了一种新的交易类型——Pay-to-Taproot(P2TR)交易。通过结合 Taproot、MAST(Merkel 抽象语法树)和 Schnorr 签名的优势,P2TR 交易能够创建更私密、更灵活且可扩展的交易格式。
P2TR 支持两种支出方式:通过密钥路径或脚本路径进行支出。根据 Taproot(BIP 341)的规定,当通过脚本路径支出时,相应的 Merkle 路径长度不能超过 128。这意味着 taptree 中的 tapleaf 数量不能超过 2^128。自 2017 年 SegWit 升级以来,比特币网络以权重单位衡量区块大小,最大支持 400 万权重单位(约 4MB)。当 P2TR 输出通过脚本路径支出时,仅需揭示一个单一的 tapleaf 脚本,这意味着区块中只包含一个 tapleaf 脚本。因此,对于 P2TR 交易,每个 tapleaf 对应的脚本大小最大可达约 4MB。然而,根据比特币的默认政策,许多节点只转发小于 400K 的交易;更大的交易需要与矿工合作进行打包。
Taproot 带来的脚本空间溢价使得使用现有操作码模拟诸如乘法和哈希等密码学操作变得更加有价值。在基于 P2TR 构建可验证计算时,脚本大小不再受 4MB 限制,而可以拆分为多个子功能,分布在多个 tapleaf 中,从而突破 4MB 的脚本空间限制。实际上,当前 BitVM2 中实现的 Groth16 验证器算法的大小高达 2GB。然而,它可以被拆分并分布在大约 1000 个 tapleaf 中,并通过与比特承诺相结合,约束每个子功能的输入和输出之间的一致性,从而确保整个计算的完整性和正确性。
目前,比特币为单个未花费交易输出(UTXO)提供两种原生支出方式:通过脚本或公钥支出。因此,只要满足正确的公钥签名或脚本条件,UTXO 就可以被支出。两个 UTXO 可以独立支出,且不能添加限制来约束这两个 UTXO,这意味着必须满足额外条件才能支出它们。
然而,Ark 协议的创始人 Burak 聪明地利用 SIGHASH 标志实现了连接器输出。具体来说,Alice 可以创建一个签名将她的 BTC 发送给 Bob。由于签名可以承诺多个输入,Alice 可以将她的签名设为条件:只有在第二个输入被消耗时,Taketx 交易的签名才是有效的。第二个输入被称为连接器,它将 UTXO A 和 UTXO B 连接起来。换句话说,Taketx 交易只有在 UTXO B 没有被 Challengetx 消耗时才是有效的。因此,通过销毁连接器输出,可以阻止 Taketx 交易的有效性。
图 1:连接器输出示意图
在 BitVM2 协议中,连接器输出起到 if…else 函数的作用。一旦连接器输出被某个交易支出,它就无法被其他交易再次支出,从而确保其独占性。在实际部署中,为了允许挑战-响应周期,引入了带时间锁的额外 UTXO。此外,连接器输出还可以根据需要设置不同的支出策略,例如在挑战交易的情况下允许任何一方支出,而在响应交易的情况下仅允许操作员支出或在超时后允许任何人支出。
目前,比特币脚本主要限制解锁条件,而不限制未花费交易输出(UTXO)如何进一步支出。这是因为比特币脚本无法读取交易本身的内容,无法实现对交易的自省。如果比特币脚本能够检查交易的任何内容(包括输出),那么就能实现合约功能。
当前的合约实现可以分为两类:
有效性证明和欺诈证明都可以用于比特币的 Layer2 扩展,其主要区别见表 2。
表 2:有效性证明与欺诈证明
基于比特承诺、Taproot、预签名和连接器输出,可以构建基于比特币的欺诈证明。同时,通过引入合约操作码(例如 OP_CAT),也可以基于 Taproot 构建比特币的有效性证明。此外,欺诈证明还可以根据 Bob 是否有入场系统分为许可欺诈证明和无许可欺诈证明。在许可欺诈证明中,只有特定群体能够作为 Bob 发起挑战,而在无许可欺诈证明中,任何第三方都可以作为 Bob 发起挑战。无许可欺诈证明的安全性优于许可欺诈证明,因为它降低了参与者之间勾结的风险。
根据 Alice 和 Bob 之间的挑战-响应交互次数,欺诈证明可以分为单轮欺诈证明和多轮欺诈证明,如图 2 所示。
图 2:单轮欺诈证明与多轮欺诈证明
如表 3 所示,欺诈证明可以通过不同的交互模型实现,包括单轮交互模型和多轮交互模型。
表 3:单轮交互与多轮交互
在比特币的 Layer2 扩展范式中,BitVM1 采用多轮欺诈证明机制,而 BitVM2 则采用单轮欺诈证明机制,bitcoin-circle stark 则利用有效性证明。在这几种机制中,BitVM1 和 BitVM2 可以在不修改比特币协议的情况下实现,而 bitcoin-circle stark 则需要引入新的操作码 OP_CAT。
对于大多数计算任务,比特币的 signet、testnet 和 mainnet 无法完全支持 4MB 的脚本,因此需要使用脚本拆分技术,即将完整的计算脚本拆分为小于 4MB 的块,并分布在不同的 Tapleaf 中。
如表 3 所示,多轮欺诈证明适合那些希望减少链上仲裁计算,或无法一步定位问题计算段的情况。多轮欺诈证明顾名思义,需要证明者和验证者之间进行多轮交互,以找到问题计算段,然后根据这些段进行仲裁。
Robin Linus 的早期 BitVM 白皮书(通常称为 BitVM1)采用了多轮欺诈证明。假设每个挑战期持续一周,并使用二分搜索方法来定位问题计算段,Groth16 验证器的链上挑战响应期可能会延长至 30 周,导致时效性差。虽然目前有团队在研究比二分搜索更高效的 n-ary 搜索方法,但其时效性仍显著低于单轮欺诈证明的 2 周周期。
目前,比特币中的多轮欺诈证明使用许可挑战,而单轮欺诈证明则实现了无许可挑战方法,从而降低了参与者之间勾结的风险,增强了安全性。为此,Robin Linus 充分利用了 Taproot 的优势来优化 BitVM1,不仅将交互轮数减少到一轮,还将挑战方法扩展为无许可方式,尽管这增加了链上仲裁计算的成本。
在这种模型中,欺诈证明的验证只需证明者和验证者之间进行一次交互。验证者只需发起一次挑战,而证明者只需回应一次。在回应中,证明者必须提供证据,证明他们的计算是正确的。如果验证者在证据中发现不一致之处,则挑战成功;否则,挑战失败。单轮交互欺诈证明的特征如表 3 所示。
图 3:单轮欺诈证明
2024年8月15日,Robin Linus 发布了《BitVM2:将比特币连接到第二层》的技术白皮书,其中实现了一种跨链桥,采用了类似于图 3 所示的单轮欺诈证明方法。
OP_CAT 是比特币发布时脚本语言的一部分,但因安全漏洞在2010年被禁用。尽管如此,比特币社区多年来一直在讨论重新启用 OP_CAT 的可能性。目前,OP_CAT 被分配了编号 347,并已在比特币的 signet 网络上启用。
OP_CAT 的主要功能是将堆栈中的两个元素合并,并将结果推回堆栈。这一功能为比特币上的合约和 STARK 验证器提供了新的可能性:
尽管在 SNARK/STARK 证明后,验证证明所需的计算负载远低于直接运行原始计算 f 的负载,但在将其转换为比特币脚本以实现验证器算法时所需的脚本量依然庞大。目前,基于现有的比特币操作码,优化后的 Groth16 和 Fflonk 验证器脚本的大小均超过 2GB,而单个比特币区块的大小仅为 4MB,因此无法在单个区块内运行整个验证器脚本。然而,自 Taproot 升级以来,比特币支持通过 tapleaf 执行脚本,这使得验证器脚本可以拆分为多个块,每个块作为一个 tapleaf 来构建 taptree。块之间的一致性可以通过位承诺来保证。
在 OP_CAT 合约的情况下,STARK 验证器可以拆分为多个小于 400KB 的标准交易,从而使整个 STARK 有效性证明的验证可以在不需要与矿工合作的情况下完成。
本节将重点介绍在现有条件下比特币脚本的拆分技术,而不引入或激活任何新的操作码。
在进行脚本拆分时,需要平衡以下几个方面的信息:
目前,脚本拆分的方法可以分为以下三类:
例如,经过多轮优化,Groth16 验证器的脚本大小已从约 7GB 降低至大约 1.26GB。除了整体的计算优化外,每个块也可以进行单独优化,以充分利用栈空间。例如,通过引入更高效的查找表算法,并动态加载和卸载查找表,可以进一步减小每个块的脚本大小。
由于 Web2 编程语言的计算成本和运行环境与比特币脚本截然不同,因此简单地将现有算法实现转换为比特币脚本并不可行。因此,需要考虑针对比特币场景的特定优化:
本文首先探讨了比特币脚本的局限性,并讨论了几种解决方案:利用比特币承诺克服 UTXO 的无状态限制,使用 Taproot 以突破脚本空间的限制,通过连接输出绕过 UTXO 支出方法的限制,以及通过合约来解决预签名的限制。接着,文章对欺诈证明和有效性证明的特征进行了全面的概述,包括许可与无许可欺诈证明的特点、一轮与多轮欺诈证明的区别,以及比特币脚本拆分技术的相关内容。
对于一个算法 f,两个互不信任的参与者,Alice 和 Bob,可以通过以下方式建立信任:
对于上述 2、3 和 4,设 x 为 Layer2 交易和初始状态,f 为 Layer2 共识程序,y 为交易的最终状态,这与区块链的 Layer2 扩展解决方案相对应。
表 1:建立信任的方法
另外,需要特别注意的是:
目前,得益于 Solidity 的图灵完备智能合约,欺诈证明和有效性证明技术在以太坊的 Layer2 扩展中得到了广泛应用。然而,在比特币的框架下,由于比特币的操作码功能有限、栈元素数量仅为 1000 以及其他限制,这些技术的应用仍处于探索阶段。本文总结了比特币框架下的局限性和突破性技术,研究了有效性证明和欺诈证明技术,并概述了比特币框架下独特的脚本分段技术。
在比特币的框架下存在许多局限性,但可以通过各种巧妙的方法或技术来克服这些局限性。例如,使用比特承诺可以突破 UTXO 的无状态限制,Taproot 可以解决脚本空间的限制,连接器输出可以克服 UTXO 消费方式的限制,而智能合约则可以突破预签名的限制。
比特币采用 UTXO 模型,其中每个 UTXO 都被锁定在一个锁定脚本中,该脚本定义了消费该 UTXO 所需满足的条件。比特币脚本存在以下限制:
当前,比特币脚本是完全无状态的。在执行比特币脚本时,每个脚本的执行环境在完成后会被重置。这使得比特币脚本无法原生支持约束脚本 1 和 2 共享相同的 x 值。不过,这个问题可以通过一些方法来解决,核心思想是以某种方式对一个值进行签名。如果能够为一个值生成签名,就能够实现有状态的比特币脚本。换句话说,通过检查脚本 1 和 2 中 x 值的签名,可以确保在这两个脚本中使用相同的 x 值。如果存在冲突的签名,即对同一个变量 x 签署了两个不同的值,则可以施加惩罚。这种方法被称为比特承诺。
比特承诺的原理相对简单。每个比特都对应两个不同的哈希值,hash0 和 hash1。如果待签名的比特值为 0,则揭示 hash0 的前像;如果比特值为 1,则揭示 hash1 的前像。
以单个比特消息 m ∈ {0,1} 为例,相应的比特承诺解锁脚本仅由一些前像构成:如果比特值为 0,则解锁脚本为 preimage0——“0xfa7fa5b1dea37d71a0b841967f6a3b119dbea140”;如果比特值为 1,则解锁脚本为 preimage1——“0x47c31e611a3bd2f3a7a42207613046703fa27496”。因此,通过比特承诺,可以突破 UTXO 的无状态限制,实现有状态的比特币脚本,进而使得各种有趣的新特性成为可能。
OP_HASH160
OP_DUP
0xf592e757267b7f307324f1e78b34472f8b6f46f3> // 这是hash1
OP_EQUAL
OP_DUP
OP_ROT
0x100b9f19ebd537fdc371fa1367d7ccc802dc2524> // 这是hash0
OP_EQUAL
OP_BOOLOR
OP_VERIFY
// 现在比特承诺的值在栈上。可以是 “0” 或 “1”。
目前,比特承诺有两种实现方式:
目前,BitVM2 库实现了基于 Blake3 哈希函数的 Winternitz 签名。对应于单个比特的签名长度约为 26 字节。因此,可以看出,通过比特承诺引入状态是有成本的。因此,在 BitVM2 的实现中,消息首先被哈希以获得 256 位的哈希值,然后对该哈希值进行比特承诺,以节省开销,而不是直接对原始较长消息的每个比特进行承诺。
比特币的 Taproot 软分叉升级于 2021 年 11 月激活,包含三个提案:Schnorr 签名(BIP 340)、Taproot(BIP 341)和 TapScript(BIP 342)。该升级引入了一种新的交易类型——Pay-to-Taproot(P2TR)交易。通过结合 Taproot、MAST(Merkel 抽象语法树)和 Schnorr 签名的优势,P2TR 交易能够创建更私密、更灵活且可扩展的交易格式。
P2TR 支持两种支出方式:通过密钥路径或脚本路径进行支出。根据 Taproot(BIP 341)的规定,当通过脚本路径支出时,相应的 Merkle 路径长度不能超过 128。这意味着 taptree 中的 tapleaf 数量不能超过 2^128。自 2017 年 SegWit 升级以来,比特币网络以权重单位衡量区块大小,最大支持 400 万权重单位(约 4MB)。当 P2TR 输出通过脚本路径支出时,仅需揭示一个单一的 tapleaf 脚本,这意味着区块中只包含一个 tapleaf 脚本。因此,对于 P2TR 交易,每个 tapleaf 对应的脚本大小最大可达约 4MB。然而,根据比特币的默认政策,许多节点只转发小于 400K 的交易;更大的交易需要与矿工合作进行打包。
Taproot 带来的脚本空间溢价使得使用现有操作码模拟诸如乘法和哈希等密码学操作变得更加有价值。在基于 P2TR 构建可验证计算时,脚本大小不再受 4MB 限制,而可以拆分为多个子功能,分布在多个 tapleaf 中,从而突破 4MB 的脚本空间限制。实际上,当前 BitVM2 中实现的 Groth16 验证器算法的大小高达 2GB。然而,它可以被拆分并分布在大约 1000 个 tapleaf 中,并通过与比特承诺相结合,约束每个子功能的输入和输出之间的一致性,从而确保整个计算的完整性和正确性。
目前,比特币为单个未花费交易输出(UTXO)提供两种原生支出方式:通过脚本或公钥支出。因此,只要满足正确的公钥签名或脚本条件,UTXO 就可以被支出。两个 UTXO 可以独立支出,且不能添加限制来约束这两个 UTXO,这意味着必须满足额外条件才能支出它们。
然而,Ark 协议的创始人 Burak 聪明地利用 SIGHASH 标志实现了连接器输出。具体来说,Alice 可以创建一个签名将她的 BTC 发送给 Bob。由于签名可以承诺多个输入,Alice 可以将她的签名设为条件:只有在第二个输入被消耗时,Taketx 交易的签名才是有效的。第二个输入被称为连接器,它将 UTXO A 和 UTXO B 连接起来。换句话说,Taketx 交易只有在 UTXO B 没有被 Challengetx 消耗时才是有效的。因此,通过销毁连接器输出,可以阻止 Taketx 交易的有效性。
图 1:连接器输出示意图
在 BitVM2 协议中,连接器输出起到 if…else 函数的作用。一旦连接器输出被某个交易支出,它就无法被其他交易再次支出,从而确保其独占性。在实际部署中,为了允许挑战-响应周期,引入了带时间锁的额外 UTXO。此外,连接器输出还可以根据需要设置不同的支出策略,例如在挑战交易的情况下允许任何一方支出,而在响应交易的情况下仅允许操作员支出或在超时后允许任何人支出。
目前,比特币脚本主要限制解锁条件,而不限制未花费交易输出(UTXO)如何进一步支出。这是因为比特币脚本无法读取交易本身的内容,无法实现对交易的自省。如果比特币脚本能够检查交易的任何内容(包括输出),那么就能实现合约功能。
当前的合约实现可以分为两类:
有效性证明和欺诈证明都可以用于比特币的 Layer2 扩展,其主要区别见表 2。
表 2:有效性证明与欺诈证明
基于比特承诺、Taproot、预签名和连接器输出,可以构建基于比特币的欺诈证明。同时,通过引入合约操作码(例如 OP_CAT),也可以基于 Taproot 构建比特币的有效性证明。此外,欺诈证明还可以根据 Bob 是否有入场系统分为许可欺诈证明和无许可欺诈证明。在许可欺诈证明中,只有特定群体能够作为 Bob 发起挑战,而在无许可欺诈证明中,任何第三方都可以作为 Bob 发起挑战。无许可欺诈证明的安全性优于许可欺诈证明,因为它降低了参与者之间勾结的风险。
根据 Alice 和 Bob 之间的挑战-响应交互次数,欺诈证明可以分为单轮欺诈证明和多轮欺诈证明,如图 2 所示。
图 2:单轮欺诈证明与多轮欺诈证明
如表 3 所示,欺诈证明可以通过不同的交互模型实现,包括单轮交互模型和多轮交互模型。
表 3:单轮交互与多轮交互
在比特币的 Layer2 扩展范式中,BitVM1 采用多轮欺诈证明机制,而 BitVM2 则采用单轮欺诈证明机制,bitcoin-circle stark 则利用有效性证明。在这几种机制中,BitVM1 和 BitVM2 可以在不修改比特币协议的情况下实现,而 bitcoin-circle stark 则需要引入新的操作码 OP_CAT。
对于大多数计算任务,比特币的 signet、testnet 和 mainnet 无法完全支持 4MB 的脚本,因此需要使用脚本拆分技术,即将完整的计算脚本拆分为小于 4MB 的块,并分布在不同的 Tapleaf 中。
如表 3 所示,多轮欺诈证明适合那些希望减少链上仲裁计算,或无法一步定位问题计算段的情况。多轮欺诈证明顾名思义,需要证明者和验证者之间进行多轮交互,以找到问题计算段,然后根据这些段进行仲裁。
Robin Linus 的早期 BitVM 白皮书(通常称为 BitVM1)采用了多轮欺诈证明。假设每个挑战期持续一周,并使用二分搜索方法来定位问题计算段,Groth16 验证器的链上挑战响应期可能会延长至 30 周,导致时效性差。虽然目前有团队在研究比二分搜索更高效的 n-ary 搜索方法,但其时效性仍显著低于单轮欺诈证明的 2 周周期。
目前,比特币中的多轮欺诈证明使用许可挑战,而单轮欺诈证明则实现了无许可挑战方法,从而降低了参与者之间勾结的风险,增强了安全性。为此,Robin Linus 充分利用了 Taproot 的优势来优化 BitVM1,不仅将交互轮数减少到一轮,还将挑战方法扩展为无许可方式,尽管这增加了链上仲裁计算的成本。
在这种模型中,欺诈证明的验证只需证明者和验证者之间进行一次交互。验证者只需发起一次挑战,而证明者只需回应一次。在回应中,证明者必须提供证据,证明他们的计算是正确的。如果验证者在证据中发现不一致之处,则挑战成功;否则,挑战失败。单轮交互欺诈证明的特征如表 3 所示。
图 3:单轮欺诈证明
2024年8月15日,Robin Linus 发布了《BitVM2:将比特币连接到第二层》的技术白皮书,其中实现了一种跨链桥,采用了类似于图 3 所示的单轮欺诈证明方法。
OP_CAT 是比特币发布时脚本语言的一部分,但因安全漏洞在2010年被禁用。尽管如此,比特币社区多年来一直在讨论重新启用 OP_CAT 的可能性。目前,OP_CAT 被分配了编号 347,并已在比特币的 signet 网络上启用。
OP_CAT 的主要功能是将堆栈中的两个元素合并,并将结果推回堆栈。这一功能为比特币上的合约和 STARK 验证器提供了新的可能性:
尽管在 SNARK/STARK 证明后,验证证明所需的计算负载远低于直接运行原始计算 f 的负载,但在将其转换为比特币脚本以实现验证器算法时所需的脚本量依然庞大。目前,基于现有的比特币操作码,优化后的 Groth16 和 Fflonk 验证器脚本的大小均超过 2GB,而单个比特币区块的大小仅为 4MB,因此无法在单个区块内运行整个验证器脚本。然而,自 Taproot 升级以来,比特币支持通过 tapleaf 执行脚本,这使得验证器脚本可以拆分为多个块,每个块作为一个 tapleaf 来构建 taptree。块之间的一致性可以通过位承诺来保证。
在 OP_CAT 合约的情况下,STARK 验证器可以拆分为多个小于 400KB 的标准交易,从而使整个 STARK 有效性证明的验证可以在不需要与矿工合作的情况下完成。
本节将重点介绍在现有条件下比特币脚本的拆分技术,而不引入或激活任何新的操作码。
在进行脚本拆分时,需要平衡以下几个方面的信息:
目前,脚本拆分的方法可以分为以下三类:
例如,经过多轮优化,Groth16 验证器的脚本大小已从约 7GB 降低至大约 1.26GB。除了整体的计算优化外,每个块也可以进行单独优化,以充分利用栈空间。例如,通过引入更高效的查找表算法,并动态加载和卸载查找表,可以进一步减小每个块的脚本大小。
由于 Web2 编程语言的计算成本和运行环境与比特币脚本截然不同,因此简单地将现有算法实现转换为比特币脚本并不可行。因此,需要考虑针对比特币场景的特定优化:
本文首先探讨了比特币脚本的局限性,并讨论了几种解决方案:利用比特币承诺克服 UTXO 的无状态限制,使用 Taproot 以突破脚本空间的限制,通过连接输出绕过 UTXO 支出方法的限制,以及通过合约来解决预签名的限制。接着,文章对欺诈证明和有效性证明的特征进行了全面的概述,包括许可与无许可欺诈证明的特点、一轮与多轮欺诈证明的区别,以及比特币脚本拆分技术的相关内容。