比特币生态开发 - UTXO 的那些坑
0x00 为啥会有坑
哈哈,有路的地方,就会有坑...
比特币生态今年意外爆发,我有幸也参与了一些比特币生态项目。比特币这个东西,因为没有智能合约,给人一种假象,以为做比特币开发就是调用一些接口和比特币开发库,但真正做进去,就会碰到各种想象不到的坑,精彩纷呈。
0x01 Too many unspent transaction outputs
如果还没碰到过这个问题,大概率是你做的应用还没有资深玩家在用...
构造比特币交易,第一步要做的就是获取 UTXO,如何获取 UTXO 呢?
mempool.space 提供的有个现成的接口:https://mempool.space/api/address/1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY/utxo
免费又方便,正常使用也没啥问题,直到有一天,不断有用户抱怨说应用用不了,然后自己怎么试怎么是好的,最后把用户地址要过来,发现获取 UTXO 这步就出错了。
怎么办?
-
换供应商
mempool.space 有限制,其它比特币浏览器是不是会好呢?你可以尽管去尝试,按我们的经验,免费供应商最多能返回的 utxo 是 2500 个。 -
自己搭节点
这其实也有几个选项,一个是自己搭比特币节点去跟踪存储所有的 UTXO,一个是自己去跑个 mempool.space 开源代码,可能都没那么轻松
有没有更方便的做法呢,也是有的
0x02 把资产当矿工费花了出去
这是另外一个初做比特币生态经常碰到的问题。这次比特币生态带来的最大变化,就是让很多看起来普普通通的铭文,有可能附带有价值连城的铭文。这就要我们在花费 UTXO 的时候格外小心。
- 目前铭文的 UTXO 大多是 546 聪,还有一些是 330 聪,293 聪,一般来说最大步会超过 10000 聪,这里可以做个简单的过滤,只花费大于 10000 聪的 UTXO
- 如果做更精细的筛选,就要自己把 UTXO 和铭文索引放在一起进行过滤了,这个如何做的效率更高是个技术活
0x03 花费未确认的 UTXO
比特币是允许使用未确认的 UTXO 来支付的,我们在铭刻铭文的时候经常这样做。但是有两个限制是要注意的:
- 比特币对未确认 UTXO 的反复使用是有限制的
- 如果前面某个 UTXO 由于矿工费太低迟迟得不到确认,后面的一连串交易都不会轻易得到确认
0x04 UTXO 投毒
出于某些特别原因,有人可能会往你地址里发送一笔小金额面值的 UTXO,但这个 UTXO 级连带了很多未确认的交易,这个被称为 UTXO 投毒。
当你不小心用了这个 UTXO,就中毒了。中毒后的典型表现就是你发出去的交易迟迟得不到链上确认,需要花比预期多很多的矿工费来解毒。
0x05 UTXO 合并
当你钱包里有几万甚至几十万个 UTXO 的时候,你会发现想把这些钱转出去并没那么容易,相当于自己有一卡车的硬币,一个个的花费太费事,大部分钱包也不支持一次性转太多 UTXO。
0x06 后记
UTXO 这东西有很好用的地方,比如很容易实现批量发送。但也有不少坑,从以太坊赛道过来的同学很容易掉坑里。