当前位置:首页 > 金融 > ELISUN-怎么接入比特币网络以及其原理剖析
ELISUN-怎么接入比特币网络以及其原理剖析
作者:发布时间:2019-09-06 15:52:31来源:

ELISUN相信很多人会问怎么接入比特币网络?

ELISUN这就说明其实接入比特币网络是十分简略的,我说了你必定不信,发动比特币客户端即可:

在指令行终端输入发动指令:./src/bitcoind -testnet

 

输入之后会有一个和网络同步数据的进程,你会看到:

 

这个进程需求一点时刻,同步数据完结后,即接入了比特币网络。

 

2、发动流程俯瞰

尽管说一句指令即搞定,可是,这个背面代码运转的逻辑可就不简略咯~

来,我给咱们剖析一下

 

当在指令行终端输入发动指令:./src/bitcoind -testnet 后,操作体系就会找到这个文件中的 main 函数,开端比特币客户端的发动。

 

关于一切的c++代码,整个程序都是从main函数开端履行的,bitcoind 的main函数坐落 src/bitcoind.cpp,代码拉到最终就找到了咱们的 main 函数。

main 函数本身没有太多东西,首要是调用3个函数来履行,它们的首要作用是设置环境变量、设置信号处理和发动体系。

 

详细代码如下:

 

int main(int argc, char* argv[])

{

SetupEnvironment();

// Connect bitcoind signal handlers

noui_connect();

 

return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE);

}

 

这段代码简略阐明如下:

SetupEnvironment 函数,首要用来设置体系的环境变量,包含:malloc 分配内存的行为、Locale、文件途径的本地化设置等。

noui_connect 函数,设置衔接到 bitcoind 的信号的处理。

AppInit 函数,进行体系发动。

下面咱们要点讲下 AppInit 函数的履行

调用 SetupServerArgs 函数,设置体系可接受的一切指令行参数。然后开端解析指令行传递的各种参数。体系履行的重要一步便是设置能够接纳的参数并解析用户发动时传递的各种参数,SetupServerArgs 函数便是完结这个意图。下面来看这个函数的履行流程。

首要,调用 CreateBaseChainParams 函数,生成默许的根本参数,包含:运用的数据目录和监听的端口。依据不同的网络类型,主网络运用 8332 端口和指定目录下的当时目录,测验网络运用 18332 端口和指定目录下的 testnet3 子目录,回归测验网络 运用 18443 端口和指定目录下的 regtest 子目录。

然后,调用 CreateChainParams 函数,生成默许的区块链参数。这个办法也会区别不同的网络。假如是主网络,则生成 CMainParams 方针进行初始化。在结构函数中,进行如下的设置:

设置网络ID 为 main;

设置一致参数(Consensus::Params)的各个值:

每隔多少个块(nSubsidyHalvingInterval)后续比特币的奖赏会折半,值为 210000。依据创世区块奖赏的数量(50),依据等比数列求和公式:

50∗(1/(1−0.5))∗210000" role="presentation" >50∗(1/(1−0.5))∗21000050∗(1/(1−0.5))∗210000

,可计算钱银总量为 2100W个比特币。

BIP34 激活高度(BIP34Height)为 227931。

BIP34 激活哈希(BIP34Hash)为 0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8。

BIP65 激活高度(BIP65Height)为 388381。

BIP66 激活高度(BIP66Height)为 363725。

工作量约束(powLimit)为一个大整数。

难度改动的周期(nPowTargetTimespan)为 2周。

均匀出块时刻(nPowTargetSpacing)为10分钟。

改动一致需求的区块数(nRuleChangeActivationThreshold)为 1916,即 2016 的 95%。

矿工承认窗口(nMinerConfirmationWindow)为 2016,等于难度改动周期除以均匀出块时刻。

接下来设置区块链相关的布置状况,包含:测验相关的(DEPLOYMENT_TESTDUMMY)、CSV 软分叉相关的(涉及到 BIP68、BIP112、BIP113)和阻隔见证相关的(涉及到 BIP141、BIP143、BIP147)。

最佳区块链的最小工作量。

设置默许端口(nDefaultPort)为 8333。

到达多少个区块之后进行区块修剪(nPruneAfterHeight),当时值为 100000。

接下来,调用 CreateGenesisBlock 办法,生成创世区块。这个办法的参数是固定的,指定了创世区块的时刻、随机数、难度值、版别号、奖赏等。在办法内部,生成创世区块的输出脚本和输入脚本,中本聪那句闻名的谈论就出现在创世区块的第一个买卖的签名中,他写道:The Times 03/Jan/2009 Chancellor on brink of second bailout for banks。

设置创世区块的哈希为刚生成的创业区块的哈希。

设置 DNS 种子节点 vSeeds 调集包含的 DNS 种子有:seed.bitcoin.sipa.be,dnsseed.bluematt.me,dnsseed.bitcoin.dashjr.org,seed.bitcoinstats.com,seed.bitcoin.jonasschnelli.ch,seed.btc.petertodd.org,seed.bitcoin.sprovoost.nl 等,经过解析 DNS 种子节点,比特币节点发动时能够找到更多的对等节点来进行衔接。

接下来,设置相关的查看点数据。

假如是测验网络,则生成 CTestNetParams 方针进行初始化。(供开发完结后测验运用。)

假如是回归测验网络,则生成 CRegTestParams 方针进行初始化。(供开发时衔接运用。)

 

关于这两种测验网络,处理根本和主网络相同,仅仅某些参数不一样。

 

上面说到的3个方针 CMainParams CTestNetParams CRegTestParams的界说都在 chainparams.cpp 文件中。感兴趣同学的能够对照源代码进一步探求。

 

接下来,设置体系可接纳的一切参数。部分参数解说如下:

?,显现协助信息;

-version,打印版别信息,并退出体系。

-assumevalid=hex,假如指定的区块存在区块链中,假定它及其先人有用并或许越过其脚本验证。

-blocksdir=dir,指定区块链寄存的目录。

-blocknotify=cmd,指定当主链上的区块改动时履行的指令。

-conf=file,指定装备文件的目录,相关于下面指定的数据目录。

-datadir=dir,指定数据目录。

-dbcache=n,设置数据库缓存巨细。

-debuglogfile=file,设置调试文件的方位。

-feefilter,告知其他节点经过最小买卖费用过滤发送给咱们的库存音讯。

-loadblock=file,在发动时,从外部 blk000??.dat 文件导入区块。

-maxmempool=n,指定买卖池的最大内存数,单位为兆字节。

-maxorphantx=n,指定内存中最大的孤儿买卖数量。

-mempoolexpiry=n,指定买卖池中不盯梢超越指定时刻(小时)的买卖。

-par=n,指定脚本签名的线程数量。

-persistmempool,指定是否耐久化买卖池中的买卖,发动时康复加载。

-pid=file,指定进程文件。

-prune=n,经过启用旧区块的修剪(删去)来下降存储要求。 这答应调用 pruneblockchain RPC 来删去特定块,而且假如供给方针巨细,则启用对旧块的主动修剪。 此方式与 -txindex 和 -rescan 不兼容。

-reindex,依据硬盘上的 blk*.dat 文件重建区块链状况和区块的索引。

-reindex-chainstate,依据当时区块的索引重建区块链的状况。

-txindex,保护一切买卖的索引,被 getrawtransaction RPC 指令调用。

-addnode=ip,增加一个节点,并衔接它,并坚持衔接。

-banscore=n,断开行为不端的火伴的门槛。

-bantime=n,不诚实节点从头衔接需求的秒数。

-bind=addr,绑定到指定的IP,并总是衔接到这个地址。

-connect=ip,仅仅只衔接到指定的节点,假如不是ip而是0,则表明制止主动衔接。

-discover,是否发现自己的IP地址。

-dns,关于 -addnode、-seednode、-connect 总是运用 DNS 查找。

-dnsseed,指定假如已有地址比较少,则进行 DNS 查找来获取对等节点。

-enablebip61,答应发送 BIP61 界说的回绝音讯。

-externalip=ip,指定本身的外部 IP 地址。

-forcednsseed,总是经过 DNS 查找来获取对等节点的地址。

-listen,接纳外部对等节点的衔接。

-listenonion,主动创立 Tor 躲藏服务。

-maxconnections=n,保护到其他节点的最大衔接数。

-maxreceivebuffer=n,每个对等节点的最大接纳缓存。

-maxsendbuffer=n,每个对等节点的最大发送缓存。

-onion=ip:port,设置 SOCKS5 署理。

-peerbloomfilters,支撑布隆过滤器过滤区块和买卖。

-permitbaremultisig,中继非 P2SH 多重签名。

-port=port,指定默许的监听端口。

-proxy=ip:port,经过 SOCKS5 署理进行衔接。

-proxyrandomize,随机化每个署理衔接的凭证。 然后使Tor流进行阻隔。

-seednode=ip,指定一个节点来检索其他的节点,随后就从这个接点进行断开。

-torcontrol=ip:port,在 onion 启用的情况下,指定 Tor 控制器运用的端口。

-torpassword=pass,Tor 控制器的暗码。

-checkblocks=n,在发动时要查看多少个区块。

-checklevel=n,checkblocks 验证区块的程度。

-checkblockindex,进行完好的一致性查看,包含:mapBlockIndex、setBlockIndexCandidates、chainActive、mapBlocksUnlinked 等。

-checkmempool=n,每多少个买卖进行查验。

-checkpoints,供给查看点,对已知链的前史不进行查验。

-deprecatedrpc=method,不赞成运用的 RPC 办法。

-limitancestorcount=n,假如买卖池中的先人买卖到达或超越指定的值时,不再接纳买卖。

-limitancestorsize=n,假如买卖池中的先人买卖巨细到达或超越指定的值时,不再接纳买卖。

-limitdescendantcount=n,假如买卖池中先人买卖的子孙现已到达或超越指定的值时,不再接纳买卖。

-blockmaxweight=n,设置 BIP141 区块的最大 weight。

-blockmintxfee=amt,设置包含在创立区块的买卖最小费用。

-rpcuser=user,进行 RPC 调用的用户名。

-rpcpassword=pw,进行 RPC 调用的用户暗码。

-rpcport=port,进行 RPC 调用的端口

上面是一些常用的参数,经过这些参数能够影响比特币中心的指令。运用开发者比较重视的是 RPC 相关的设置,经过 RPC 接口,咱们调用比特币中心供给的多种服务。这些指令一般会在装备文件中进行设置,不用在指令行指定。

接下来,查看用户指定指令参数是否正确。

if (!gArgs.ParseParameters(argc, argv, error)) {

fprintf(stderr, "Error parsing command line arguments: %s\n", error.c_str());

return false;

}

假如传递的是协助和版别参数,则显现协助或版别信息,然后退出。

查看数据目录(可指定或默许)是否是存在。假如不存在,则打印过错信息,然后退出。

if (!fs::is_directory(GetDataDir(false)))

{

fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", gArgs.GetArg("-datadir", "").c_str());

return false;

}

在 GetDataDir 办法中,依据用户是否在指令行供给 datadir 参数来确认运用默许的数据目录仍是用户指定的数据目录。

读取并解析装备文件,一起查看指定数据目录是否存在。假如任何一个过程犯错,都打印过错信息,然后退出。

if (!gArgs.ReadConfigFiles(error, true)) {

fprintf(stderr, "Error reading configuration file: %s\n", error.c_str());

return false;

}

其间 ReadConfigFiles 办法详细处理如下:

首要,调用 GetArg 办法,获取装备文件名称,默许为 bitcoin.conf。

然后,经过 GetConfigFile 办法获取装备文件的绝对途径(办法内部会托付 AbsPathForConfigVal 办法进行处理,后者决议依据用户指定的途径或运用默许途径来生成装备文件的绝对途径)。在得到装备文件的绝对途径之后,结构文件输入流,然后读取装备文件 fs::ifstream stream(GetConfigFile(confPath))。

在成功结构输入流之后,调用 ReadConfigStream 办法开端读取装备文件的内容。办法内部按行读取装备文件,并以键值对的方式保存在 m_config_args 调集中。

调用 SelectParams(gArgs.GetChainName()) 函数,生成大局的区块链参数,并设置体系的网络类型。假如有过错,则打印过错,然后退出。gArgs.GetChainName() 办法会回来当时运用的网络。针对主网络,回来字符串 main;测验网络,回来字符串 test;回归测验网络,回来字符串 regtest。SelectParams 办法的完成如下所示:

void SelectParams(const std::string& network)

{

SelectBaseParams(network);

globalChainParams = CreateChainParams(network);

}

SelectBaseParams 办法会依据指定的网络参数生成 CBaseChainParams 方针,并保存在 globalChainBaseParams 变量中,并在指定 gArgs 方针中保存网络类型(m_network 特点)。CBaseChainParams 方针中仅保存体系的数据目录和运转的端口,所以称之为根本区块链参数方针。

CreateChainParams 办法会依据不同的网络参数生成 CChainParams 类的子方针,或许为以下三种:CMainParams、CTestNetParams、CRegTestParams。CChainParams 方针包含了区块链方针的一切重要信息,比方:一致规矩、布置状况、查看点、创世区块等。

 

查看一切指令行参数,假如有过错,则打印过错,并退出。

设置参数 -server 默许为真。bitcoind 看护进程默许 server 为真。

调用 InitLogging 函数,初始化体系所用日志,并打印体系的版别信息。详细代码如下,依据是否指定 debuglogfile、printtoconsole 等确认日志打印到文件或是控制台。

关键词:
分享到

热门推荐

VR网站 更多+

  • 鸥课学院

    2017-09-12
  • 玖的VR

    2017-08-10
  • 虚幻引擎社区

    2017-07-15

热门活动

热门专题

合作伙伴

虚拟现实媒体|站点地图|关于我们|招聘信息|VR新闻滚动|联系我们|商务合作
Copyright © 2014-2015 VRRB.CN All Rights Reserved
VR日报 深圳大海传媒科技有限公司版权所有 冀ICP备2023013353号 网站邮箱:gexsf@hotmail.com