比特币源码研读之十三

比特币源码研读系列已完成十二篇了,在前面的十二篇中我们大部分时间是在对传入的参数、定义的全局变量以及代码结构进行了解析,虽然比较繁琐,但是这些内容的研读着实让我对比特币源码中的一些细节有了更深入的理解,掌握了其主要参数所在位置。掌握了这些信息后不管是快速理解后续的源码,还是后续开发自己的区块链产品都可奠定很好的基础。所以,我仍然选择耐着性子稳步对源码进行仔细研读,只有这样才能让自己真正掌握比特币源码,不至于以后还要反复回来重新阅读源码,耗费不必要的时间与精力。同时,也希望大家在看我文章时能提出宝贵意见,一起讨论一起进步。

本文将继续开展应用程序参数交互源码部分(AppInitParameterInteraction)的研读与分析。

本文主要涉及的源码文件包括:

src/bitcond.cpp、src/init.h、src/init.cpp、src/util.h、src/util.cpp、src/validation.h、src/uint256.h、src/policy.h、src/policy.cpp、src/amount.h、src/amount.cpp

一、交易费增长量

交易费增长量(incrementalRelayFee)的默认值在src/policy.h中定义,该值为静态全局变量,其默认值为1000聪,具体定义如下:

/**Default for -incrementalrelayfee, which sets the minimum feerate increase formempool limiting or BIP 125 replacement **/

static const unsigned int DEFAULT_INCREMENTAL_RELAY_FEE = 1000;

incrementalRelayFee为全局变量,其在src/policy.h中声明,并在src/policy.cpp中定义,具体定义如下:

CFeeRate incrementalRelayFee = CFeeRate(DEFAULT_INCREMENTAL_RELAY_FEE);

同时init.cpp中针对incrementalRelayFee的注释如下:

// incremental relay fee sets the minimimum feerateincrease necessary for BIP 125 replacement in the mempool

// and the amount the mempool min fee increases above the feerate of txs evicted due to mempool limiting.

通过其注释我们可以看到incrementalRelayFee的功能是设置最小费率增长量,通过设置交易费增长量与交易最小费的目的考虑交易池的容量限制,排除一些交易费过低的交易,即将其交易退回。

此处还需对incrementalRelayFee做进一步解释,该值可理解为最小交易费用设置的最低值,因为交易池中交易费的增量是以incrementalRelayFee为基础的,所以每笔交易费必须大于等于incrementalRelayFee,也就是说最小交易费也必须大于等于该值。

我们再来看针对incrementalrelayfee参数的处理代码,程序首先通过IsArgSet判断是否设置了incrementalrelayfee参数,如果设置了,则通过ParseMoney函数将输入的以字符串表达的交易增长费转换为数字型的增长交易费,ParseMoney与其反向求解的FormatMoney函数均定义与src/utilmoneystr.h,这两个函数一个是将数字转换为字符串,一个是将字符串转换为数字。

如果传入的金额无效则退出程序,反之为incrementalRelayFee赋值,为其费率值赋予传入的数值:

incrementalRelayFee = CFeeRate(n);

通过CFeeRate(src/amount.h中定义与注释)我们可以知道传入的n的单位为每千字节需要n聪的金额。

二、验证脚本线程数

验证脚本线程数可通过-par参数设置,其线程数获取代码如下:

nScriptCheckThreads = GetArg("-par",DEFAULT_SCRIPTCHECK_THREADS);

通过其注释我们可以看到-par=0时意味着程序自动根据机器情况自动检测线程数,同时如果nScriptCheckThreads==0意味着将不按并发方式实现脚本验证,即脚本验证线程数为0。

默认线程数DEFAULT_SCRIPTCHECK_THREADS在src/validation.h中定义,其默认值为0,意味默认选择自动检测验证线程数。

/**-par default (number of script-checking threads, 0 = auto) */

static const int DEFAULT_SCRIPTCHECK_THREADS = 0;

同时与该宏定义一起定义的还有最大脚本验证线程数常量MAX_SCRIPTCHECK_THREADS,其默认值为16,即程序中最多启动16个线程用于脚本验证操作,其定义如下:

/** Maximum number of script-checking threads allowed*/

static const int MAX_SCRIPTCHECK_THREADS = 16;

我们再来看后面对nScriptCheckThreads的逻辑判断,当nScriptCheckThreads输入值为0或负数时,程序将通过GetNumCores()函数获取程序运行机器能提供的线程数,然后nScriptCheckThreads加上获取的线程数获得脚本验证的线程数。最后是判断nScriptCheckThreads的值:

(1)如果为nScriptCheckThreads<= 1,则nScriptCheckThreads=0;

(2)如果nScriptCheckThreads >MAX_SCRIPTCHECK_THREADS,即验证线程数大于16时,则nScriptCheckThreads赋值为MAX_SCRIPTCHECK_THREADS。

nScriptCheckThreads在src/validation.cpp以及src/init.cpp中使用,src/validation.cpp中主要用于判断是否需要进行脚本验证,使用之处包括

(1)CCheckQueueControl control(fScriptChecks &&nScriptCheckThreads ? &scriptcheckqueue : NULL);

(2)CheckInputs(tx, state, view, fScriptChecks, flags, fCacheResults,txdata[i], nScriptCheckThreads ? &vChecks : NULL)。

而src/init.cpp中则在后面将会研读到的AppInitMain函数中,在该函数中将根据nScriptCheckThreads启动相应数量的线程,其实现代码如下:

LogPrintf("Using %u threads for scriptverification\n", nScriptCheckThreads);

if (nScriptCheckThreads) {

for(int i=0; i

threadGroup.create_thread(&ThreadScriptCheck);

}

通过上面代码我们可以看出,通过线程组创建nScriptCheckThreads个脚本验证线程,线程处理函数为ThreadScriptCheck,其定义于src/validation.h中,实现于src/validation.cpp中,在该函数中通过脚本验证队列管理脚本验证线程,其具体运行方式我们将AppInitMain函数的研读中详细说明。

以上就是本篇文章的研读记录,这篇文章涉及的交易费增长量和验证脚本线程都与比特币中的交易相关,正如《精通比特币》作者在其交易章节说到的“比特币交易是比特币系统中最重要的部分。”,所以,我在写本文的研读记录时对其中的概念进行了多方斟酌、考量与验证,当然也有可能存在理解不到位的情况,大家如果有好的建议可以在留言中给出,我们可以一起讨论,完善我们的研读系列!

区块链研习社比特币源码研读班 菜菜子


以下是我们研习社公众号,欢迎大家订阅并加入我们研习社,一起学习区块链技术


以下是广告:

我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。

目前入圈价格初始定价50元,50人调整一次价格,每次调整幅度为50元!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 文 by 达达 在我们的日常生活中,有六大原因破坏女性身材: 1.地心引力 作为地球一份子,地心引力是我们每天面对...
    Hdada阅读 1,595评论 0 0
  • 最近因为忙碌重点实验室的事情,很多事情都需要配合老师的工作进行,忙得着实不可开交。 这两天连续的熬夜已经让抵抗力严...
    Natsuka阅读 204评论 0 0
  • 我从来不觉得有人能陪我走完这一生 这个年纪的感情真的很脆弱 好像纸一样 一刮就跑一揉就皱一扯就破 无论是谁我...
    自此以后念及心动阅读 110评论 0 2
  • 凌晨两点 你睡不着 因为你想她啊 你看你,一直傻笑 黑夜马上就逃之夭夭 困意和床依旧徒劳 时间一分一秒,一分一秒 ...
    何洮久阅读 259评论 0 0
  • 姓名:母光艳 公司:宁波贞观电器 第235期,利他二组 【日精进打卡第241天】 【知-学习】 诵读《六项精进》大...
    母光焱阅读 126评论 0 0