




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本歸朵朵學(xué)院及大慶萬朵物聯(lián)網(wǎng)科技所有,任何單位和個 2017511我在這里再次強調(diào)一下,本所要求的基礎(chǔ)知識真的非常少,真的不適合做開發(fā)。真學(xué)習(xí);要不就換一個更基礎(chǔ)的看了,本真不適合你。做具體的講解,這種我基本上都是拉黑,因為本為免費教 有問題可以發(fā)給我: 基本就這三種方式。Qq群我已經(jīng)了,說什么我都看不到,qq一 前篇四關(guān)于基于qt4的gui圖形界面的指 前篇五本書的整體思 第一節(jié)前 第二節(jié)的技術(shù)分 第四節(jié)國內(nèi)幣圈的 第六節(jié)總 部分 第二節(jié)客戶端(錢包)一般性解 第二節(jié) 第三節(jié)set_vars.bat的解 第四節(jié)4a_build_daemon.bat的解 第五節(jié)4a_build_daemon.bat的解 第六節(jié)小 組 尋找源碼.................................................................................................................intmain(intargc,char* 第四節(jié)客戶端的啟動源碼分析(AppInit2的step1到 Step2與 Step1到6的簡單總 第五節(jié)客戶端的啟動源碼分析(AppInit2的 Step7概 Step7下的 Step7下的 Step7的總 第六節(jié)從做幣到專家其實只有二步之 第七節(jié)客戶端的啟動源碼分析(AppInit2的 Step8概 Step8下的RandAddSeedPerfmon Step8的總 第九節(jié)客戶端的啟動源碼分析(AppInit2的 第十節(jié)客戶端的啟動源碼分析(AppInit2的 Step11啟動節(jié) Step12收 第一節(jié)承上與啟 第二節(jié)startnode概 第四節(jié)ThreadStakeMinter概 第七節(jié)總 前言我們要學(xué)什 第一節(jié)什么是版本追 第二節(jié)什么是參數(shù)剝離 第一節(jié)比特幣的版本歷 第三節(jié)本章怎么 第一節(jié)朵朵學(xué)院體驗幣與幣的關(guān) ( 2015年底,為了打破開發(fā)的神秘感,于是發(fā)布了《朵朵學(xué)院虛擬3.0版》的大環(huán)境是因為無意義的克隆幣在國內(nèi)實在太多了,炒幣和交毀了整個的開發(fā)環(huán)境。當(dāng)時的就是“從朵朵學(xué)院做起——成也朵朵,量的50%以上。是——毀也朵朵。 行為在變的愈演愈烈,那就是ICO——基于代幣的眾籌行為。最典型的例子莫過于2016年基于的theDAO。我們很難想象,一個號稱眾籌十多億ico初創(chuàng)項目,竟然連一個眾籌代碼都寫不好。別的公司20104100ICO項目,我更是懶得提了。這么說吧,即便是國家級的其實,ICO在早期就是一個人或者一個團隊,在社區(qū)籌點錢做一個項目,比也就那么回事。但現(xiàn)在的ICO已經(jīng)完全變味了,動輒就是幾千萬幾億,而且沒有因此本著繼續(xù)遵循“成也朵朵,毀也朵朵”的基本原則,即2015年公開虛學(xué)到的知識到自行相關(guān)ICO的源代碼,自行評估好了。我估計到時候90%的人都會感慨“了,就這么個玩意也敢籌那么多錢”本主要分為三大部分閱讀源碼的過程中搜集了過去大量的資料,發(fā)現(xiàn)最大的問題就是不夠系朵朵學(xué)院的是,目的是告訴大家如何進行內(nèi)核級移植,所以在基于的通基于的信息基于的智能合基于的內(nèi)嵌系基于的特殊共識實現(xiàn)(比如鏈擬幣的相關(guān)代碼,移植到自己的代碼當(dāng)中,并且正常運行。 完全不一樣。這個我之所以命名為《蘑菇隨筆》,而不是《XXX開發(fā) ICO項目就2015c語言都沒學(xué)你是否還停留在群里問問題的階段,而不是通過或者進行詢問?如何也是這樣的話,你將停留著一個初學(xué)者階段。次之后肯定拉。盡管本主要是講述底層源碼解析的,但鑒于很多學(xué)員苦于對圖形可以去當(dāng)當(dāng)網(wǎng),關(guān)于qt4編程的書都可以,淘寶也有大量的可以購源碼里面直接漢化。上面有大量相關(guān)的。主要是告訴大家最終會拆分為三部分源碼,btc,ppc和novacoin。幣三個目前主要的數(shù)字加密貨幣在近一年內(nèi)上的新幣或者基于數(shù)字加密貨幣做的ICO進行整體的技術(shù)評估,看看是否有值得借鑒才,從2015年1月開始進行相關(guān)的開發(fā),由于是,屬于第二職業(yè),因此整4個小時技術(shù),7003000100200就寫文章人。N結(jié)果我拿到他們的可行性分析報告,竟然發(fā)現(xiàn)里面50%以上的技術(shù)數(shù)據(jù)都是錯的,我問他們這些數(shù)據(jù)哪里來的,他們說網(wǎng)上搜的,然后還把給我了。他們在立項的時候就明確的要求從底層協(xié)議解決,等于自己把自己堵死然而他們的一句回復(fù)讓我更哭笑不得“bitcoincore是誰?”我瞬間。所以我打算寫一下的技術(shù)種類與發(fā)展歷史,以示正聽。第二節(jié)的技術(shù)分請批評指正。有的可以自行檢索。:代表:Bitcoin(首創(chuàng),2010年正式發(fā)布代表:litecoin(非首創(chuàng),但最通用,2012年正式發(fā)布)代表:Peercoin(點點幣社區(qū)首創(chuàng),2012年正式發(fā)布)代表:nxt(2013年首創(chuàng))鏈:目前熱門的熱點之代表:比特股(2013年首創(chuàng),人制度,當(dāng)時引起巨大爭議代表1:peershares(點點幣社區(qū)首創(chuàng),2013年正式發(fā)布),nxt(2013,nu資產(chǎn)(2014,部分實現(xiàn)) 代表:阿儂幣(2012年首創(chuàng)并正式運行代表1:代表2:代表3:(2015年才發(fā)布第一個無法運行的測試版本)代表4:萬事達幣(2013年以側(cè)鏈的概念進行首創(chuàng),但好像沒做成,說原因老婆不讓他從事這方面職業(yè)幣(2012年首創(chuàng)并正式運行)微幣(2014年正式運行IBMadept項目(2014年商業(yè)化運行,2016年部分開源Linux的超級賬本(2016年開始正式運行寫這么一節(jié),就是告訴剛開始進行400個小時都不夠的所謂磚家寫的文章給了,開發(fā)領(lǐng)域非常龐大,除了那個天天在幣圈做的xx坊外,還有很多相關(guān)技術(shù)。而所謂的智能合約,其實只是第三節(jié)編程語言的討論與選目前的編程語言的主流是C\C++,圖形界面的開發(fā)則是qt4和qt5.例下的99%以上的數(shù)字加密貨幣都是基于C\C++開發(fā)的。可大量的初學(xué)者并不懂得這個道理,尤其是各個高校,看火就用做項目,結(jié)果發(fā)現(xiàn),不但的資料非常的少,連go語言的資料也本是基于bitcon和其相關(guān)延伸代碼進行講解的,因此也主要是基第四節(jié)國內(nèi)幣圈的是在乎自己拋出去。國內(nèi)幣圈史句話說,國內(nèi)幣圈的史,同時也是幣圈小白的血淚史。2013201320152014年是期,新的唯一的一個亮點是。國內(nèi)發(fā)展則萎靡不振2015年之后國外的幣重點則是炒,一直到去年和今年 其實我們經(jīng)常能看到這么一個現(xiàn)象,就是第一個吃螃蟹的人往往沒有賺到我寫的這個不是告訴大家怎么去做創(chuàng)新,去寫,或者弄個發(fā)明專利朵朵學(xué)院初級3.0版:用qq直接登錄即可,免。 適合做開發(fā)。真學(xué)習(xí);要不就換一個看了,本真不適合你。 部分3.0版》那種手把你做的easy,本質(zhì)上屬于我在進行朵也不會寫的那面俱到,否則內(nèi)容過于龐大,非把我累死不可。能學(xué)到什么程度完全看個人的悟性。有什么疑問可以發(fā)給我,但到過太多朵朵學(xué)院的學(xué)員因為小利而與傳銷組織或者炒幣 C:\xueyuancoin\contrib\easywinbuilder4a_build_daemon.bat,出們的qt4編譯環(huán)境也成功了。C:\文件,雙擊打開,如果出現(xiàn)如下界面,說明你的qt安裝也成功了。關(guān)于c++學(xué)習(xí):推薦的為《C++Primerplus中文版另外譚浩強教授寫的關(guān)于C語言和C++的兩本書也是我所推薦的,盡管很多人 數(shù)據(jù)結(jié)構(gòu),不但會而且要非常熟悉才行,否則學(xué)起來也是重重。第二節(jié)客戶端(錢包)一般性解客戶端的,這是一個基本的網(wǎng)絡(luò)開發(fā)原則。但與bt則有一些相似,這里沒有服務(wù)端,而只有客戶端,我們稱之為數(shù)字加密貨幣錢包,簡稱錢包。錢包啟動的時候會連接內(nèi)置的ip地址,我們一般稱之為節(jié)點,然后 ,我們稱之為數(shù)據(jù)同步;并且與IRC的廣播頻道當(dāng)中,與的錢包通訊。錢包分兩種,一種是命令行模式,一種是gui模式,但從底層角度來接收與功能,同時提供api接口,供外部程序調(diào)用。wallet部分是這個錢包里面的幣數(shù),其中余額表示這個錢包里面有多少幣。Stake表示的是出塊的幣數(shù)。未確認表示的是收到了幣,但卻沒有進行出塊生,這就是為什么我在初級和本中反復(fù)提到,如果連一個都沒做過,或者僅僅只是做了,而根本不熟練,那你很難成為一個開發(fā)人員,因跑幾個月,這樣對你進行開發(fā),有極大的好處。于挖礦。這個是pos出塊特有的指令,主要是用于pos模式下的錢包出塊。gui客戶端的大概組成。盡管現(xiàn)在的各種“錢包”長的千差萬別對于經(jīng)?;燠E在幣圈里面的學(xué)員可能覺得這一節(jié)簡單到了無聊,但的遇 第一個buildgui界面編譯過程中的一些中間文件,如果這個第二個contrib存放是一些編譯用的小工具,我們一鍵編譯用的那兩個快easywinbuilder里面。當(dāng)然我們要特別說明一下,這個easywinbuilder并不是所有源碼里面都有,而是有人專門做的,在第四Doc是一個很關(guān)鍵但會被大多數(shù)人忽略的,這個里面主要存放是這Src里面是所有的錢包源碼文件,在第五節(jié)進行進一步的解析。除了這些pro(編譯部第一節(jié)easywinbuilder contrib存放是一些編譯用的小工具,我們一鍵編譯用的那兩個快捷方式就是在這個文件夾的easywinbuilder里面。第二節(jié) 4bshsetvars.bat。當(dāng)然還有一個文件是最容易忽略但最建議看的,就是readme.md。(c)2013phelix -MIT all_easywinbuilder.batormanuallystartthebatchfilesinorder.BuildingBitcoinonWindowsreallyisapain.Hopefullythissavespeoplesome//這里大概說的是這個可以自動編譯比特幣,幣和其他競爭幣EasyWinBuildercanrunonamintwindowssystem(e.g.avirtualmachine)ornormalsystem.ItmightoverwriteyourMinGWorQtinstallation,though.Pleasenotetheprocesstakesabouthalfanhourormoreandwillneedabout3GBofharddrivespace.InthisrepositorytherearenochangestotheBitcoincodeitselfthoughtheprocessmakesahandfulofsmallchanges.Thismeansitshouldbepossibletoplug'n'ytheeasywinbuilderdirectoryintosimilarBitcoinversions.Tochangedirectoriesanddependencyversionsedit Moreinfohere:首先,這個是基于bitcon在2013年的版本進行的自動編譯,可以編譯比特幣的早期版本和幣的早期版本,或者是類似的修改參數(shù)比較少的其他競爭其次,這個的版本號為0.5,這就意味著我們找到那個帖子的原出處后,可特別說明的是,需要服務(wù)器才能上,也就是需要買一個 至于怎么買,自己去。容是什么,然后關(guān)注一下4a4b兩個bat,最后,去set_vars.bat@setLANG=en_US.UTF8@setOPENSSL=openssl-1.0.1g@setBOOST=boost_1_55_0@remIfyouwonderwhythereisno-s- @setBOOSTSUFFIX=-mgw48-mt-1_55 @setROOTPATH=..\..@set//設(shè)置編譯路@for/F%%ain('dir/b%ROOTPATH%\*.pro')do@setCOINNAME=%%a@setCOINNAME=%COINNAME:-=%@setQTDIR=C:\Qt\4.8.5@remQt5willneedchangesin@setPERL=%MSYS%/perl.exe@remthefollowingwillbesetasadditionalCXXFLAGSandCFLAGSforeverything-no'or",spaceisok-Wno-unused-variable-Wno-unused-value @remNote:VariablessetherecanNOTbeoverwritteninmakefiles命令調(diào)用。那我們接著看看4a和4b兩個批命令是怎么調(diào)用的。@call@bash@echoBuildingKaixinCoindaemon...@remtodo:rewritethiswith^linewrap@setPARAMS=%PARAMS%INCLUDEPATHS="@setPARAMS=%PARAMS%-I'../%EWBLIBS%/%MINIUP%'@set@setPARAMS=%PARAMS%-L'../%EWBLIBS%/%OPENSSL%'@setPARAMS=%PARAMS%-L'../%EWBLIBS%/%MINIUP%'@set @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首先是調(diào)用set_vars.bat設(shè)置基本環(huán)境我們接下來看看4b@call@ifnot"%WAITQT%"=="1"gotocontinue@echoEnsureQtinstallerhasfinished.@bash@cd@echobuildingqt-@set@echoQMPS%@echobuildingqt-make...@iferrorlevel1goto in./release@cd@ifnot"%RUNALL%"=="1"進行編譯的,因此就先講了,而且Easywinbuilder的源代碼也比較簡單,方便學(xué)員入手。站去看看版本的源碼。(啟動部第一節(jié)src下面的這一節(jié)課我們簡單講一下源碼的組成,也就是,源碼究竟大概都有哪些的內(nèi)容一掠而過。Json、test,obj-test不提。首先是obj文件夾,這個是用來預(yù)編譯的臨時文件用的,里面的內(nèi)容可6464個文件,你就是專家了。Ok,看起來就是這么簡單 然后知道了內(nèi)核源碼都是在src文件夾一級 下面,總共是64個文件。第三節(jié)客戶端的啟動源碼分析(準備階段 沒有出現(xiàn)這 advancedfindmain(。為什么要輸入這個函數(shù)?main(main后面會跟著一個括!QT_GUIQT_GUI注釋掉了,就可以正常顯示了?Ok,我們把這個刪除了看一init.cpp176行,發(fā)現(xiàn)灰色已經(jīng)變成白色了。說明我們的intmain(intargc,char*intmain(intargc,char*{boolfRet=//ConnectbitcoindsignalhandlersfRet=AppInit(argc,if(fRet&&fDaemon)return0;return}口函數(shù)AppInit。//#if果進行g(shù)ui編譯,則從另一個函數(shù)執(zhí)行。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;}個就是引入新的函數(shù)AppInit2。其余的部分由于修改的很少,自行學(xué)習(xí)即 第四節(jié)客戶端的啟動源碼分析(AppInit2的step1到/**Initialize @preParametersshouldbeparsedandconfigfileshouldbebool{…}307879Step23ParseParameters(argcargv)進行預(yù)處理 進行鎖定,防止在使用的過程中產(chǎn)生//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 printf("Defaultdatadirectory%s\n",GetDefauataDir().string().c_str());//缺省printf("Useddatadirectorys\nstrDataDir.c_str());//使用的數(shù)據(jù)std::ostringstreamstrErrors;if(filesystem::exists(GetDataDir()/{ }db.cpp里面,所以我們得到一個結(jié)論——db.hdb.cpp的功能之一是處理錢包 (*recoverFunc)(CDBEnv&dbenv,std::stringstrFile)){Dbdb(&dbenv,intresult=db.verify(strFile.c_str(),NULL,NULL,//berkeleyDB->verify()函數(shù)對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{if(!Checkpoints::SetCheckpointPrivKey(GetArg("-checkpointkey","")))InitError(_("Unabletosigncheckpoint,wrong}BOOST_FOREACH(stringstrDest,mapMultiArgs["-seednode"])這個是輸入節(jié)點的Step4是做一些應(yīng)用初始化的;Step5是用來檢測錢包完整性的;Step6是用來做網(wǎng)絡(luò)初始化的。第五節(jié)客戶端的啟動源碼分析(AppInit2的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*>::itormi=mapBlockIndex.begin();mi!=mapBlockIndex.end();{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}bitdb.Open(GetDataDir())的原型為bool我們從函數(shù)進行發(fā)現(xiàn)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,bool{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*)&{CBlockIndex*pindex=item.second;pindex->bnChainTrust=(pindex->pprev?pindex->pprev->bnChainTrust:0)+pindex-//ppcoin:calculatestakemodifierchecksumpindex->nStakeModifierChecksum=returnerror("CTxDB::LoadBlockIndex():Failedstake}//應(yīng)該是 校//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應(yīng)該是在最佳里面確認塊身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}LoadBlockIndexboolLoadBlockIndex(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和之前的不一樣,是一個非常具體的功能,就是載入。一個是bitdb.Open(GetDataDir(),做 LoadBlockIndex(boolfAllowNew)函數(shù),用于的。其中用的是第六節(jié)從做幣到專家其實只有二步之 if{if(!fAllowNew)returnfalse;//Genesisconstchar*pszTimestamp="Ari20,2014,PutinSignsTreatyToAddCrimeaToMap.";第一個意思是,如果你之前不會做幣,也對的源碼就完全沒有概念,第二個意思是,其實所謂的專家,在我看來就是對整個的運作家,而且比那些連400小時可能都不夠的專家強多了。第七節(jié)客戶端的啟動源碼分析(AppInit2的nStart=GetTimeMillis();boolfFirstRun=true;pwalletMain=newDBErrorsnLoadWalletRet=pwalletMain-if{//CreatenewkeyUserandsetasdefaultkeyCPubKeynewDefaultKey;if(!pwalletMain->GetKeyFromPool(newDefaultKey,false))strErrors<<_("Cannotinitializekeypool")<<//得到新key,函數(shù)為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} 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部分進行專門的處理。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-}ReorderTransactions的原型為DBErrors{for(map<uint256, toritpwallet->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}{while{if(nLastFlushed!=nWalletDBUpdated&&GetTime()-nLastWalletUpdate>=2){if(lockDb){//Don'tdothisifanydatabasesareinuseintnRefCount=0;map<string,int>::i tormi=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()-}}}}}}voidRandAddSeedPerfmon(){}void{//SeedwithCPUperformancecounterint64nCounter=GetPerformanceCounter();RAND_add(&nCounter,sizeof(nCounter),memset(&nCounter,0,}GetKeyFromPoolboolCWallet::GetKeyFromPool(CPubKey&result,boolfAllowReuse){int64nIndex=0;CKeyPool{if(nIndex==-{if(fAllowReuse&&{result=vchDefaultKey;returntrue;}if(IsLocked())returnfalse;result=GenerateNewKey();returntrue;}result=}return}幾個關(guān)鍵函數(shù),ReserveKeyFromKeyPool,IsLocked,GenerateNewKey,KeepKey,歡迎ScanForWalletTransactions()的原型為intCWallet::ScanForWalletTransactions(CBlockIndex*pindexStart,bool{intret=CBlockIndex*pindex={while(pindex){CBlockblock;BOOST_FOREACH(CTransaction&tx,{if(AddToWalletIfInvolvingMe(tx,&block,fUpdate))}pindex=pindex-}}return}息放到錢包文件當(dāng)中。涉及到的具體的兩個函數(shù),ReadFromDisk和Step8錢包軟件的文件名一般為wallet.dat。window用戶一般在我的文檔里 錢包文件里面的信息從里面整理出來。你可以理解有這么一個過濾或者其他操作的時候就不用頻繁的對進行操作了。第九節(jié)客戶端的啟動源碼分析(AppInit2的 第十節(jié)客戶端的啟動源碼分析(AppInit2的里面了用于連接節(jié)點數(shù)據(jù)。在有的數(shù)字加密貨幣里面,用的是addr.dat。 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} Step11if(!CheckDiskSpace())returnfalse;if(!NewThread(StartNode,NULL))InitError(_("Error:couldnotstartifNewThread(ThreadRPCServer,Step12 {CTxDBtxdb("r");boolfRepeat=true;while(fRepeat)//只要沒有解析完就繼續(xù)更{
fRepeat=vector<CDiskTxPos>vMissingTx;BOOST_FOREACH(PAIRTYPE(constuint256,CWalletTx)&item,{}}}第十二節(jié)客戶端的啟動源碼分析(總結(jié)與意義未完3.0版》那種手把你做的easy,本質(zhì)上屬于我在進行朵也不會寫的那面俱到,否則內(nèi)容過于龐大,非把我累死不可。能學(xué)到什么程度完全看個人的悟性。有什么疑問可以發(fā)給我,但好了,我們繼續(xù)做總結(jié),followingsrc64個文件。那么問題出來了,我們應(yīng)該如何且講的啟動的12個步驟。其中我們發(fā)現(xiàn),在第11個步驟當(dāng)中,啟動了兩個線程,StartNodeStartNode是主網(wǎng)絡(luò)線程,主要的功能幾乎都是在這里進行實現(xiàn);而ThreadRPCServer主要是進行socket通訊用的,可以理解為做api接使StartNode部分當(dāng)中,因此我們重點是講StartNode部分。startnode太過于復(fù)雜,因此本章主要說一個大致的框架,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)//Generatecoinsintherg("-gen",false),}分,后面的兩個,ThreadStakeMinter和GenerateBitcoins則為主要運第三節(jié)GenerateBitcoinsfGenerate,CWallet*{fGenerateBitcoins=fGenerate;nLimitProcessors=GetArg("-genproclimit",-1);if(nLimitProcessors==0)fGenerateBitcoins=false;fLimitProcessors=(nLimitProcessors!=-1);if{intnProcessors=boost::thread::hardware_concurrency();printf("%dprocessors\n",nProcessors);if(nProcessors<1)nProcessors=if(fLimitProcessors&&nProcessors>nLimitProcessors)nProcessors=nLimitProcessors;printf("Starting%dBitcoinMinerthreads\n",nAddThreads);for(inti=0;i<nAddThreads;i++){}
if(!NewThread(ThreadBitcoinMiner,pwallet))}} (!NewThread(ThreadBitcoinMiner,pwallet)){CWallet*pwallet=
voidstatic{}
BitcoinMiner(pwallet,false);catch(std::exception&{vnThreadsRunning[THREAD_MINER]--;}catch{-PrintException(NULL,}nHPSTimerStart=if(vnThreadsRunning[THREAD_MINER]==0)dHashesPerSec=0;rexiting,%dthreads}BitcoinMiner(pwallet,false);BitcoinMiner函數(shù)當(dāng)中。至于為什么會與同函數(shù)的ThreadStakeMinter最后同一個函數(shù)而產(chǎn)生重復(fù),是因為當(dāng)初點點幣社區(qū)的sk在做pos出塊模式的時候,把pos部分也放在了BitcoinMiner函數(shù)當(dāng)中。但由于startnodeGenerateBitcoins不是必須運行的參數(shù),因voidstaticThreadStakeMinter(void*{
//ppcoin:stakeminterCWallet*pwallet=(CWallet*)parg;{BitcoinMiner(pwallet,true);}catch(std::exception&{vnThreadsRunning[THREAD_MINTER]--;}catch{-PrintException(NULL,}exiting,%dthreads}//ppcoin:stakeminter朵學(xué)院體驗幣的代碼是基于ppc完成的。BitcoinMiner(pwallet,true);下一節(jié)開始,我們就對這個函數(shù)進行描述。第五節(jié)BitcoinMinervoid*pwallet,bool{void*scratchbuf= printf("CPUMinerstartedforproof-of-%s\n",fProofOfStake?"stake"://Makethisthreadrecognisableastheminingthread//EachthreadhasitsownkeyandcounterCReserveKeyreservekey(pwallet);unsignedintnExtraNonce=while(fGenerateBitcoins||fGenerateBitcoins和fProofOfStake有一個為真,則整體為真。而pow模式當(dāng)中,如果fGenerateBitcoins參數(shù)被指定為真,也會運行。{//Createnewif{if(pblock->IsProofOfStake()){if(!pblock-{strMintWarning=}strMintWarning=printf("CPUMiner:proof-of-stakeblockfound%s\n",CheckWork(pblock.get(),*pwalletMain,reservekey);}}printf("RunningBitcoinMinerwith%"PRIszu"transactions//{unsig
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人力資源咨詢顧問合同書
- 產(chǎn)品售后服務(wù)情況說明表
- 制造業(yè)企業(yè)知識產(chǎn)權(quán)保護策略研究
- 光纜遷移施工方案范本
- 橡膠跑道施工方案
- 涼山道路施工方案
- TCSMT YB011-2024 天然氣發(fā)熱量測量裝置測試技術(shù)規(guī)范
- 建筑工程人工費承包合同-@-1
- 物業(yè)地面處理方案
- 透水砼路面施工方案
- 精細化工工藝學(xué)-第1章緒論講解課件
- 仰拱棧橋計算
- 中醫(yī)婦科 月經(jīng)過多課件
- 2022年江西制造職業(yè)技術(shù)學(xué)院單招語文試題及答案解析
- 穆斯林太巴熱咳慶念詞文
- 商標(biāo)一級授權(quán)書模板
- 軟硬結(jié)合板的設(shè)計制作與品質(zhì)要求課件
- 民營醫(yī)院組織架構(gòu)圖示
- 慢性心功能不全護理查房
- 初中 初二 物理 凸透鏡成像規(guī)律實驗(習(xí)題課) 教學(xué)設(shè)計
- 消防維保方案 (詳細完整版)
評論
0/150
提交評論