我试图理解比特币核心用来按费用对内存池事务进行排序的算法。
加文的费用重做建议指出:
接下来,按每千字节支付的费用对所有剩余内存池事务进行排序,并包括尽可能多的事务,直到块的大小达到最大块大小字节为止,不包括“免费”事务(每kb费用小于默认垃圾邮件阈值0.0001 BTC/千字节的事务)。
这是有意义的,因为矿工应该希望在块中加载具有最多“费用密度”或每字节费用的事务。
然而,回顾miner.cpp中的CreateNewBlock函数,我们不清楚在对内存池项目进行优先级排序时,比特币核心是如何计算事务长度的:
//一旦超过优先级大小,就按费用进行优先级排序,否则我们就没有高优先级了
//交易记录:
如果(!fSortedByFee公司&&
((nBlockSize+nTxSize>=nBlockPrioritySize)| |!允许(优先权)
{
fSortedByFee=真;
comparer=TxPriorityCompare(fSortedByFee);
std::make_heap(vecPriority.begin(),vecPriority.end(),comparer);
}
TXPriorityCompare似乎只关注绝对费用:
公众:
TxPriorityCompare(bool\u byFee):byFee(\u byFee){}
bool运算符()(const TxPriority&a,const TxPriority&b)
{
if(收费)
{
如果(a.get<1>()==b.get<1>())
返回a.get<0>()<b.get<0>();
返回a.get<1>()<b.get<1>();
}
其他的
{
如果(a.get<0>()==b.get<0>())
返回a.get<1>()<b.get<1>();
返回a.get<0>()<b.get<0>();
}
}
};
换句话说,这看起来像是一种绝对交易费用,而不是费用密度。我错过了什么?
比特币核心
交易费用
内存池
事务处理选择
分享
改进这个问题
跟随
1小时前编辑
迈克尔·福克森
582077银牌2222铜牌
7月8日15:54问
富阿波达卡
211622金徽章1212银徽章3333铜徽章
添加评论
1个答案
1
你展示的节选是以块为单位的优先区域。源代码中的“优先级”概念对应于每千字节销毁的修改比特币天数。它只用于块大小的一小部分(比特币核心0.11.x默认最大50kB,0.12.x默认最大0kB,可以通过配置设置进行更改)。
看看CreateNewBlock的其余部分,它使用feerate排序,通过迭代mempool上按feerate(=satoshi/kB)预先排序的索引。
分享