存数据到 Bitcoin
由于 Bitcoin 的极高不可篡改性,有些人将其用于存储数据。
比如要证明文件的存在,可以生成它的 hash,然后将这个 hash 用于创建 Bitcoin P2PKH 交易输出,也就是替代下面的<pubKeyHash>。
scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>
这样,这个 hash 会永久存储于 Bitcoin 的链上。
UTXO 集合的膨胀
但是这会带来一些问题,因为没人可以根据这个 hash 推断出对应的私钥,所以没人可以消费这个 UTXO,所以它会永远的保留在 UTXO 集合中,用的人多了,会加速 UTXO 集合的膨胀。
Bitcoin Core 除了保存区块链的数据,还另外将 UTXO 集合存储在 ~/.bitcoin/chainstate/
目录[1]。Bitcoin Core 运行时,会将 UTXO 集合载入内存,以加速交易的验证[2]。UTXO 集合太大,会加重内存的负担。(也可以用-dbcache
参数设置内存占用的上限[3])
OP_RETURN
为了妥协,Bitcoin 加入了 OP_RETURN 脚本命令,它后面可以紧跟 80 bytes 的数据,专门用于存储和交易逻辑无关的数据。[4]这个交易输出会被当做假的 UTXO,不会加入 UTXO 集合,从而避免上述的问题。
scriptPubKey: OP_RETURN <data>
这个命令现在被广泛使用,比如用于发币的 Omnilayer 非常依赖这个命令。USDT 早期使用 Omnilayer 发币,后来改用 Ethereum ERC20。
每个月 OP_RETURN 命令被使用的次数:
https://opreturn.org/op-return-per-month/
网友评论