7.4 数据记录输出(RETURN操作符)
比特币的分布式和时间戳账本,即区块链技术,其潜在用途将大大超越支付领域。许多开发者试图充分发挥交易脚本语言的安全性和弹性优势,将其运用于数字公证服务、股票证书和智能合约等领域。使用比特币的脚本语言来实现这些目的的早期尝试,包括创建交易输出,把数据记录在区块链上,例如,以这样的方式记录文件的数字指纹,任何人可以通过引用该交易来建立该文件特定日期的存在证明。
运用比特币的区块链技术存储与比特币支付不相关数据的做法是一个有争议的话题。许多开发者认为其有滥用的嫌疑,因而试图予以阻止。另一些开发者则将之视为区块链技术强大功能的有力证明,认为应该给予大力支持。那些反对包含非支付数据的人辩称这将导致“区块链膨胀”,增加运行的全节点的磁盘存储成本,承担了区块链不应该携带的数据。而且,此类交易创建了不能花费的UTXO,使用目标比特币地址作为20字节的自由格式字段。因为比特币地址只是被当作数据使用,并不对应于私钥,所以会导致UTXO永远不能用于交易,因而是伪支付。这些交易永远不会被花费,所以永远不会从UTXO集中删除,会导致UTXO数据库的大小永远增加“膨胀”。
在0.9版的Bitcoin Core客户端上,通过采用RETURN 操作符最终实现了妥协。RETURN 允许开发者在交易输出上增加80字节的非支付数据。然后,与伪UTXO不同,RETURN 创造了一种明确的可验证不可消费型输出,此类数据无需存储于UTXO集。RETURN输出被记录在区块链上,它们会消耗磁盘空间,也会导致区块链规模的增加,但它们不存储在UTXO集中,因此也不会使得UTXO内存池膨胀,更不会增加全节点昂贵的内存代价。
RETURN 脚本的样式:
RETURN <data>
“data”部分被限制为80字节,且多表示为哈希值,如源自SHA256算法输出的值(32字节)。许多应用都在其前面加上前缀以方便识别。例如, 这家网站Proof of Existence 的数字公证服务使用8字节前缀DOCTIOND,16进制ASCII编码为44×4F 43 50 50 4F 4F 46。
请记住,并不存在对应于RETURN 的解锁脚本,也就不能花费RETURN的输出。RETURN的关键点就是锁定的输出不能花费,因此它不需要被保存在UTXO集中供未来消费,RETURN是可验证但是不可花费的。 RETURN 常为一个金额为0比特币的输出, 因为分配到该输出的比特币都会永久消失。假如一笔 RETURN 被作为一笔交易的输入,脚本验证引擎将会阻止验证脚本的执行,将标记交易为无效。执行RETURN本质上导致脚本“返回”FALSE并停止执行。如果你不小心将 RETURN 的输出作为另一笔交易的输入,则该交易是无效的。
一笔标准交易(通过了 isStandard() 函数检验的)只能有一个 RETURN 输出。但是单个RETURN 输出能与任意类型的输出交易进行组合。
Bitcoin Core 0.10版本添加了两个新的命令行选项。 选项datacarrier控制RETURN交易的传播和挖矿,默认设置为“1”以允许它们。 选项datacarriersize采用一个数字参数,指定RETURN脚本的最大大小(以字节为单位),默认为83字节,允许最多80个字节的RETURN数据加上一个字节的RETURN操作码和两个字节的PUSHDATA操作码。
注释 RETURN最初提出的时候,限制为80字节,但发布时,限制被减少到40字节。 2015年2月,在Bitcoin Core的0.10版本中,限制提高到80字节。 节点可以选择不传播或不挖矿RETURN,或者只传播和挖矿包含少于80字节数据的RETURN。