比特币代码分析5 挖矿代码分析

本文描述矿工处理线程,通过本文学习,可以了解矿工挖矿的大致流程。
主要包含挖矿费用交易的产生、当前交易池的打包处理,工作量证明等相关内容。流程图(参考网络)如下所示:。

矿工处理函数
1.void ThreadBitcoinMiner(void* parg)
2.{

  1. vfThreadRunning[3] = true;
  2. CheckForShutdown(3);
  3. try
  4. {
  5. bool fRet = BitcoinMiner();
  6. printf("BitcoinMiner returned %s\n\n\n", fRet ? "true" : "false");
  7. }
  8. CATCH_PRINT_EXCEPTION("BitcoinMiner()")
  9. vfThreadRunning[3] = false;
    12.}

生成公钥和私钥
利用openssl库生成
1.CKey key;
2.key.MakeNewKey();
3.
4.void MakeNewKey()
5.{

  1. if (!EC_KEY_generate_key(pkey))
  2. throw key_error("CKey::MakeNewKey() : EC_KEY_generate_key failed");
    8.}

创建挖矿费用,用于挖矿后的奖励
1.CTransaction txNew;
2.txNew.vin.resize(1);
3.txNew.vin[0].prevout.SetNull();
4.txNew.vin[0].scriptSig << nBits << ++bnExtraNonce;
5.txNew.vout.resize(1);
6.txNew.vout[0].scriptPubKey << key.GetPubKey() << OP_CHECKSIG;

创建新块并保存挖矿费用交易
1.auto_ptr<CBlock> pblock(new CBlock());
2.if (!pblock.get())
3.return false;
4.
5.// Add our coinbase tx as first transaction
pblock->vtx.push_back(txNew);

收集最新的验证通过的交易,主要是交易池里的交易
结束条件是:
(1)mapTransactions中所有交易处理完
(2)区块大小达到 MAX_SIZE/2才结束。
1.CTxDB txdb("r");
2.map<uint256, CTxIndex> mapTestPool;
3.vector<char> vfAlreadyAdded(mapTransactions.size());
4.bool fFoundSomething = true;
5.unsigned int nBlockSize = 0;
6.while (fFoundSomething && nBlockSize < MAX_SIZE/2)
7.{

  1. fFoundSomething = false;
  2. unsigned int n = 0;
  3. for (map<uint256, CTransaction>::iterator mi = mapTransactions.begin(); mi != mapTransactions.end(); ++mi, ++n)
  4. {
  5. if (vfAlreadyAdded[n])
  6. continue;
  7. CTransaction& tx = (*mi).second;
  8. if (tx.IsCoinBase() || !tx.IsFinal())
  9. continue;
  10. // Transaction fee requirements, mainly only needed for flood control
  11. // Under 10K (about 80 inputs) is free for first 100 transactions
  12. // Base rate is 0.01 per KB
  13. int64 nMinFee = tx.GetMinFee(pblock->vtx.size() < 100);
  14. map<uint256, CTxIndex> mapTestPoolTmp(mapTestPool);
  15. if (!tx.ConnectInputs(txdb, mapTestPoolTmp, CDiskTxPos(1,1,1), 0, nFees, false, true, nMinFee))
  16. continue;
  17. swap(mapTestPool, mapTestPoolTmp);
  18. pblock->vtx.push_back(tx);
  19. nBlockSize += ::GetSerializeSize(tx, SER_NETWORK);
  20. vfAlreadyAdded[n] = true;
  21. fFoundSomething = true;
  22. }
    33.}

保存输出的字节数、挖矿交易以及缴费到新块中
1.pblock->nBits = nBits;
2.pblock->vtx[0].vout[0].nValue = pblock->GetBlockValue(nFees);

计算交易的Merkle值
1.tmp.block.nVersion = pblock->nVersion;
2.tmp.block.hashPrevBlock = pblock->hashPrevBlock = (pindexPrev ? pindexPrev->GetBlockHash() : 0);
3.tmp.block.hashMerkleRoot = pblock->hashMerkleRoot = pblock->BuildMerkleTree();
4.tmp.block.nTime = pblock->nTime = max((pindexPrev ? pindexPrev->GetMedianTimePast()+1 : 0), GetAdjustedTime());
5.tmp.block.nBits = pblock->nBits = nBits;
6.tmp.block.nNonce = pblock->nNonce = 1;

获取目标难度
1.uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256();

获取随机生成的难度
1.unsigned int nBlocks0 = FormatHashBlocks(&tmp.block, sizeof(tmp.block));
2.unsigned int nBlocks1 = FormatHashBlocks(&tmp.hash1, sizeof(tmp.hash1));
3.... ...
4.BlockSHA256(&tmp.block, nBlocks0, &tmp.hash1);
5.BlockSHA256(&tmp.hash1, nBlocks1, &hash);

工作量证明
如果当前随机hash小于等于目标hash值,表示该区块满足难度要求,则处理该区块
1.if (hash <= hashTarget)
2.{

  1. pblock->nNonce = tmp.block.nNonce;
  2. ... ...
  3. SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
  4. CRITICAL_BLOCK(cs_main)
  5. {
  6. // Save key
  7. if (!AddKey(key))
  8. return false;
  9. key.MakeNewKey();
  10. // Process this block the same as if we had received it from another node
  11. if (!ProcessBlock(NULL, pblock.release()))
  12. printf("ERROR in BitcoinMiner, ProcessBlock, block not accepted\n");
  13. }
  14. SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);
  15. Sleep(500);
  16. break;
    21.}

原文地址:http://blog.51cto.com/13878196/2326489

时间: 2024-08-30 12:43:33

比特币代码分析5 挖矿代码分析的相关文章

对比特币挖矿木马分析研究和清除

本文作者:simeon 来源:i春秋社区 一.什么是比特币系统 有关比特币的专业知识讲解的内容资料很多,我这里只是简单通俗的记录下个人的学习和对他的理解.大家往往看到比特币首先想问的它到底是什么,是不是钱.可以肯定的回答大家,他是钱,但是他不只是个体,他其实是一个虚拟的电子货币支付系统,是的是一个系统. 所以我这里说了这么多的废话,就是希望大家以后看到比特币,我们不是把它看成是一个硬币,而是我们一看到比特币,我就立马想到的是它其实是一个系统(电子币虚拟支付系统).只要大家能这样想,后面讲的内容大

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

[PHP工具推荐]0001.分析和解析代码的7大工具

引言:PHP已成为时下最热门的编程语言之一,然而却有许多PHP程序员苦恼找不到合适的工具来帮助自己分析和解析PHP代码.今天SD就为大家介绍几个非常不错的工具,来帮助程序员们提高自己的工作效率,一起来看看吧! 工具索引: PHP Parser PHPSandbox PHP Mess Detector PHPCPD PHPCheckstyle Ubench PHP Analyzer PHP Parser PHP-Parser是一个用PHP编写的PHP解析器(支持PHP 5.4以及更早的版本),这种

OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析

欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法,在指定平台上给出性能比较,分析每种矩阵元素访问方法的代码复杂度,易用性. 一.预备设置 本文假设你已经正确配置了OpenCV的环境,为方便大家实验,在文中也给出了编译源程序的Makefile,其内容如代码段1所示. 采用如代码段2所示的计时函数,这段代码你可以在我之前的博文中找到,abtic()

通过VS2010性能分析来查找代码中那些地方最损耗资源

在编写完成一个程序后,大家都比较关心程序的性能如何,想把程序优化得更好.很多时候凭个人直觉来优化程序是件非常不靠普的事情,即使你是一个优秀的开人员也很难准确地判断程序中那些出现问题.VS2010提供了性能分析工具就能轻松地帮我们解决这一事情. 假设现在写了一个组件,很想知道组件和代码的性能情况.这个可以简单地写一个测试程序. 测试程序写好后可以通过VS2010分析菜单里选择启用性能向导 选择CPU采样后就选择需要分析的项目 测试项目选择完成后就可以运行分析,结束分析后VS2010会提供个详细报告

自学C语言第二课——选择编译器并开始分析别人的代码

听说现在我在大学大学的同学普遍用的编译器是VC6.0,为了方便向他们请教,于是我刚开始决定选择VC6.0来学习.可是安装的过程出现种种问题,我又不想用绿色版,所以最后选择了安装极为方便的DEV-C++.我想要从分析别人的代码开始学起.同学向我推荐了一本书.然后,我就开始分析书里面的代码. 例题1: 通过百度和看我在大学的同学给我的资料,我认识到: 1.关于<stdio.h> stdio.h就是指“standardinput&output" 意思就是说标准输入输出头文件! 所以

Windows下使用doxygen阅读和分析C/C++代码

转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Source Insight 可以方便地在windows下阅读和分析C/C++代码,但是一步步Go to Definetion 实在令人痛苦.Doxygen能够生成函数调用关系图,所有的函数调用关系可以一目了然,另外他还能统计文档中所有的类,成员变量,成员函数等.总的来说,Doxygen不但能从局部把握代码,还能从全局审视代码,后者是一般IDE和Source In

结构体中指针赋值问题的分析及C代码示例

问题描述 某结构体的定义如下: typedef struct { int iAge; // 年龄 char szAddr1[100]; // 地址1 char *pszAddr2; // 地址2 char **pszAddr3; // 地址3 } T_PeopleInfo; 请问如何对结构体中的各个成员变量(尤其是指针变量)进行赋值? 问题分析及C代码示例 我们可以看到,在结构体T_PeopleInfo中,pszAddr2和pszAddr3均为指针,其中pszAddr2为一级指针,pszAddr

20155326《网络对抗》免考项目——深入恶意代码之生成恶意代码的动静态结合分析

20155326<网络对抗>免考项目--深入恶意代码之生成恶意代码的动静态结合分析 在前两篇博客中,我分别学习了利用静态分析工具和动态分析功具对恶意代码进行分析,在这篇博客中,我将之前学到的知识结合起来,对恶意代码示例进行更深层次的动静态分析. 并且,我学习了使用IDA PRO和OllyDbg对恶意代码进行进一步细化的动态分析,查看恶意代码中主要函数之间的关系以及函数之间的参数,以此来搞清楚恶意代码在运行后对计算机进行了哪些操作. IDA Pro介绍 IDA Pro交互式反汇编器专业版(Int