查看原文
其他

不知道比特币交易手续费原理,只能一直花冤枉钱!

2017-09-08 蚂蚁矿机ANTMINER


【本文全文3000字,有一定的理解难度,建议收藏此文多看几遍】

在使用比特币时,我们有时候会遇到一些奇葩的事。

明明钱包里有3BTC,想要给别人支付2.999BTC,然而交易却失败了!

想要给别人转价值66元的BTC,结果在线钱包却扣了我100多元,手续费居然高达50元!

比特币的交易手续费到底是怎么算的?我怎么才能避免少交手续费?在线钱包为什么费用那么高?本文会讲解清楚交易手续费的原理,帮大家少走弯路,少交手续费。

比特币的UTXO记账体系

想搞清楚比特币交易费的秘密,我们先要了解比特币的记账体系,也就是UTXO,代表 Unspent Transaction Output,中文译为【未花费的交易输出】,现在看不懂没关系,接下来会解释。

目前的银行、支付宝、证券交易等都是【基于账户】的记账体系,而不是比特币所采用的UTXO体系。

假设A要通过银行支付100元给B,在现有的账户体系下,过程是这样的:

1、检查A的账户余额是否有100元,如果余额不足100元则终止交易

2、在A的账户里减去100元(假设手续费为零)

3、在B的账户里增加100元

而比特币的UTXO,则不使用上面的这一套账户体系,而是把一个比特币从诞生到多次交易的经历描述了一遍。

让我们一起来假设一个场景,张三是一名矿工,他通过挖矿挖到了12.5BTC,过了几天,他把2BTC给了李四,又过了几天,他和李四一起凑钱还给王五,张三出3BTC,李四出2BTC。

如果是基于账户体系,那么过程是这样的:


而基于比特币的UTXO,那么过程应该是这样的:


大家看出这其中的区别了吗?

比特币账本里记录的是一笔又一笔的交易。

每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。而未花费过的交易输出,就体现为地址上的比特币。

在01号交易中,输入就是挖矿得来的12.5BTC,输出到张三的地址中,由于这笔输出没有花费,所以张三的地址上有12.5BTC。

在区块链浏览器中,我们可以查看某笔交易的所有交易输入和交易输出。

左边是一笔交易的来源,右边是交易的去向。一笔交易的输出,会成为下一笔交易的输入。


比特币的交易手续费

了解完比特币UTXO之后,我们终于可以进入手续费的部分了。

当你使用Bitcoin客户端发送比特币的时候,整个过程大致分为以下步骤:

步骤一:选择合适的未花费输出

前面已经说到,交易最终会留下多个未花费的输出,而这些未花费输出是不会合并的!!比如说你收到两笔支付,分别是2BTC和3BTC,这两个未花费输出就单独保存在钱包中,而不会合并为5BTC。

当你要支付比特币给别人时,比特币客户端会选择合适的未花费输出发送出去,成为下一笔交易的输入。整个过程如下图所示:


步骤二:不鼓励零碎支付

比特币的目前算法不鼓励零碎的支付,因为大量的零碎支付会让交易数据变大,造成整个系统交易缓慢。如果交易的“输出”低于0.01BTC,那么就要收取0.0001BTC的手续费。钱包在准备你的支付金额的时候有一个既定的规则,就是在众多输入中筹备支付金额的时候尽量避免产生小于0.01BTC的金额变动(比如你要支付5.005BTC,钱包尽可能的选择3+2.005或者1+1+3.005,而不是5+0.005)。

步骤三:金额高、币龄大优先级越高

每一笔交易都会有一个优先级,一笔交易需不需要交手续费,取决于以下这个优先级数值的大小(只是一个简单的模型,真实情况更复杂):


如果X的值小于0.576则交易会被收费,如果X大于0.576,则可获得优先级从而避免收费。

大家发现了没有,有一种情况是肯定会被收费的,那就是支付的钱本来就很少,又是由多笔散钱组成,距离你拿到这些散钱的时间还很近,那这笔交易就难逃被收费了。

相反的,如果交易的输入金额大,且时间久远,那就可避免被收费。

步骤四:“称重”收费

比特币的交易以一串数字数据出现,该交易包含更多的数据会占用更多磁盘空间,需要更多的网络带宽来传输。因此交易的输入项、输出项越复杂,数据量就越大,所需要交的手续费就越多。

举个例子,有一次蚁妹要给用户发奖,奖品是价值66元的BTC,使用某在线钱包发送比特币,但是我发现我每发一次奖要被扣50元左右的手续费,后来到区块链浏览器中一看,该在线钱包用的都是零碎的散钱,一笔很小的交易居然有6个输入,导致我这笔交易数据量变大,被扣了很多交易费。

 

如果没有获得在第三点中所说的优先级,那就一定要收交易手续费啦!具体交多少就要对你这笔交易的大小进行“称重”。

称重的公式为:

Size=148*输入数量+34*输出数量+10

费用按每千字节收费(不足1k按1k算),每千字节费用为0.0001BTC。一笔典型交易的输出数量是2个:一笔是给收款人,一笔是系统找零。按照上面这个称重公式,支付0.0001BTC,最大的输入数量只能是6笔,如果输入数量为7笔,那交易费就翻倍为0.0002BTC啦!

这就解释了为什么钱包里有3BTC,却不能给别人支付2.999BTC。假设你的钱包里只有3BTC,而这3BTC分别来源于1BTC和2BTC这两笔输入(记住,输入不能合并)。因为这笔交易会产生0.001BTC的找零输出,这个输出是低于0.01BTC的,所以要收取0.0001BTC的手续费,然而你的钱包里却没有多余的手续费来支付,那就会导致支付失败。

神奇的是,如果你支付给商家3BTC(土豪,主动加价),那就能避免手续费啦!(假设这笔交易有优先级)

如何估算合理的交易手续费?

重点来了!那么我要如何估计我一笔交易的手续费,才能保证既不多给钱,又能被矿工打包呢?

首先,矿工决定是否要打包你的交易,取决于每字节数据的比特币,通常用【聪/字节】为单位,这个数据越高,矿工就优先打包你的数据。

前面提到了,一笔交易费用取决于交易数据量的大小,所以要是知道这个数据量,我们不就能估计交易费了嘛!但是很遗憾,大部分钱包都不会告诉你这个信息,你只能通过目前交易的平均数据量大小来估计。

在http://bitcoinfees.21.co/我们可以查到当前的平均数据交易量大小,比如说目前交易的平均数据大小为226字节。网站建议的每字节手续费为270聪,所以每笔交易的估计交易费=226*270=61010聪。


目前大部分钱包的交易手续费数据都是基于这个网站给出的,但是网站给出的建议手续费一般都是偏高的。想要知道实际的出价,可在区块链浏览器中点击最新的区块,查看该区块的交易费出价,可以看到有人出价是400聪/字节,有人出价是1聪/字节。根据别人的出价,我们就可以设置一个合理的价位,让交易能顺利被下一个区块打包,又不至于等待太长时间。


可以看出,比特币交易手续费的整体过程是相当复杂的,有看不懂的地方欢迎在后台留言,蚁妹会耐心帮大家解答的,比心。


参考文献:

《其实并没有什么比特币,只有UTXO》

《Bitcoin Fees Explained》

《Make Sense Of Bitcoin Transation Frees》

《How Bitcoin Frees Work And Why They've Been So High》


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存