BTC手续费计算


BTC 交易过程中是需要支付手续费的,而开发人员在开发过程中只需要了解手续费的计算公式就可以了。本文主要讲述一下手续费的计算规则,以及计算规则中的参数来源。
注:参考文档精通比特币

一、BTC 的手续费计算规则

BTC 在交易时时需要手续费的,而手续费的产生是与交易金额没有关系的, 所以不要以为交易金额越高,手续费就越高。

BTC 在交易的时候,手续费与交易产生的字节数大小和当时交易池内的数据量多少有关。

字节数代币交易打包的大小,单位是 byte。

字节数的计算公式:字节数 = 输入数量 * 148 + 34 * 输出数量 + 10
手续费的计算公式:手续费 = 字节数 * X satoshis / byte
其中 X 为计算手续费时的费率,x 的值交易时由用户选择的,根据交易所需时长的不同,费率不同。

二、费率的来源

手续费费率计算,与当时交易池内的交易数量有关,同时也与交易的打包速度有关。如下图所示:

有上图可以看出,打包时间越长,手续费越低。

三、字节数的计算

上面所述,字节数的计算公式为字节数 = 输入数量 * 148 + 34 * 输出数量 + 10。如下图所示的一次交易,字节数 = 1 * 148 + 2 * 34 + 10(其中交易输入为 1 个,交易输出 2 个)。

10字节 来源

一次交易的JSON数据

{
  "version": 1,
  "locktime": 0,
  "vin": [
    {
      "txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
      "vout": 0,
      "scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
      "sequence": 4294967295
    }
 ],
  "vout": [
    {
      "value": 0.01500000,
      "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
      "value": 0.08450000,
      "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
    }
  ]
}

提示,10 字节的由来:

1. (4 字节)版本号
2. (4 字节)锁定时间
3. (1 字节)输入数量,1-9 字节可变长整型,用来显示交易输入数量。
4. (1 字节)输出数量,1-9 字节可变长整型,用来显示交易输出数量。
总共:10 字节

148字节来源(交易输入大小)

交易输入的数据结构

"vin":
[
  {
    "txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
    "vout": 0,
    "scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
    "sequence": 4294967295
  }
]

交易输入序列化之后的大小如图:

提示,148 的由来:

1.(32 字节)交易ID
2.(4 字节)输出索引,用于反推本次交易来源与之间的哪个交易输出
3. (1 字节)解锁脚本大小,1 ~ 9 字节,使用时选择 1。
4. (107 字节)scriptSig的长度为139个字节,或十六进制为8b
    - (1 字节)DER 格式签名长度
    - (72 字节)DER 格式签名
    -  (1 字节)公钥长度
    - (33 字节)公钥
5.(4 字节)序列号
总共:148 字节

34字节来源(交易输出大小)

交易输出数据结构为:

"vout": [
   {
     "value": 0.10000000,
     "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG"
   }
 ]

交易输出各部分字节大小,如下图:

提示,34 的由来:

1. (8 字节)交易金额
2. (1 字节)锁定脚本大小,1 ~ 9 字节,计算式选择最小值 1
3. (25 字节)锁定脚本:25 字节
      - (4 字节)4 个操作码,每个 1 字节
      - (1 字节)公钥长度 
      - (20 字节)收款方公钥
总共:34 字节


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM