数据记录输出(OP_RETURN)

比特币的分布式和时间戳的区块链具有超越支付的潜力。许多开发人员尝试利用交易脚本语言,利用系统的安全性和弹性进行数字公证服务等应用。早期尝试使用比特币的脚本语言进行这些用途的做法包括创建记录数据到区块链的交易输出;例如,以一种任何人都能通过引用该交易来建立文件存在的证据的方式记录对文件的承诺,以在特定日期证明该文件的存在。

使用比特币的区块链存储与比特币支付无关的数据是一个颇具争议的议题。许多人认为这种使用是滥用的,希望予以遏制。而另一些人则将其视为区块链技术强大功能的展示,并希望鼓励这种实验。反对包含非支付数据的人士认为,这给运行完整比特币节点的人带来了负担,因为他们需要承担为区块链不打算承载的数据而进行的磁盘存储成本。此外,这样的交易可能会创建无法被花费的UTXO,使用传统比特币地址作为自由格式的20字节字段。由于该地址用于存储数据,它不对应于私钥,因此生成的UTXO永远无法被花费;这是一个虚假的支付。因此,永远无法被花费的这些交易从未从UTXO集中移除,并导致UTXO数据库的大小永远增加,或者说“膨胀”。

达成的一个妥协是允许以OP_RETURN开头的输出脚本向交易输出添加非支付数据。然而,与“虚假”UTXO的使用不同,OP_RETURN操作符创建的是明确可证明无法花费的输出,不需要存储在UTXO集中。OP_RETURN输出被记录在区块链上,因此它们占用磁盘空间并导致区块链大小的增加,但它们不存储在UTXO集中,因此不会使完整节点承担更昂贵的数据库操作成本。

OP_RETURN脚本如下所示:

OP_RETURN <data>

数据部分通常代表一个哈希值,比如来自SHA256算法的输出(32字节)。一些应用程序在数据前面添加前缀以帮助识别该应用程序。例如,证明存在数字公证服务使用了8字节的前缀DOCPROOF,其ASCII编码为44 4f 43 50 52 4f 4f 46(十六进制)。

请记住,没有与OP_RETURN相对应的输入脚本,因此无法用于“花费”OP_RETURN输出。OP_RETURN输出的整个意义在于,您无法花费锁定在该输出中的资金,因此不需要将其保存在UTXO集中作为可能花费的金额:OP_RETURN输出可以明确证明无法花费。OP_RETURN输出通常具有零金额,因为分配给此类输出的任何比特币实际上都永远丢失了。如果在交易中将OP_RETURN输出作为输入引用,脚本验证引擎将停止执行验证脚本,并将交易标记为无效。执行OP_RETURN本质上会导致脚本“RETURN”并终止。因此,如果您意外地将OP_RETURN输出作为交易的输入引用,则该交易将无效。

Last updated