
OP_RETURN操作码的功能曾在过去发生过重大变化,现在它是一个重要的机制,使用它我们就能在链上存储任意数据。
OP_RETURN最初是用于提前结束脚本执行的返回操作,执行结果将作为栈顶项目被呈现出来。
这个操作码最初有一个容易被利用的漏洞,但中本聪很快修补了该漏洞。
此前RETURN的漏洞
OP_RETURN最初的功能是终止脚本,此前栈顶的值就是执行的结果。
给定脚本:OP_TRUE OP_RETURN
若脚本返回true,则脚本终止,忽略之后出现的任何操作码;正因为如此,该脚本可以放置在任何解锁脚本之前,授予某人窃取任何人的比特币的能力。
目前该操作码已更改为始终返回false,而不是返回栈顶值。
对OP_RETURN功能的进一步更改
在Bitcoin Core的v0.9.0那次升级中,“OP_RETURN 输出”脚本被制作成标准输出类型,允许用户将数据附加到“不可花费的交易输出(unspendable transaction output)”上。这类脚本中可用的数据量的上限最初被限制为40字节,然后提升至80字节。
将数据存储在区块链上
将OP_RETURN改为始终返回false造成了有趣的结果。由于在 OP_RETURN 之后不会评估任何操作码或数据,因此网络用户开始使用此操作码来存储任意格式的数据。
由于最大脚本大小被限制为 520 字节,因此使用此操作码代替 OP_PUSHDATA 操作码。比特币的这两个根本性变化导致操作码以不可预见且有趣的方式被使用了,这些使用方法超出了其原始意图。
BCH时期的OP_RETURN
在比特币现金(BCH)的时期,即2017年8月1日-2018年11月15日,能够附加到OP_RETURN输出的数据长度被扩展到220字节,更大的数据能够促进区块链上创新的应用,例如在区块链社交媒体上发布内容等。
目前BSV区块链的OP_RETURN
在许多节点过渡到Bitcoin SV 客户端后,220字节的限制依然被保留了一小段时间。随后,在2019 年1月,由于OP_RETURN 操作码以节点不验证任何后续操作码的方式终止脚本,所以节点也不会检查脚本是否在520 字节的最大脚本大小限制内。由此一来,网络上的节点运营商决定将最大交易体积提高到100KB,从而赋予开发者有更多应用创新的自由,让新的应用可以将更大、更复杂的数据放入比特币账本。那时有一个应用例子,有人将将整个网站都放入了BSV帐本中。
让OP_RETURN回归最初的功能
2020年2月的创世纪升级恢复了全部的比特币操作码的原始功能,包括OP_RETURN的,但这不会影响它在链上存储任意格式的数据的能力,只是对它的最佳使用方式进行了修改——建议大家使用False Return脚本。