比特币交易费及size计算

版权声明:转载请说明出处 https://blog.csdn.net/weixin_39842528/article/details/81116304

交易费

大多数交易包含交易费(矿工费),这是为了确保网络安全而给比特币矿工的一种补偿。费用本身也作为一个安全机制,使经济上不利于攻击者通过交易来淹没网络。对于挖矿、费用和矿工得到的奖励,在挖矿一章中将有更详细的讨论。

这一节解释交易费是如何被包含在一个典型的交易中的。大多数钱包自动计算并计入交易费。但是, 如果你以编程方式构造交易,或者使用命令行界面,你必须手动计算并计入这些费用。

交易费作为矿工打包(挖矿)一笔交易到下一个区块中的一种激励;同时作为一种抑制因素,通过对每一笔交易收取小额费用来防止对系统的滥用。成功挖到某区块的矿工将得到该区内包含的矿工费, 并将该区块添加至区块链中。

交易费是基于交易的千字节规模来计算的,而不是比特币交易的价值。总的来说,交易费是根据比特币网络中的市场力量确定的。矿工会依据许多不同的标准对交易进行优先级排序,包括费用,他们甚至可能在某些特定情况下免费处理交易。但大多数情况下,交易费影响处理优先级,这意味着有足够费用的交易会更可能被打包进下一个挖出的区块中;反之交易费不足或者没有交易费的交易可能会被推迟,基于尽力而为的原则在几个区块之后被处理,甚至可能根本不被处理。交易费不是强制的,而且没有交易费的交易最终也可能会被处理,但是,交易费将提高处理优先级。

随着时间的推移,交易费的计算方式以及在交易处理优先级上的影响已经产生了变化。起初,交易费是固定的,是网络中的一个固定常数渐渐地,随着网络容量和交易量的不断变化,并可能受到来自市场力量的影响,收费结构开始放松。自从至少2016年初以来,比特币网络容量的限制已经造成交易之间的竞争,从而导致更高的费用,免费交易彻底成为过去式。零费用或非常低费用的交易鲜少被处理,有时甚至不会在网络上传播。

在 Bitcoin Core 中,费用传递政策由minrelaytxfee选项设置。 目前默认的minrelaytxfee是每千字节0.00001比特币或者millibitcoin的1%。 因此,默认情况下,费用低于0.0001比特币的交易是免费的,但只有在内存池有空间时才会被转发; 否则,会被丢弃。 比特币节点可以通过调整minrelaytxfee的值来覆盖默认的费用传策略。

任何创建交易的比特币服务,包括钱包,交易所,零售应用等,都必须实现动态收费。动态费用可以通过第三方费用估算服务或内置的费用估算算法来实现。如果您不确定,那就从第三方服务开始,如果您希望去除第三方依赖,您应当有设计和部署自己算法的经验。

费用估算算法根据网络能力和“竞争”交易提供的费用计算适当的费用。这些算法的范围从十分简单的(最后一个块中的平均值或中位数)到非常复杂的(统计分析)均有覆盖。他们估计必要的费用(以字节为单位),这将使得交易具有很高的可能性被选择并打包进一定数量的块内。大多数服务为用户提供高、中、低优先费用的选择。高优先级意味着用户支付更高的交易费,但交易可能就会被打包进下一个块中。中低优先级意味着用户支付较低的交易费,但交易可能需要更长时间才能确认。

许多钱包应用程序使用第三方服务进行费用计算。一个流行的服务是http://bitcoinfees.21.co,它提供了一个API和一个可视化图表,以satoshi / byte为单位显示了不同优先级的费用。

小贴士:静态费用在比特币网络上不再可行。 设置静态费用的钱包将导致用户体验不佳,因为交易往往会被“卡住”,并不被确认。 不了解比特币交易和费用的用户因交易被“卡住” 而感到沮丧,因为他们认为自己已经失去了资金。

下面费用估算服务bitcoinfees.21.co中的图表显示了10个satoshi / byte增量的费用的实时估计,以及每个范围的费用交易的预期确认时间(分钟和块数)。 对于每个收费范围(例如,61-70 satoshi /字节),两个水平栏显示过去24小时(102,975)中未确认交易的数量(1405)和交易总数,费用在该范围内。 根据图表,此时推荐的高优先费用为80 satoshi / 字节,这可能导致交易在下一个块(零块延迟)中开采。 据合理判断,一笔常规交易的大小约为226字节,因此单笔交易建议费用为18,080 satoshis(0.00018080 BTC)。

费用估算数据可以通过简单的HTTP REST API(https://bitcoinfees.21.co/api/v1/fees/recommended)来检索。 例如,在命令行中使用curl命令:

运用费用估算API

$ curl https://bitcoinfees.21.co/api/v1/fees/recommended

{"fastestFee":80,"halfHourFee":80,"hourFee":60}

API通过费用估算以 satoshi per byte 的方式返回一个 JSON 对象,从而实现”最快确认“ (fastestFee),以及在三个块(halfHourFee)和六个块(hourFee)内确认。

 

\

图6-2bitcoinfees.21.co提供的费用估算服务

size 的计算公式

1)方式1

在比特币的交易中,如果矿工费用设置过高或者过低,交易都不能成功生成,所以我们还需要计算交易中的矿工费用,这里有一个公式可以大致预估出交易所需的 size,然后将 size 再乘以 每比特的价格 就可以得到矿工费用了。

size = inputsNum * 148 + outputsNum * 34 + 10 (+/-) 40
  • inputNum 指交易中的 Input 个数
  • outputNum 指交易中的 Output 个数
  • 最后一部分是加减更加精确的做法 40


     

    更加精确的做法

    方式2)通过bitcoinjs
    //使用测试网络 #正式环境把testnet去掉
    var testnet = bitcoin.networks.testnet

    //获得签名交易的对象

    var alice = bitcoin.ECPair.fromWIF
    ('cTRWz1dALytHZP3WVdGDjmi5Z9gijqPjmzTM6C2BwHQQ3EqNtNQW',testnet);

    //获得构建交易的对象

    const test_txb = new bitcoin.TransactionBuilder(testnet)

    test_txb.setVersion(2)

    test_txb.addInput('93dcd13d86e540dbb58f9d705ebc5dfe1ec6bfc1161b5f84d230cc6ad819e09a',1)

    test_txb.addOutput('2MwpK3YP1QpTB9WNSrixATRegwLPaGrZCRF',9995788 )

    test_txb.addOutput('mqgEi75mTAJWbHABQ6PsbSfrXzUcZBeM4s',200000000)

    //签署交易

    test_txb.sign(0,alice)
    //交易hex

    var rawtransaction = test_txb.build().toHex();
    //获得size具体大小

    var size  = rawtransaction.length/2

  • 测试网区块浏览器地址:
    此交易hash:c376f70c3e77519841c7b3088ad19f9a22c56cc57410ff4ec3f84c737696a875
    https://test-insight.bitpay.com/tx/c376f70c3e77519841c7b3088ad19f9a22c56cc57410ff4ec3f84c737696a875

没有更多推荐了,返回首页