交易是比特币系统中最重要的部分,对交易细节的把握可以让你在写代码的过程中避免掉坑。UTXO交易细节说明:
交易构成
开头是一个4字节的版本号,标记这笔交易的结构是什么版本;随后是一个1~9字节的可变长整数,标识这笔交易中输入的个数;后面跟着一个数组,多个交易输入按顺序排列;接着是一个可变长整数,标识交易有多少输出,后面跟着具体的交易输出;最后是一个4字节的nLocktime,标记交易的时间锁。
对于交易输入的结构:
开头是一个32字节的交易哈希和一个4字节的序号,表达交易链条,指示这笔交易输入来自之前哪笔交易的第几个输出;接着是一个可变长整数,表示解锁脚本的长度,后面跟着具体的解锁脚本;最后是4字节的nSequence。对于交易输出的结构:开头是一个8字节整数,表示这笔交易输出(UTXO)的金额;接着是一个可变长整数,表示锁定脚本的长度,后面跟着具体的锁定脚本。这就是一笔交易的结构,很简单,比特币系统中所有的交易都是这个样子。
普通用户能接触到的交易基本都是P2PKH(付款到公钥哈希)交易,作为开发者,操作的交易也基本全是P2PKH。因为确定了交易类型,就等于确定了解锁脚本和锁定脚本的结构。对于P2PKH的交易。解锁脚本分两部分,前面是DER格式的签名,后面跟着公钥。第一个OP_72表示签名的长度,后面的OP_33表示公钥有33字节。锁定脚本的结构也是确定的,有25字节,5个操作码加上20字节的收款方公钥哈希。
所以普通用户能发出来的最小的交易,是只有1个输入和1个输出的P2PKH交易,自下而上,计算出来交易的大小是192字节。
一笔交易,有一个输入,有一个输出,交易的大小是192字节,手续费1聪每字节,最后我支付了192聪的费用,截图里你能看到实际情况确实如此。
节点在收到交易之后,要验证这笔交易,如果交易合法且交易是标准交易,节点才会把它放入自己的内存池(mempool),并向相邻的节点(peers)传播(relay)这笔交易。最早在做压测工具的时候,为了尽可能的省钱,我需要将每笔交易输出设置的尽可能小,那就1聪好了,但是交易被拒绝了。说明:
1. 如果你在花费一笔UTXO时,需要支付的手续费超过了这个UTXO面值的1/3,那么这个UTXO就是dust;
2. 交易输出有34字节,把它作为交易输入花费掉需要148字节;
3. 得出来交易输出最小金额的公式是546乘以最小的手续费单位,手续费最少是1聪每字节,所以说最小的UTXO面值是546。
很多开发者在构造交易时注意不到546的限制,一些底层库在处理交易找零时也没有特别处理。比如说我现在有一个1000聪的UTXO,支付了800聪,找零200聪。这笔交易是合法的交易,但广播后节点会拒绝,也不会relay它,这会给开发者开来困扰。这张图是BitSV库内部的处理方法,你能看到,当交易剩余的找零小于546聪时,它会把这部分输出直接当成矿工费,以避开dust限制。当你在使用其他语言库写代码时,务必要注意这些细节。
UTXO 是构成交易的基本元素,作为开发者,这种数据结构很友好,但普通用户却难以理解它。基于余额的财务系统是非常直观的,转账发生时更新余额字段的值即可,但要注意,更新共享变量需要加锁,否则可能会读到脏数据或计算出负余额,而加锁就意味着对并发并不友好,系统难以水平扩展。
BTC手续费计算
首先BTC的交易手续费和交易金额是没有关系的。不要误认为交易的金额越大手续费越高;
BTC的手续费每个时间段是不一样的 它取决于你交易产生的字节数大小和当时交易池内的数据量多少;
字节数,字节数代表着你这笔交易打包的大小,单位是byte
字节数的计算公式是 input*148+34*out+10
以下图为例:
input的就是输入的地址数量红色部分 input=1
out就是输出的地址数量蓝色的部分 out=2
字节数大小就是黑色的部分 也就是计算呢公式 : 1*148+34*2+10=226
字节数我们计算出来了但是怎么算手续费呢?
手续费=字节数* X satoshis / byte
X的取值是我们自己设置的,那到底设置多少合适呢?
这个要根据当时交易池内的交易数量来定了,矿工优先打包字节费给的高的因此我们只要获取当时satoshis / byte是被优先打包的就可以;
下图为例:
红色部分代表satoshis / byte 和多少时间内被确认,我们选择最优的13satoshis / byte 那么我们最有可能的交易下一个区块就会被打包,相对的手续费也会变高;
查看地址:https://bitcoinfees.earn.com/
费率等级数据API地址 : https://bitcoinfees.earn.com/api/v1/fees/recommended
{“fasterFee”:40,“halfHourFee”:20,“hourFee”:10}
fasterFee :最低费用(每个字节的satoshis),目前将导致最快的交易确认(通常为0到1块延迟)。最快确认
halfHourFee :最低费用(每个字节的satoshis)将在半小时内确认交易(概率为90%)。三个块内确认
hourFee :最低费用(每个字节的satoshis)将在一小时内确认交易(概率为90%)。六个块内确认
手续费 打包费用总结:
(in*148+34*out+10)* X satoshis / byte
当然计算出来的手续费有时候比实际的差几聪原因应该是有些币币龄比较大,输入的时候我们按照148算的,其实还有些地址是相对较小的一点的,具体是多少我不确定,曾经在一个国外的博客上看到的是144,所以有时候算出来的值会差几聪的。
原文地址:https://blog.csdn.net/servletcome/article/details/81941334
网友评论