版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
增加第二部分(比特币、点点币及币的源码解析)增加第三部分(各大数字加密货币(或基于数字加密货币的ICO)源码解析说明本归朵朵学院及大庆万朵物联网科技所有,任何单位和个 2017511特别说我在这里再次强调一下,本所要求的基础知识真的非常少,就是c\c++和数据结构,所以如果连这个要求都达不到的,那说明你真的不适合做开发。真学习;要不就换一个更基础的看了,本真不适合你。做具体的讲解,这种我基本上都是拉黑,因为本为免费教本发布的地方,以及在哪里可以找到我本主要在三个地方发布B 至于在哪里找到我有问题可以发给我: 基本就这三种方式。Qq群我已经了,说什么我都看不到,qq一前篇一我写这个的目的——愈演愈烈的ICO闹 前篇二你能从本学到些什 前篇三不推荐有以下三个毛病的人学 前篇四关于基于qt4的gui图形界面的指 前篇五本书的整体思 第一章的技术种类与发展历 第一节前 第二节的技术分 第三节编程语言的讨论与选 第四节国内币圈的 第六节总 第二章朵朵学院体验币制 部分 第一节体验币的编译 展 第二节客户端(钱包)一般性解 第二节 的构 第三节set_vars.bat的解 第四节4a_build_daemon.bat的解 第五节4a_build_daemon.bat的解 第六节小 组 第二节第一阶段的小结与下一步的规 第三节客户端的启动源码分析(准备阶段 intmain(intargc,char* boolAppInit(intargc,char* 第四节客户端的启动源码分析(AppInit2的step1到 Step2与 Step1到6的简单总 第五节客户端的启动源码分析(AppInit2的 Step7概 Step7下的 Step7下的 Step7下的PrintBlockTree Step7下的LoadBlockIndex Step7的总 第六节从做币到专家其实只有二步之 第七节客户端的启动源码分析(AppInit2的 Step8概 Step8下的RandAddSeedPerfmon Step8下的GetKeyFromPool Step8的总 第八节关于钱包文件的若干补充说 第九节客户端的启动源码分析(AppInit2的 第十节客户端的启动源码分析(AppInit2的 Step11启动节 Step12收 第六章朵朵学院体验币的源码解析(startnode部分 第一节承上与启 第二节startnode概 第三节学到这里应该具备的基 第四节ThreadStakeMinter概 第七节总 前言我们要学什 第一节什么是版本追 第二节什么是参数剥离 第八章比特币的源码解析(pow模式的创始者 第一节比特币的版本历 第九章点点币的源码解析(pos模式的创始者 第一节朵朵学院体验币与币的关 前篇一我写这个的目的——愈演愈烈的ICO闹2015年底,为了打破开发的神秘感,于是发布了《朵朵学院虚拟不在统计内的相互共享,那就了。我记得当时写《朵朵学院开发初级3.0版》的大环境是因为无意义的克隆币在国内实在太多了,炒币和交易所想着法的做币骗钱。所以这本主要是为了通过简单的开发学习,消除人们对开发的陌生感,防止无意义的克隆币在国内泛滥成灾,以至于量的50%以上。这是挺好的一个事情,一方面,大家都学会了的简单制作,这就是虚是——毁也朵朵。新的更大规模的行为在变的愈演愈烈,那就是ICO——基于代币的众筹行为。最典型的例子莫过于2016年基于的theDAO。我们很难想象,一个号称众筹十多亿ico初创项目,竟然连一个众筹代码都写不好。别的公司20104100万,在2011年12月,第二轮融资9000万,两轮加起来还赶不上一个ICO项目,我更是懒得提了。这么说吧,即便是国家级的断了人家的财路干嘛。所以我也懒得继续分析。具体谁是,谁不,有兴其实,ICO在早期就是一个人或者一个团队,在社区筹点钱做一个项目,比ICO已经完全变味了,动辄就是几千万几亿,而且没有,这已经是一个非常严重的事情,我不是搞金融的,我不大懂,但绝对不因此本着继续遵循“成也朵朵,毁也朵朵”的基本原则,即2015年公开虚学到的知识到自行相关ICO的源代码,自行评估好了。我估计到时候90%的人都会感慨“了,就这么个玩意也敢筹那么多钱”前篇二你能从本学到些什首先说明一下,的源码解析并不需要多少知识,只我看过现在有的人本主要分为三大部分第一大部分是源码的阅读源码的过程中搜集了过去大量的资料,发现最大的问题就是不够系朵朵学院的是,目的是告诉大家如何进行内核级移植,所以在第二大部分是内核的第三大部分是内核级功能移基于的通基于的信息基于的智能合基于的内嵌系基于的特殊共识实现(比如链拟币的相关代码,移植到自己的代码当中,并且正常运行。 完全不一样。这个我之所以命名为《蘑菇随笔》,而不是《XXX开发 ICO项目就前篇三2015c语言都没学不了开发人员。第一个毛病:你是否还停留在群里问问题的阶段,而不是通过或者进行询问?如何也是这样的话,你将停留着一个初学者阶段。第二个毛病:不具备程序员的基本修次之后肯定拉。第三个毛病:希望找保姆的学前篇四关于基于qt4的gui图形界面的指尽管本主要是讲述底层源码解析的,但鉴于很多学员苦于对图形可以去当当网,关于qt4编程的书都可以,淘宝也有大量的可以购如何汉化源码里面直接汉化。上面有大量相关的。后期朵朵学院会不会出相关的开发前篇五本书的首先是第一部分,用朵朵学院体验币的源码做整体的分析主要是告诉大家最终会拆分为三部分源码,btc,ppc和novacoin。币三个目前主要的数字加密货币在近一年内上的新币或者基于数字加密货币做的ICO进行整体的技术评估,看看是否有值得借鉴前的重点是把第二部的几个章节做好际的移植例程,包括智能合约,通讯,共识模式的修改。不过第一 的技术种类与发展历才,从2015年1月开始进行相关的开发,由于是,属于第二职业,因此整4个小时技术,7003000100200410004000就写文章人。目,期间不乏985和211的大学。期间有一个让我尤其深刻,那个项目组N结果我拿到他们的可行性分析报告,竟然发现里面50%以上的技术数据都是错他们在立项的时候就明确的要求从底层协议解决,等于自己把自己堵死然而他们的一句回复让我更哭笑不得“bitcoincore是谁?”我瞬间。所以我打算写一下的技术种类与发展历史,以示正听。第二节的技术分请批评指正。有的可以自行检索。:代表:Bitcoin(首创,2010年正式发布代表:litecoin(非首创,但最通用,2012年正式发布)代表:Peercoin(点点币社区首创,2012年正式发布)智能资产:目前的热点之一代表:nxt(2013年首创)链:目前热门的热点之代表:比特股(2013年首创,人制度,当时引起巨大争议代表1:peershares(点点币社区首创,2013年正式发布),nxt(2013,nu资产(2014,部分实现) 代表:阿侬币(2012年首创并正式运行代表1:代表2:代表3:(2015年才发布第一个无法运行的测试版本)代表4:万事达币(2013年以侧链的概念进行首创,但好像没做成,说原因老婆不让他从事这方面职业系统:内嵌系统币(2012年首创并正式运行)微币(2014年正式运行IBMadept项目(2014年商业化运行,2016年部分开源Linux的超级账本(2016年开始正式运行时都不够的所谓砖家写的文章给了,开发领域非常庞大,除了那个天天在币圈做的xx坊外,还有很多相关技术。而所谓的智能合约,其实只是第三节编程语言的讨论与选目前的编程语言的主流是C\C++,图形界面的开发则是qt4和qt5.例外的目前只有两个,一个是基于java的未来币,以及基于go语言的。剩下的99%以上的数字加密货币都是基于C\C++开发的。可大量的初学者并不懂得这个道理,尤其是各个高校,看火就用做项目,结果发现,不但的资料非常的少,连go语言的资料也同样非常少,做起项目痛苦。本是基于bitcon和其相关延伸代码进行讲解的,因此也主要是基第四节国内币圈的是在乎自己抛出去。句话说,国内币圈的史,同时也是币圈小白的血泪史。20132014年是期,新的唯一的一个亮点是。国内发展则萎靡不振2015年之后国外的币重点则是炒,一直到去年和今年其实我们经常能看到这么一个现象,就是第一个吃螃蟹的人往往没有赚到我写的这个不是告诉大家怎么去做创新,去写,或者弄个发明专利然很多学员会疑惑,为什么不讲XXX啊。或者拿来出来一些连400小时都不够第二章朵朵学院体验币朵朵学院初级3.0版:用qq直接登录即可,免。请学会第一篇——初级币的开或者到我的淘宝宝贝 适合做开发。真学习;要不就换一个看了,本真不适合你。第三 朵朵学院体验币源码解析 部分我在这里再次强调一下,本不是《朵朵学院开发初3.0版》那种手把你做的easy,本质上属于我在进行朵也不会写的那面俱到,否则内容过于庞大,非把我累死不可。能学到什么程度完全看个人的悟性。有什么疑问可以发给我,但币——朵朵币(DDC2)一样,这样你不但会学到很多在里面永到过太多朵朵学院的学员因为小利而与传销组织或者炒币合作,最终上当受骗,背着黑锅,挨着骂,替着别人数钱。请记住借你的名义,也找不到任何的机会C:\xueyuancoin\contrib\easywinbuilder4a_build_daemon.bat,出然后运行C:\xueyuancoin\contrib\easywinbuilder里面的4b_build_qt.bat,这说明我们的qt4编译环境也成功了。C:\文件,双击打开,如果出现如下界面,说明你的qt安装也成功了。关于c++学习:推荐的为《C++Primerplus中文版另外谭浩强教授写的关于C语言和C++的两本书也是我所推荐的,尽管很多人 数据结构,不但会而且要非常熟悉才行,否则学起来也是重重。第二节客户端(钱包)一般性解客户端的,这是一个基本的网络开发原则。但bt则有一些相似,这里没有服务端,而只有客户端,我们称之为ip地址,我们一般称之为节点,然后,我们称之为数据同步;并且与IRC的广播频道当中,与的钱包通讯。钱包分两种,一种是命令行模式,一种是gui模式,但从底层角度来接收与功能,同时提供api接口,供外部程序调用。我这里用的是我做的数字加密货币DDC2(朵朵币2)举例,其中钱包启动后的界主界面主要是三部分组成,wallet部分,当前,和网络状态wallet部分是这个钱包里面的币数,其中余额表示这个钱包里面有多少币。Stake表示的是出块的币数。未确认表示的是收到了币,但却没有进行出块跑几个月,这样对你进行开发,有极大的好处。于挖矿。这个是pos出块特有的指令,主要是用于pos模式下的钱包出块。gui客户端的大概组成。尽管现在的各种“钱包”长的千差万别对于经常混迹在币圈里面的学员可能觉得这一节简单到了无聊,但的遇 第一个build主要是存gui界面编译过程中的一些中间文如果这个第二个contrib存放是一些编译用的小工具,我们一键编译用的那两个快个easywinbuilder并不是所有源码里面都有,而是有人专门做的,在第四Doc是一个很关键但会被大多数人忽略的,这个里面主要存放是这Libs里面是编译的二进制代码库,这个也不是所有的源码里面都有Src里面是所有的钱包源码文件,在第五节进行进一步的解析。pro的文件,我第四朵学院体验币源码解析(编译部第一节easywinbuilder contrib存放是一些编译用的小工具,我们一键编译用的那两个快捷方式就是在这个文件夹的easywinbuilder里面。第二节 其中带齿轮的就是批命令,其中1到3都是做编译环境用的,我们暂且不提。4a件是最容易忽略但最建议看的,就是readme.md。EasyWinBuilder(c)2013phelix -MIT all_easywinbuilder.batormanuallystartthebatchfilesinorder.BuildingBitcoinonWindowsreallyisapain.HopefullythissavespeoplesomeEasyWinBuildercanrunonamintwindowssystem(e.g.avirtualmachine)ornormalsystem.ItmightoverwriteyourMinGWorQtinstallation,though.Pleasenotetheprocesstakesabouthalfanhourormoreandwillneedabout3GBofharddrivespace.InthisrepositorytherearenochangestotheBitcoincodeitselfthoughtheprocessmakesahandfulofsmallchanges.Thismeansitshouldbepossibletoplug'n'ytheeasywinbuilderdirectoryintosimilarBitcoinversions.Tochangedirectoriesanddependencyversionsedit Moreinfohere:首先,这个是基于bitcon在2013年的版本进行的自动编译,可以编译比特币的早期版本和币的早期版本,或者是类似的修改参数比较少的其他竞争其次,这个的版本号为0.5,这就意味着我们找到那个帖子的原出处后,可特别说明的是,需要服务器才能上,也就是需要买一个 至于怎么买,自己去。容是什么,然后关注一下4a4b两个bat,最后,去set_vars.bat@set @set @setLANG=en_US.UTF8@setOPENSSL=openssl-1.0.1g@setBOOST=boost_1_55_0@remIfyouwonderwhythereisno-s- @setBOOSTSUFFIX=-mgw48-mt-1_55@setMINIUP -@setROOTPATH=..\..@set@rembootstrapcoin@for/F%%ain('dir/b%ROOTPATH%\*.pro')do@setCOINNAME=%%a@setCOINNAME=%COINNAME:-=%@setQTDIR=C:\Qt\4.8.5qt-win-opensource-4.8.5-@remQt5willneedchangesin@setMSYS=%MING @setPERL=%MSYS%/perl.exe@remthefollowingwillbesetasadditionalCXXFLAGSandCFLAGSforeverything-no'or",spaceisok-Wno-unused-variable-Wno-unused-value @remNote:VariablessetherecanNOTbeoverwritteninmakefiles命令调用。那我们接着看看4a和4b两个批命令是怎么调用的。@call//调用set_vars.bat设置基本环@bash@echoBuildingKaixinCoindaemon...@remtodo:rewritethiswith^linewrap@setPARAMS=%PARAMS%INCLUDEPATHS="@remsetPARAMS=%PARAMS%-@setPARAMS=%PARAMS%-@setPARAMS=%PARAMS%-@setPARAMS=%PARAMS%-I'../%EWBLIBS%/%MINIUP%'@set@setPARAMS=%PARAMS%@remsetPARAMS=%PARAMS%-@setPARAMS=%PARAMS%-L'../%EWBLIBS%/%OPENSSL%'@setPARAMS=%PARAMS%-L'../%EWBLIBS%/%MINIUP @set @setPARAMS=%PARAMS:\=/%@echoPARAMS:@setPARAMS=%PARAMS%@remremove"rem"fromthenextlinetodeactivateupnp@remsetPARAMS=%PARAMS%USE_UPNP=-@cd%ROOTPATH%\src@iferrorlevel1gotoerror@iferrorlevel1goto in./src:)@ifnot"%RUNALL%"=="1"pause@gotoend@echo!!!!!!Error!Builddaemonfailed.@cd首先是调用set_vars.bat设置基本环境我们接下来看看4b@call@ifnot"%WAITQT%"=="1"gotocontinue@echoEnsureQtinstallerhasfinished.@bash@cd@echobuildingqt-@set @echoQMPS%@%QTPATH%\qmake.exe@echobuildingqt-make...@iferrorlevel1goto %COINNAME%- %COINNAME%-in./release@cd@ifnot"%RUNALL%"=="1"进行编译的,因此就先讲了,而且Easywinbuilder的源代码也比较简单,方便学员入手。站去看看版本的源码。第五朵学院体验币源码解析(启动部第一节src下面的这一节课我们简单讲一下源码的组成,也就是,源码究竟大概都有哪些的内容一掠而过。Json、test,obj-test不提。首先是obj文件夹,这个是用来预编译的临时文件用的,里面的内容可是.cppc\c++makefile.mingw,这个是编译用的文件。总共多少个文件呢,我们数一下,一共是6464个文件,你就是专家了。Ok,看起来就是这么简单 然后知道了内核源码都是在src文件夹一级 下面,总共是64个文件。第三节客户端的启动源码分析(准备阶段客户端的启动流寻找源码 advancedfindmain(。为什么要输入这个函数?很简单,因为c\c++的函数就叫做main(。那为什么不输入main()?同main后面会跟着一个括号。然从启动角度研究,那自然就要找到这个函数了。!没有QT_GUI的时候则执行,什么意思的,我们DEFINES+=QT_GUIBOOST_THREAD_USE_LIBQT_GUI注释掉了,就可以正常显示了?Ok,我们把这个删除了看一init.cpp176行,发现灰色已经变成白色了。说明我们的intmain(intargc,char*我们阅读一下函数intmain(intargc,char*{boolfRet=//ConnectbitcoindsignalhandlersfRet=AppInit(argc,if(fRet&&fDaemon)return0;return}口函数AppInit。boolAppInit(intargc,char*//#if果进行gui编译,则从另一个函数执行。boolAppInit(intargc,char*{boolfRet=false;{ParseParameters(argc,if{}
fprintf(stderr,"Error:SpecifieddirectorydoesnotReadConfigFile(mapArgs,mapMultiArgs);if(mapArgs.count("-?")||mapArgs.count("--{std::stringstrUsage=_("xueyuancoinversion")+""+FormatFullVersion()+"\n\n"+_("Usage:")+"\n""\n"
"xueyuancoind ""xueyuancoind[options]<command>[params]"_("Sendcommandto-serverorxueyuancoind")+"\n""xueyuancoind[options] "_("Listcommands")+"\n""xueyuancoind[options]help "_("Gethelpforacommand")+strUsage+="\n"+fprintf(stdout,"%s",strUsage.c_str());returnfalse;}//Command-linefor(inti=1;i<argc;i++)&&!boost::algorithm::istarts_with(argv[i],"xueyuancoin:"))fCommandLine=true;if{intret=CommandLineRPC(argc,argv);}fRet=}catch(std::exception&{PrintException(&e,}catch(...)PrintException(NULL,}ifreturnfRet;}个就是引入新的函数AppInit2。其余的部分由于修改的很少,自行学习即 第四节客户端的启动源码分析(AppInit2的step1到boolAppInit2()概/**Initialize @preParametersshouldbeparsedandconfigfileshouldbebool{…}3078799客户端的启动源码就完全在这个函数里面,Step2 //MakesureonlyasingleBitcoinprocessisusingthedatadirectory.boost::filesystem::pathpathLockFile=GetDataDir()/".lock";FILE*file=fopen(pathLockFile.string().c_str(),"a");//emptylockfile;createdifitdoesn'texist.if(file)if(!lock.try_lock())returnInitError(strprintf(_("Cannotobtainalockondatadirectory%s.xueyuancoinisprobablyalreadyrunning."),strDataDir.c_str()));if(GetBoolArg("-shrinkdebugfile",ShrinkDebugFile();//debug文 _DATE.c_str());//朵朵学院体验 if GetTime()).c_str());//时printf("Defaultdatadirectory%s\n",GetDefauataDir().string().c_str());//缺省printf("Useddatadirectorys\nstrDataDir.c_str());//使用的数据std::ostringstreamstrErrors;if(filesystem::exists(GetDataDir()/{ }db.cpp里面,所以我们得到一个结论——db.hdb.cpp的功能之一是处理钱包 (*recoverFunc)(CDBEnv&dbenv,std::stringstrFile)){Dbdb(&dbenv,intresult=db.verify(strFile.c_str(),NULL,NULL,//berkeleyDB->verify()函数对wallet.dat进行校验。}if(mapArgs.count("-{BOOST_FOREACH(stringstrAddr,mapMultiArgs["-{CServiceaddrLocal(strAddr,GetListenPort(),fNameLookup);if(!addrLocal.IsValid())returnInitError(strprintf(_("Cannot-externalipaddress:'%s'"),strAddr.c_str()));AddLocal(CService(strAddr,GetListenPort(),fNameLookup),}}if(mapArgs.count("-checkpointkey"))//ppcoin:checkpointmasterpriv{InitError(_("Unabletosigncheckpoint,wrong}BOOST_FOREACH(stringstrDest,mapMultiArgs["-seednode"])Step16Step4是做一些应用初始化的;Step5是用来检测钱包完整性的;Step6是用来做网络初始化的。第五节客户端的启动源码分析(AppInit2的Step7概if{}if(GetBoolArg("-loadblockindextest")){CTxDBtxdb("r");return}nStart=ifreturnInitError(_("Errorloadingprintf("blockindex%15"PRI64d"ms\n",GetTimeMillis()-if(mapArgs.count("-{stringstrMatch=mapArgs["-printblock"];intnFound=0;for(map<uint256,CBlockIndex*>::i tormi=mapBlockIndex.begin();mi!=mapBlockIndex.end();++mi){uint256hash=if(strncmp(hash.ToString().c_str(),strMatch.c_str(),strMatch.size())==0){CBlockIndex*pindex=(*mi).second;CBlockblock;}}if(nFound==printf("Noblocksmatching%swerefound\n",return}Step7bitdb.Open(GetDataDir())的原型为bool我们从函数进行发现filesystem::pathpathLogDir=pathDataDir/"database";filesystem::pathpathErrorFilepathDataDir"db.log";首先处理的是database下面的nDbCache=GetArg("-dbcache",25);dbenv.set_cachesize(nDbCache/1024,(nDbCache%1024)*
dbenv.set_errfile(fopen(pathErrorFile.string().c_str(),/// MIT,dbenv.set_flags(DB_TXN_WRITE_NOSYNC,Step7bool{returnfalse;returntrue;//Calculatevector<pair<int,CBlockIndex*>>vSortedByHeight;BOOST_FOREACH(constPAIRTYPE(uint256,CBlockIndex*)&item,{CBlockIndex*pindex=item.second;}sort(vSortedByHeight.begin(),vSortedByHeight.end());BOOST_FOREACH(constPAIRTYPE(int,CBlockIndex*)&item,{CBlockIndex*pindex=item.second;pindex->bnChainTrust=(pindex->pprev?pindex->pprev->bnChainTrust:0)+pindex-//ppcoin:calculatestakemodifierchecksumpindex->nStakeModifierChecksum=returnerror("CTxDB::LoadBlockIndex():Failedstake} //LoadhashBestChainpointertoendofbestchainif(!ReadHashBestChain(hashBestChain)){if(pindexGenesisBlock==NULL)returntrue;returnerror("CTxDB::LoadBlockIndex():hashBestChainnot}ifintheblockindex");pindexBest=mapBlockIndex[hashBestChain];nBestHeight=pindexBest->nHeight;bnBestChainTrust=pindexBest->bnChainTrust;printf("LoadBlockIndex():hashBestChain=%sheight=%dtrust=%s//ppcoin:loadifprintf("LoadBlockIndex():synchronizedcheckpoint%s\n",//LoadbnBestInvalidTrust,OKifitdoesn'texist//Verifyblocksinthebestchain应该是在最佳里面确认块身intnCheckLevel=GetArg("-checklevel",intnCheckDepth=GetArg("-checkblocks",2500);if(nCheckDepth==0)nCheckDepth= ;//sufficesuntiltheyear19000if(nCheckDepth>nBestHeight)nCheckDepth=printf("Verifyinglast%iblocksatlevel%i\n",CBlockIndex*pindexFork=map<pair<unsignedint,unsignedint>,CBlockIndex*>for(CBlockIndex*pindex=pindexBest;pindex&&pindex->pprev;pindex=pindex->pprev){if(fRequestShutdown||pindex->nHeight<ifreturnerror("LoadBlockIndex()://checklevel1:verifyblockif(nCheckLevel>0&&{printf("LoadBlockIndex():***foundbadblockat%d,hash=%s\n",pindex->nHeight,pindexFork=pindex->pprev;}//checklevel2:verifytransactionindexif(nCheckLevel>1){pair<unsignedint,unsignedint>pos=make_pair(pindex->nFile,pindex->nBlockPos);mapBlockPos[pos]=BOOST_FOREACH(constCTransaction&tx,{uint256hashTx=tx.GetHash();CTxIndextxindex;if(ReadTxIndex(hashTx,{//checklevel3:checkertransactionif(nCheckLevel>2||pindex->nFile!=txindex.pos.nFile||pindex->nBlockPos!={//eitheranerrororaduplicatetransactionCTransactiontxFound;if{mislocatedtransaction%s\n",hashTx.ToString().c_str());pindexFork=pindex-duplicate
if(txFound.GetHash()!=hashTx)//not{printf("LoadBlockIndex():***txpositionfor%s\n",pindexFork=pindex-}}//checklevel4:checkwhetherspenttxoutswerespentwithinthemainchainunsignedintnOutput=0;if(nCheckLevel>3){
BOOST_FOREACH(constCDiskTxPos{if{pair<unsignedint,unsignedint>posFind=make_pair(txpos.nFile,txpos.nBlockPos);if{printf("LoadBlockIndex():***foundbadspendat%d,hashBlock=%s,hashTx=%s\n",pindex->nHeight,pindexFork=pindex-}//checklevel6:checkwhetherspenttxoutswerespentbyavalidtransactionthatconsumethemif{CTransactionif{cannotreadspendingtransactionof%s:%ifromdisk\n",hashTx.ToString().c_str(),nOutput);pindexFork=pindex-}
else{printf("LoadBlockIndex():&txin,hashTx&&txin.prevout.n==
}{
pindexFork=pindex-boolfFound=BOOST_FOREACH(constCTxInif(txin.prevout.hash==fFound=true;if(!fFound){***spendingtransactionof%s:%idoesnotspendit\n",hashTx.ToString().c_str(),nOutput);pindex-
pindexFork}}}}}}}
//checklevel5:checkwhetherallprevoutsareif{BOOST_FOREACH(constCTxIn&txin,{CTxIndexif(txindex.vSpent.size()-1<txin.prevout.n||{printf("LoadBlockIndex():***unspentprevout%s:%iin%s\n",txin.prevout.hash.ToString().c_str(),txin.prevout.n,hashTx.ToString().c_str());pindexFork=pindex-}}}}}}return}Step7PrintBlockTreeLoadBlockIndexboolLoadBlockIndex(boolfAllowNew)。这个函boolLoadBlockIndex(bool{//LoadblockCTxDBif//Initwithgenesisif{if(!fAllowNew)returnfalse;//Genesisconstchar*pszTimestamp="Ari20,2014,PutinSignsTreatyToAddCrimeaToMap.";CTransactiontxNew;txNew.nTime=nChainStartTime;txNew.vin[0].scriptSig=CScript() <<<<vector<unsignedchar>((constunsignedchar*)pszTimestamp,(constunsignedchar*)pszTimestamp+strlen(pszTimestamp));CBlockblock;block.hashPrevBlock=0;block.hashMerkleRoot=block.BuildMerkleTree();block.nVersion=1; =nChainStartTime+15; =bnProof =0;////debugprintprintf("block.GetHash()==%s\n",printf("block.hashMerkleRoot==%s\n",printf("block.nTime=%u\n",block.nTime);printf("block.nNonce=%u\n",block.nNonce);assert(block.GetHash()==(!fTestNet?hashGenesisBlock://StartnewblockfileunsignedintnFile;unsignedintnBlockPos;if(!block.WriteToDisk(nFile,returnerror("LoadBlockIndex():writinggenesisblocktodiskfailed");if(!block.AddToBlockIndex(nFile,returnerror("LoadBlockIndex():genesisblock//ppcoin:initializesynchronizedif(!Checkpoints::WriteSyncCheckpoint((!fTestNet?hashGenesisBlock:hashGenesisBlockTestNet)))returnerror("LoadBlockIndex():failedtoinitsync}return}Step7首先,step7和之前的不一样,是一个非常具体的功能,就是载入。一个是bitdb.Open(GetDataDir(),做 LoadBlockIndex(boolfAllowNew)函数,用于的。其中用的是CTxDB::LoadBlockIndex()函数。如果为空,则创建新的创世纪块。第六节从做币到专家其实只有二步之易得罪人,所以写了一个温柔的题目——从做币到专家其实只有二步之if{if(!fAllowNew)returnfalse;//Genesisconstchar*pszTimestamp="Ari20,2014,PutinSignsTreatyToAddCrimeaToMap.";第一个意思是,如果你之前不会做币,也对的源码就完全没有概念,第二个意思是,其实所谓的专家,在我看来就是对整个的运作家,而且比那些连400小时可能都不够的专家强多了。第七节客户端的启动源码分析(AppInit2的Step8概nStart=GetTimeMillis();boolfFirstRun=true;pwalletMain=newDBErrorsnLoadWalletRet=pwalletMain-if{//CreatenewkeyUserandsetasdefaultkeyCPubKeynewDefaultKey;if(!pwalletMain->GetKeyFromPool(newDefaultKey,false))strErrors<<_("Cannotinitializekeypool")<<//得到新key,函数为GetKeyFromPoolstrErrors<<_("Cannotwritedefaultaddress")<<}printf("%s",printf(" %15"PRI64d"ms\n",GetTimeMillis()-CBlockIndex*pindexRescan=pindexBest;if(pindexBest!=pindexRescan&&pindexBest&&pindexRescan&&pindexBest->nHeight>pindexRescan->nHeight){printf("Rescanninglast%iblocks(fromblock%i)...\n",pindexBest->nHeight-pindexRescan->nHeight,pindexRescan->nHeight);nStart=GetTimeMillis();printf("rescan %15"PRI64d"ms\n",GetTimeMillis()-}DBErrorsCWallet::LoadWallet(bool&{if(!fFileBacked)returnDB_LOAD_OK;fFirstRunRet=false;DBErrorsnLoadWalletRet=if(nLoadWalletRet!=DB_LOAD_OK)returnnLoadWalletRet;fFirstRunRet=NewThread(ThreadFlushWalletDB,return} ..LoadWallet()CWalletDB::LoadWallet(CWallet*pwallet){tryintnMinVersion=0;//GetDbc*pcursor=GetCursor();if(!pcursor){printf("Errorgettingwalletdatabasecursor\n");returnDB_CORRUPT;}{//ReadnextCDataStreamssKey(SER_DISK,_VERSION);CDataStreamssValue(SER_DISK,_VERSION);intret=ReadAtCursor(pcursor,ssKey,ssValue);if(ret==DB_NOTFOUND)elseif(ret!={}
printf("ErrorreadingnextrecordfromwalletreturnDB_CORRUPT;stringstrType,if(!ReadKeyValue(pwallet,ssKey,ssValue,fAnyUnordered,strType,strErr)){if(IsKeyType(strType))result={}}
fNoncriticalErrors=true;if(strType=="tx")SoftSetBoolArg("-rescan",ifprintf("%s\n",}pcursor-}catch{result=}BOOST_FOREACH(uint256hash,vWalletUpgrade)ifresult=returnresult;}及对特殊的pos部分进行专门的处理。….CWalletDB.LoadWallet(this)下的ReadKeyValue(CWallet*pwallet,CDataStream&ssKey,CDataStream&int&nFileVersion,vector<uint256>&vWalletUpgrade,bool&fIsEncrypted,bool&fAnyUnordered,string&strType,string&ssKey>>if(strType=={}elseif(strType=={}
elseif(strType=={}elseif(strType=="key"||strType=={elseif(strType=={elseif(strType=={elseif(strType=={ssValue>>pwallet-}elseif(strType=={int64nIndex;ssKey>>nIndex;pwallet-}elseif(strType=={ssValue>>nFileVersion;if(nFileVersion==10300)nFileVersion=}elseif(strType=={uint160hash;ssKey>>hash;CScriptscript;ssValue>>script;if(!pwallet-{}}
strErr="Errorreadingwalletdatabase:LoadCScriptreturnfalse;elseif(strType=={ssValue>>pwallet-}….CWalletDB.LoadWallet(this)下的ReorderTransactions的原型为DBErrors{for(map<uint256,CWalletTx>::itoritpwallet->mapWallet.begin();it!=pwallet->mapWallet.end();{CWalletTx*wtx=&((*it).second);}ListAccountCreditDebit("",int64&nOrderPosNext=pwallet->nOrderPosNext;nOrderPosNext=0;std::vector<int64>for torit=txByTime.begin();it!={CWalletTx*constpwtx=(*it).second.first;CAccountingEntry*constpacentry=(*it).second.second;int64&nOrderPos=(pwtx!=0)?pwtx->nOrderPos:pacentry-if(nOrderPos==-{nOrderPos=nOrderPosNext++;if//Havetowriteaccountingregardless,sincewedon'tkeepitinmemoryif(!WriteAccountingEntry(pacentry-}{
returnint64nOrderPosOff=BOOST_FOREACH(constint64&nOffsetStart,{if(nOrderPos>=}nOrderPos+=nOrderPosNext=std::max(nOrderPosNext,nOrderPos+//Sincewe'rechangingtheorder,writeitbackif(pwtx){if(!WriteTx(pwtx->GetHash(),*pwtx))returnDB_LOAD_FAIL;}}}
returnDB_LOAD_FAIL;return}..LoadWallet(){while{if(nLastFlushed!=nWalletDBUpdated&&GetTime()-nLastWalletUpdate>=2){if(lockDb){//Don'tdothisifanydatabasesareinuseintnRefCount=0;map<string,int>::itormi=while(mi!={nRefCount+=(*mi).second;}if(nRefCount==0&&{map<string,int>::itormi=if(mi!={printf("Flushingwallet.dat\n");nLastFlushed=nWalletDBUpdated;int64nStart=GetTimeMillis();//Flushwallet.datsoit'sselfcontainedprintf("Flushedwallet.dat%"PRI64d"ms\n",GetTimeMillis()-}}}}}}Step8RandAddSeedPerfmonvoidRandAddSeedPerfmon(){}void{//SeedwithCPUperformancecounterint64nCounter=GetPerformanceCounter();RAND_add(&nCounter,sizeof(nCounter),memset(&nCounter,0,}Step8GetKeyFromPoolGetKeyFromPoolboolCWallet::GetKeyFromPool(CPubKey&result,boolfAllowReuse){int64nIndex=0;CKeyPool{if(nIndex==-{if(fAllowReuse&&{result=vchDefaultKey;returntrue;}if(IsLocked())returnfalse;result=GenerateNewKey();returntrue;}result=}return}keykeyStep8ScanForWalletTransactionsScanForWalletTransactions()的原型为intCWallet::ScanForWalletTransactions(CBlockIndex*pindexStart,bool{intret=CBlockIndex*pindex={while(pindex){CBlockblock;BOOST_FOREACH(CTransaction&tx,{if(AddToWalletIfInvolvingMe(tx,&block,fUpdate))}pindex=pindex-}}return}息放到钱包文件当中。涉及到的具体的两个函数,ReadFromDisk和Step8析和处理,第二种是没有钱包的情况下,我们从key池里面新key来建立钱钱包文件究竟是什么为什么钱包丢了,币就找不回钱包软件的文件名一般为wallet.dat。window用户一般在我的文档里面,而且是一个隐藏,因此一般的用户很头疼这个东西,往往是丢了还不知个币就的丢失了,因为用不了。钱包文件里面究竟都有什么内密钥的每一笔信息。钱包文件与文件之间的关系钱包文件里面的信息从里面整理出来。你可以理解有这么一个过滤或者其他操作的时候就不用频繁的对进行操作了。如何从编程的角度去看钱包文件及其源第九节客户端的启动源码分析(AppInit2的 第十节客户端的启动源码分析(AppInit2的里面了用于连接节点数据。在有的数字加密货币里面,用的是addr.dat。“adb.Read(addrman)”。我们进去接着查。try
{filein.read((char*)&vchData[0],dataSize);filein>>hashIn;}unsignedcharpsgTmp[4];try{//de-serializefileheader(pessageStartmagicnumber)andssPeers>>FLATDATA(psgTmp);//verifythenetworkmatchesif(memcmp(psgTmp,pessageStart,sizeof(psgTmp)))returnerror("CAddrman::Read():invalidnetwork//de-serializeaddressdataintooneCAddrManobjectssPeers>>addr;}
return} Step11启动节if(!CheckDiskSpace())returnfalse;if(!NewThread(StartNode,NULL))InitError(_("Error:couldnotstartifNewThread(ThreadRPCServer,Step12收这个函数是通过更新钱包。{CTxDBtxdb("r");boolfRepeat=true;while(fRepeat)//只要没有解析完就继续更{fRepeat=vector<CDiskTxPos>vMissingTx;BOOST_FOREACH(PAIRTYPE(constuint256,CWalletTx)&item,{}}}第十二节客户端的启动源码分析(总结与意义未完启动源码的分析是进行开发的基启动源码的分析是进行内核级移植的第六章朵朵学院体验币的源码解析(startnode部分我在这里再次强调一下,本不是《朵朵学院开发初3.0版》那种手把你做的easy,本质上属于我在进行朵也不会写的那面俱到,否则内容过于庞大,非把我累死不可。能学到什么程度完全看个人的悟性。有什么疑问可以发给我,但本章节主要讲授朵朵学院体验币的第三个部分,startnode部分好了,我们继续做总结,followingsrc64个文件。那么问题出来了,我们应该如何且讲的启动的12个步骤。其中我们发现,在第11个步骤当中,启动了两个线程,StartNodeThreadRPCServerStartNode是主网络线程,主要的功能几乎都是在这里进行实现;而ThreadRPCServer主要是进行socket通讯用的,可以理解为做api接使StartNode部分当中,因此我们重点是讲StartNode部分。startnode太过于复杂,因此本章主要说一个大致的框架,startnodevoidStartNode(void*{//Makethisthreadrecognisableasthestartupthread//Start//GetaddressesfromIRCandadvertiseoursif(!NewThread(ThreadIRCSeed,NULL))printf("Error:NewThread(ThreadIRCSeed)//Sendandreceivefromsockets,acceptconnectionsif(!NewThread(ThreadSocketHandler,NULL))printf("Error:NewThread(ThreadSocketHandler)//Initiateoutboundconnectionsfrom-if(!NewThread(ThreadOpenAddedConnections,NULL))//Initiateoutboundif(!NewThread(ThreadOpenConnections,printf("Error:NewThread(ThreadOpenConnections)//Processif(!NewThread(ThreadMessageHandler,printf("Error:NewThread(ThreadMessageHandler)//Dumpnetworkif(!NewThread(ThreadDumpAddress,printf("Error;NewThread(ThreadDumpAddress)//ppcoin:mintproof-of-stakeblocksinthebackgroundif(!NewThread(ThreadStakeMinter,pwalletMain))printf("Error:NewThread(ThreadStakeMinter)//ppcpos出块模式。顺便说一下,我竟然看到有所谓的专家说pos是发明的,想一大巴掌糊死他。Pos模式是点点币社区的sk在2012年8月实现的那个时候这个所谓的专家还不知道在哪//Generatecoinsintherg("-gen",false),}分,后面的两个,ThreadStakeMinterGenerateBitcoin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论