译者前言:
据比特币核心开发人员 Mike Hearn 透露,比特币协议在今年将会迎来四大改动,其中一项就是转账所需要的交易费(transaction fee)将会浮动。实际上,Gavin Andresen 在几个月前就在一篇笔记中为大家勾画了交易费的变更计划。下面就让我们来看看它的详细情况吧。
网络/矿工收费政策的迁移计划
要想改变交易在网络中传递以及矿工将其保存到区块链中所需的交易费用,是需要花一些心思的。政策不匹配可能会导致用户的交易无法得到确认,这要么是交易无法到达矿工那里(它们没有被传递过去),要么就是交易被矿工直接拒绝了。
我一直在努力简化 0.9 版本的交易费规则。这篇帖子的目的是说明所有使这一转变尽可能顺利执行所需要的细节。
总体的思路是,交易生成部分的代码将会比较保守,从而保证生成与以前版本的规则相一致的交易。 而交易传递和挖矿确认的代码被会变得更加主动,以满足未来可能发生的变化。
0.8.5 版规则
0.8.5 传递规则
基本费用:每 1000 字节 10000 聪(satoshis),交易的大小将向上取整至最接近的 1000 字节(例如 1001 字节的交易需要 20000 聪)。这个值可以通过 minrelaytxfee 参数来进行更改。
如果交易符合下列条件的话:
- 支付的成本低于收费的基本费用
- 小于 10000 字节
- 没有任何一个输出小于0.01 XBT
那么它们将被认为是“免费交易”。他们将会被限速,然后(在合适的时候)传递出去。
这里还有另一个相关的规则:如果交易的输出非常小的话(大概在 5000 聪左右,我们称为“尘土交易”)将被认为是不合标准的从而不会被转发。
0.8.5 纳入规则
所有的传递规则依然适用,因为节点不会去挖掘交易,除非他们将其传递出去(以及接受并纳入自己的内存池里)。
包含着大量免费交易、大小为 27000 字节的块(通过 blockprioritysize 参数可以改变)所具有的优先级大于 57600000 的块(这等于一个 250 个字节的交易其输入为 1XBT,并且超过了一天时间)。
块(默认 blockmaxsize:250000 字节)的其余部分则包含着至少 10000 聪每 1000 字节的交易(可以通过 mintxfee 参数改变)。注意,这里没有对字节数进行取整。
0.8.6 版规则变更提议
0.8.6 传递规则
除去了“所有输出必须大于 100 聪”的规则。(这是为了简化事务创建/处理逻辑。)
0.8.6 纳入规则
将默认的 maxblocksize 增加至 350000 字节。 将高优先级事务的默认空间增加至 30000 字节。(这是为了适应更高的交易量,并用来衡量默认的算力占了多大的比例。)
0.8.6 钱包
超过 1000 字节的交易必须支持交易费。(这是为了给免费交易预留空间。)
0.9 版规则变更提议
优先级计算方式将被修改,使得花费中额外的输入不会降低优先级。(这是为了鼓励清理灰尘交易造成的 UTXO 设置。)
0.9 传递规则
当计算传递所需的最小交易费时,不再四舍五入到下一个 1000 字节。 (这是为了与控矿代码匹配)
新的“拒绝”消息将被实现,告诉其它结点他们的交易由于费用不足而不会被传递下去。(这只是一个临时的解决办法,我们会努力想出一个对 SPV 更友好的解决方案。)
0.9 纳入规则
要求矿工必须设置 mintxfee 和 minblocksize 等参数,如果他们不这样做将被拒绝开采。 (这是为了让交易费/块大小等在评估时决策非中心化。)
0.9 钱包
使用新的“聪明费用(smartfee)”代码,来确定交易是否具有足够高的优先级将在不久的几个块区块中得到开采。 如果优先级够高,并且旧规则下的优先级也大于旧阈值,则传递时不需要交易费。
如果交易被判定为不应该免费:将按 0.8.6 的传递规则计算最低费用,并与使用新的“聪明费用”代码计算出来的费用比较,选择二者中较大的数值来当作交易费。
0.9 版后期的变更
长远的目标是摆脱计算交易费的相关常数的所有的硬编码,让矿工来决定他们要处理的交易,并让钱包找出矿工以及矿工所处理的内容。
0.9+ 传递规则
剔除 minrelaytxfee 参数,实现一个有优先级,内存有限的内存池。传递过来的交易如果适用的话将马上放入池中,不合适的将被拒绝。(具体实现还有待决定,也许会拒绝那些虽然具有优先级但权值小于当前池中最小权值的交易,并驱逐时间最长的交易以保持池的空余容量。)
0.9+ 钱包
剔除旧规则下的计算代码,只需使用新的交易费估算代码。(因为完整性检查的原因,将拒绝我们的内存池不会传递的交易。)