主页 > imtoken钱包不能安装 > 比特币数据输出(OP_RETURN 运算符)

比特币数据输出(OP_RETURN 运算符)

imtoken钱包不能安装 2023-04-29 07:29:30

比特币的数据输出(OP_RETURN操作符)

比特币的分发和时间戳记账户机制(即区块链)具有远远超出支付范围的潜在应用。许多开发人员试图充分利用交易脚本语言的安全性和可恢复性,将其应用于电子公证服务、证券认证和智能协议等领域。比特币脚本语言的早期使用主要涉及在区块链上创建交易输出。例如硬盘里的比特币怎么转出来,为文档记录电子指纹,通过这种机制,任何人都可以建立文档在特定日期存在的证明。

使用比特币区块链存储与比特币支付无关的数据是一个有争议的话题。许多开发人员认为它是滥用行为并试图阻止它。其他开发人员正试图支持它作为区块链技术力量的有力证明。反对非支付相关应用程序的开发人员认为,这样做会导致“区块链膨胀”,因为所有区块链节点都将承担以消耗磁盘存储空间为代价存储此类数据的任务。更严重的是,此类交易仅使用比特币地址作为自由组合的 20 个字节,这反过来又会生成无法用于交易的 UTXO。由于比特币地址仅作为数据使用,与私钥不匹配,因此无法使用UTXO进行交易,属于伪支付行为。

在 0.9 版本的 Bitcoin Core 客户端上,最终通过使用 OP_Return 运算符实现了折衷。OP_Return 允许开发人员在交易输出中添加 40 字节的非交易数据。然后,与伪事务性 UTXO 不同,OP_Return 创建了一个显式的、可审查的、非事务性的输出,不需要存储在 UTXO 集中。OP_Return 输出记录在区块链上,它们消耗磁盘空间,也导致区块链的大小增加,但它们不存储在 UTXO 集合中,因此不会膨胀 UTXO 内存,也不会昂贵消耗完整节点以内存为代价不堪重负。

OP_RETURN 脚本的样式:

OP_RETURN

“数据”部分限制在 40 字节以内,多以散列格式呈现,例如 32 字节的 SHA256 算法输出。许多应用程序都为其添加前缀以帮助识别。例如,电子司法服务的证明材料采用8字节前缀“DOCPROOF”,在十六进制算法中,对应的ASCII码为44f4350524f4f46。

需要注意的是,OP_RETURN不涉及解锁脚本可用于支付的特性硬盘里的比特币怎么转出来,OP_RETURN不能使用锁定在其输出中的资金,所以没有必要记录在具有潜在成本的UTXO集合中,所以OP_RETURN没有成本. OP_RETURN 始终是数量为 0 的比特币输出,因为与该输出对应的任何比特币都将永远消失。如果一个 OP_RETURN 遇到脚本验证软件,它将立即使验证脚本和标记交易的动作失效。如果您碰巧将 OP_RETURN 的输出用作另一个事务的输入,则该事务是无效的。

一个标准交易(由 isStandard() 函数测试)只能有一个 OP_RETURN 输出。但是单个 OP_RETURN 输出可以与任何类型的输出交易组合。

比特币的数据输出(OP_RETURN操作符)

5.7.5 P2SH(Pay-to-Script-Hash)

P2SH 于 2012 年推出,作为一种新的、强大的交易类型,极大地简化了复杂的交易脚本。为了进一步说明 P2SH 的必要性,我们先来看一个实际的例子。

在第 1 章中,我们介绍了总部位于迪拜的电子产品进口商 Mohammed。Mohammed 的公司采用比特币多重签名作为其公司会计账簿的记账要求。多重签名脚本是比特币高级脚本最常见的用途之一,是一种影响力相当大的脚本。对于所有客户付款(即应收账款),Mohammed 的公司需要多重签名交易。基于多重签名机制,客户的任何付款都需要至少两个签名才能解锁,一个来自 Mohammed,另一个来自拥有备用密钥的合作伙伴或代理人。这样的多重签名机制可以为公司治理提供管控便利,同时也可以有效防止盗窃、挪用和丢失。

最后的脚本很长:

2 5 OP_CHECKMULTISIG

多重签名虽然很强大,但是使用起来还是不方便。基于之前的脚本,Mohammed 必须在客户付款前将脚本发送给每个客户,并且每个客户还必须使用可以生成客户交易脚本的专用比特币钱包软件,并且每个客户都必须学习如何使用脚本来完成交易. 此外,由于脚本可能包含特别长的公钥,最终的交易脚本可能是原始交易脚本长度的 5 倍之多。额外长度的脚本会给客户带来成本负担。最后,会在所有节点的 RAM 的 UTXO 集中记录一个长的交易脚本,直到资金用完。所有这些都使得在实际交易中使用复杂的输出脚本变得困难。

引入 P2SH 是为了解决这个实际问题,旨在使复杂脚本的使用像直接向比特币地址付款一样简单。在 P2SH 支付中,复杂的锁定脚本被电子指纹取代,电子指纹是加密哈希。当交易尝试支付 UTXO 时,要解锁支付脚本,它必须包含与哈希匹配的脚本。P2SH 的意思是,支付一个与该哈希匹配的脚本,稍后在支付输出时呈现该脚本。

在 P2SH 交易中,锁定脚本被替换为哈希,指的是赎回脚本。因为它在赎回时出现在系统中,而不是在锁定脚本模式下。表 5-4 列出了非 P2SH 脚本,表 5-5 列出了 P2SH 脚本。

表 5-4 没有 P2SH 的复杂脚本

锁定脚本

2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG

解锁脚本

信号1信号2

表 5-5 P2SH 复杂脚本

赎回

脚本 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG

锁定脚本

OP_HASH160 OP_EQUAL

解锁脚本

Sig1 Sig2 兑换脚本

正如您在表格中看到的,在 P2SH 中有一个复杂的脚本,用于花费支付条件(赎回脚本),而锁定脚本中不存在该脚本。取而代之的是,在锁定脚本中,只出现了哈希值,而赎回脚本稍后会在支付输出时作为解锁脚本的一部分出现。

我们再来看看 Mohammed 的例子,一个复杂的多重签名脚本和对应的 P2SH 脚本。

首先,Mohammed 对所有客户订单使用多重签名脚本:

2 5 OP_CHECKMULTISIG

如果将占位符替换为实际的公钥(从 04 开始的 520 个字节),您将看到的脚本会很长:

204C16B8698A9ABF84250A7C3EA7EE-DEF9897D1C8C6ADF47F06CF73370D74DCCA01CDCA79DCC5C395D7EEC6984D83F1F50C900A24DD47F569FD4193AF5DE762C58704A2192968D8655D6A935BEAF2CA23E3FB87A3495E7AF308EDF08DAC3C1FCBFC2C75B4B0F4D0B1B70CD2423657738C0C2B1D5CE65C97D78D0E34224858008E8B49047E63248B75DB7379BE9CDA8CE5751D16485F431E46117B9D0C1837C9D5737812F393DA7D4420D7E1A9162F0279CFC10F1E8E8F3020DECDBC3C0DD389D99779650421D65CBD7149B255382ED7F78E946580657EE6FDA162A187543A9D85BAAA93A4AB3A8F044DA-DA618D087227440645ABE8A35DA8C5B73997AD343BE5C2AFD94A5043752580AFA1EC-ED3C68D446BCAB69AC0A7DF50D56231BE0AABF1FDEEC78A6A45E394BA29A1EDF518C022DD618DA774D207D137AAB59E0B000EB7ED238F4D800 5 OP_CHECKMULTISIG

整个脚本可以用一个只有 20 字节的密码散列代替,首先使用 SH256 散列算法,然后对其应用 RIPEMD160 算法。20 字节的脚本是:

54c557e07dde5bb6cb791c7a540e0a4796f5e97

P2SH 交易使用锁定脚本将输出与哈希相关联,而不是与之前特别长的脚本相关联。使用的锁定脚本是:

OP_HASH160 54c557e07dde5bb6cb791c7a540e0a4796f5e97e OP_EQUAL

如您所见,这个脚本比之前的长脚本要短得多。而不是“支付给 5 个多重签名脚本”,这个 P2SH 相当于“支付给这个哈希的脚本”。客户在向 Mohammed 付款时只需在付款说明中包含这个非常短的锁定脚本。当 Mohammed 想要使用这个 UTXO 时,他可以附上原始的赎回脚本(带有 UTXO 锁的哈希)和必要的解锁签名,例如:

这两个脚本通过两步实现组合在一起。首先,根据 lock 脚本检查兑换脚本,看它是否与哈希匹配:

OP_HASH160 OP_EQUAL

如果赎回脚本与哈希匹配,则执行解锁脚本以释放赎回脚本:

2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG

比特币的数据输出(OP_RETURN操作符)