SkyOne Profile JPG

Sparrow Wallet (Bitcoin)

Photo by Artūras Kokorevas

Sparrow Wallet (Bitcoin)

理论

  1. UTXO是什么

    • UTXO, 全称为Unspent Transaction Outputs, 即未花费的交易支出.

    • 比特币中, 任何一笔transaction, 都有一个 input, 以及相应的 output

    • 相较于EVM生态, BTC更像是纸币, 而EVM更像是银行 [👉 以下例子均不考虑实际RMB面额限制 👈 ]

      • 举个例子, 你有100元现金RMB, 一张纸币, 10快钱转账给老王, gas设置为5, 那么最后你会剩下一张面额为85的UTXO, 你的一张100元纸币, 变成了一张面额为85的纸币
      • 上面的花销中, 100元纸币就作为 tx的input, 而output分别是
        1. 85(返回给自己的UTXO), 会返回给你自己的钱包,
        2. 10(这个UTXO, 即面额为10的纸币) 是给到了对方的钱包
        3. 5(面额为5的纸币) 是给到了矿工的钱包
      • 后面你再花钱, 只能花这1张纸币(面额为85). 作为交易的输入, 去发起新的transaction.
      • 最后 你想给把自己面额85的UTXO拆掉, 拆成30+50, 那么你发起第二笔tx, 接收方是自己, 面额为50. 那么, input是85的UTXO, output有三个
        1. 自己发给自己, 面额为的50的UTXO
        2. 剩下的面额为30的UTXO
        3. 还有面额为5的UTXO进了矿工的钱包
  2. 加速交易的两种方法

    ❤️ ❤️ ❤️ 不管你用RBF 还是用CPFP, 都需要确保自己UTXO的Balance是足够的, 不然是无法加速的 ❤️ ❤️ ❤️

    1. RBF, 全称为Replace-by-fee, 即未确认的transaction, 可以用新的transaction(并给予新tx更高的gas) 来替代掉,

      • 首先明确 只有是你自己的UTXO作为input, 才能去发起RBF 🍎

      • 其次, 来Here查看你的tx是否可以RBF, 比如下面这一笔就可以进行RBF

      • 最后 举个例子来说明, RBF是什么
        • 同样以上面钱包里只有 30+50 这两笔UTXO来说, 我新发起一笔tx, 利用50的UTXO 再次向老王转账10, gas设置为5, 这笔tx记为tx1
        • 那么如果tx1成交,
          • 那么我的钱包里应该会有两个UTXO, 分别是30, 35这两张, 前者是没动的UTXO, 后者是tx1完成后返回来的UTXO
          • 老王钱包里则是 10+10, 两张UTXO
          • 矿工钱包是5+5+5 三张UTXO
        • 但是我发起tx1之后, 我想加速一下(这里有两个方面)
          1. 我不想给老王钱了, 想赖掉
            • 那么这时候就可以用 RBF 来加速, 发起一笔新的tx, 称之为tx2, tx2是利用面额为50的这笔UTXO, 给自己转20, gas设置为10.
            • 这笔tx2 完成之后
              • 我的钱包里会有20 + 20 + 30, 这三张UTXO
              • 老王的钱包只有 10, 一张UTXO
              • 矿工的钱包里有 5+5+10, 三张UTXO
            • tx2会成交, 因此可以赖掉给老王的转账 🍓
          2. 我嫌弃gas太低, 想快点成交
            • 同样可以用 RBF进行交易, 发起一笔新的tx2, 利用面额为50的这笔UTXO, 给老王转账10, gas设置为10
            • 那么tx2完成之后
              • 我的钱包里会有 30+30 这两张
              • 老王钱包里会有 10+10 这两张
              • 矿工钱包里 则是 5+5+10, 这三张
    2. CPFP, 全称为 Child Pays For Parent, 即利用发起一笔gas高的子交易, 来加速父交易,

      因为想要确认高gas的子交易, 就一定要确认父交易

      • 首先明白, 所谓子交易指的是, 子交易的input, 用的是未能确认的父交易的output.
        • 即我发起tx1, 给老王转账100 gas设置为10. 100作为tx1的output.
        • 老王想用我给他这100作为input, 给老李转50, 但是由于我的这笔tx1还没确认, 因此他只能发起一笔子交易tx2, gas设置为20, 来加速父交易.
        • 这里的父交易即tx1, 子交易即为tx2.

实践

  1. Sparrow Wallet来说, 启动testnet >>>> Tools-->Restart Testnet

    可以在测试网多玩一玩 ⚱️

  2. Connect, 连接区块的时候, 可能不会很顺利, Clash开Direct会好一些, 如下图

    可以在clash配置文件的rules中添加以下内容 即可实现sparrow的这几个网络是直连, 其余的正常rule rules:

  • DOMAIN-SUFFIX,smtp,DIRECT
  • DOMAIN-KEYWORD,aria2,DIRECT
  • IP-CIDR,203.132.94.196/32,DIRECT,no-resolve
  • IP-CIDR,35.201.74.156/32,DIRECT,no-resolve
  • IP-CIDR,35.225.54.191/32,DIRECT,no-resolve
  • IP-CIDR,198.244.201.86/32,DIRECT,no-resolve
  • IP-CIDR,135.181.215.237/32,DIRECT,no-resolve
  • IP-CIDR,168.119.33.233/32,DIRECT,no-resolve
  • IP-CIDR,168.119.33.233/32,DIRECT,no-resolve

- DOMAIN-KEYWORD,electrum.diynodes,DIRECT

  • IP-CIDR,170.75.162.55/32,DIRECT,no-resolve
  1. 领水合集

    1. https://testnet-faucet.com/btc-testnet/
    2. https://bitcoinfaucet.uo1.net/send.php
    3. https://testnet-faucet.mempool.co/
  2. 面板介绍

      • 介绍下左边的这几个面板

      • Transactions 指的是你作为接收方 或者 发送方的tx

      • Send, 是给某个地址发送BTC,

        • payto字段是发送给谁
        • label是标识字符, 类似于注释
        • amount 是发送多少
        • Fee这里, 可以自己拖动来调节gas, 最后的 Fee = tx大小*gas
      • Receive 这里, 即你可以选择用某个地址 接受外部转账

      • Address这里注意, 这里面的Address 都是你可以用的地址, 由于一套助记词生成N多地址, 所以这些地址都归属于你了, 他们名下的UTXO 你也都可以用, 如果想用某个UTXO, 直接选择该UTXO, 然后“Send Selected”即可 如下图

      • UTXOs 这一栏, 即你可以花的UTXO, 与上面同理, 想花哪个选中, 选择小飞机图标即可, 如下图

      • Setting这一栏, 就不过多叙述了 🚶‍♂️

  3. BRF实践

    1. txB 替代 txA, 针对的是 “我嫌弃gas太低, 想快点成交” 这种情况, 大概原理如下
      • 我首先发起txA, 用 tb1qn2zt7xzc4nwe4m5rzg8jt4gr446h069vjunapj 地址中的一个面值为 1282sats的utxo(简称U1), 给tb1q66spu0n20ru23yhc6katlwu4j9xl4sn9yxrnwh 这个地址转账1131sats, gas花 151stas. (151 + 1131 = 1282)
      • 后面发起RBF, 即为txB, 用上面的 U1 以及 另外一个面值为 1712sats的UTXO(简称U2), 这两个utxo, 作为input, 给tb1q66spu0n20ru23yhc6katlwu4j9xl4sn9yxrnwh 这个地址 转了 2610sats, gas花了384, (1282 + 1712 = 2610 + 384)
      • 最后可见, txB成交, 而txA并没有成交
      • 这一笔之所以用两个UTXO, 是因为U1的balance不足以支撑txB
    2. txB 替代 txA, 针对的是 “我不想给老王钱了, 想赖掉 ” 这种情况, 大概原理如下
      • 我发起txA, 用 tb1qn2zt7xzc4nwe4m5rzg8jt4gr446h069vjunapj 地址中的一个面值为 8135sats的utxo(简称U1), 给tb1q4eqr370h7w37quke9nes5yc9ncnpctfpejv8df 地址转账294sats, gas为158sats
      • 后发起txB, 同样用U1, 给 tb1q4eqr370h7w37quke9nes5yc9ncnpctfpejv8df转账 294sats, gas为748
      • 最后txB成交, txA没有成交
  4. CPFP实践

    1. 父交易子交易, 大概经过如下
      • 我首先发起父交易, 即tb1qn2zt7xzc4nwe4m5rzg8jt4gr446h069vjunapj (简称地址A) 一张面额为12281sats的UTXO(U1)作为input, 向tb1q4eqr370h7w37quke9nes5yc9ncnpctfpejv8df (简称地址B) 转账1000sats, 其余的11140sats退回到 tb1qzk35rutqjcuj7la95hvvcdqkczjv7dqwtyh6ls (简称地址C)
      • 然后我用地址C收到的11140sats, 发起向 tb1q80262jz5ytdfhj38ur4l7duect6qppc4j6unj7 (简称地址D)转账1000sats的子交易.
      • 由于子交易的提速, 所以父交易的有效费率 由1.01-->1.43, 而子交易的有效费率 由1.85-->1.43
  5. 再强调一点, 玩BRC20的话, 不要RBF, 用CPFP(至于为什么 我了解不多, 不多说)

  6. Sparrow中, 想发起加速的时候, Fee 和 amount 为什么标红?

    1. 如果有一个utxo, 并不是自己发起的, 只是别人给我的, 并且这个UTXO的value 只有546, 那就是太小了,
    2. 换句话说, 这个UTXO的余额 不足以支撑新UTXO的输入 以及 提升gas的费用(即不足以支付children)

感谢康纳和alex两位大哥的技术指导