




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
源碼解析與內(nèi)核級(jí)移植(蘑菇隨筆 的情況下,不得已以相關(guān)的內(nèi)容,違者。2017511特別說(shuō)我在這里再次強(qiáng)調(diào)一下,本所要求的基礎(chǔ)知識(shí)真的非常少,就是cc++真的不適合做開(kāi)發(fā)。真學(xué)習(xí);要不就換一個(gè)更基礎(chǔ)的了,本真不適合你。發(fā),望能對(duì)某分做具體的講解,這種我基本上都是拉黑,因?yàn)楸緸槊赓M(fèi)教材,學(xué)有力的學(xué)自行學(xué)習(xí)然我歡迎學(xué)基于某部進(jìn)本發(fā)布的地方,以及在哪里可以找到我本主要在三個(gè)地方發(fā)布B:朵朵學(xué)院專群 。這里更新比較頻繁,錯(cuò)誤比較多,但錯(cuò)誤比至于在哪里找到有問(wèn)題可以發(fā)給我: 搜淘寶:朵朵系統(tǒng)。我也經(jīng)常,不過(guò)也不做保姆式講解。,在相關(guān)文章的技術(shù)貼回復(fù)即可基本就這三種方式。我已經(jīng)了,說(shuō)什么我都看不到,一 前篇四關(guān)于基于qt4的gui圖形界面的入門(mén)指 第一節(jié)前 第二節(jié)的技術(shù)分 第四節(jié)國(guó)內(nèi)幣圈的虛擬幣 第六節(jié)總 第二節(jié)客戶端(錢(qián)包)一般性解 小 組 尋找源碼.................................................................................................................intmain(intargc,char* 第八節(jié)客戶端的啟動(dòng)源碼分析(AppInit2的step1到 Step2與 Step1到6的簡(jiǎn)單總 第九節(jié)客戶端的啟動(dòng)源碼分析(AppInit2的 Step7概 Step7下的 Step7下的 Step7的總 第十一節(jié)客戶端的啟動(dòng)源碼分析(AppInit2的 Step8概 Step8下的RandAddSeedPerfmon Step8的總 第十三節(jié)客戶端的啟動(dòng)源碼分析(AppInit2的 第十四節(jié)客戶端的啟動(dòng)源碼分析(AppInit2的 Step11啟動(dòng)節(jié) Step12收 第四章下一步的講解規(guī) 前篇一我寫(xiě)這個(gè)的目的——愈演愈烈的ICO鬧2015年底,為了打破虛擬幣開(kāi)發(fā)的神秘感,于是發(fā)布了《虛擬幣入門(mén)教享,那就了。我記得當(dāng)時(shí)寫(xiě)《虛擬幣入門(mén)》的大環(huán)境是因?yàn)闊o(wú)意義的克朵朵學(xué)院學(xué)員在巴比特做的幣超過(guò)總量的50%以上。 行為在變的愈演愈烈,那就是ICO——基于代幣的眾籌行為。2016theDAO。我們很難想象,一個(gè)號(hào)稱眾籌十多億ico初創(chuàng)項(xiàng)目,竟然連一個(gè)眾籌代碼都寫(xiě)不好。別的公司20104100ICO項(xiàng)目,我更是懶得提了。這么說(shuō)吧,即便是國(guó)家級(jí)的其實(shí),ICO在早期就是一個(gè)人或者一個(gè)團(tuán)隊(duì),在社區(qū)籌點(diǎn)錢(qián)做一個(gè)項(xiàng)目,比也就那么回事。但現(xiàn)在的ICO已經(jīng)完全變味了,動(dòng)輒就是幾千萬(wàn)幾億,而且沒(méi)因此本著繼續(xù)遵循“成也朵朵,毀也朵朵”的基本原則,即2015年公開(kāi)虛學(xué)到的知識(shí)到自行相關(guān)ICO的源代碼,自行評(píng)估好了。我估計(jì)到時(shí)候90%的人都會(huì)感慨“了,就這么個(gè)玩意也敢籌那么多錢(qián)”前篇二你能從本學(xué)到些什本主要分為三大部分第一大部分是源碼的解閱讀源碼的過(guò)程中搜集了過(guò)去大量的資料,發(fā)現(xiàn)最大的問(wèn)題就是不夠系朵朵學(xué)院的是,目的是告訴大家如何進(jìn)行內(nèi)核級(jí)移植,所以在第二大部分是內(nèi)核的升第三大部分是內(nèi)核級(jí)功能移基于的通基于的信息基于的智能合基于的內(nèi)嵌系基于的特殊共識(shí)實(shí)現(xiàn)(比如鏈在這里特別說(shuō)明的是:這篇和上一篇《虛擬幣入門(mén)開(kāi)發(fā)》完全不一樣。這個(gè)我之所以命名為《蘑菇隨筆》,而不是《XXX開(kāi)發(fā)》,是因?yàn)槲页吮WC所有的內(nèi)容都是我一步步做出來(lái)外,真的無(wú)法保證你按步驟做肯定能ICO項(xiàng)目就前篇三不推薦有以下三個(gè)毛病的人學(xué)習(xí)2015c語(yǔ)言都沒(méi)學(xué)不了開(kāi)發(fā)。第一你是否還停留在群里問(wèn)問(wèn)題的階段,而不是通過(guò)或者進(jìn)行詢問(wèn)?如何也是這樣的話,你將停留著一個(gè)初學(xué)者階段。第二個(gè)毛?。翰痪邆涑绦騿T的基本修次之后肯定拉。第三個(gè)毛?。合M冶D返膶W(xué)前篇四關(guān)于基于qt4gui圖形界面的入門(mén)指盡管本主要是講述底層源碼解析的,但鑒于很多學(xué)員苦于對(duì)圖形需要什么樣的基需要什么書(shū)進(jìn)行學(xué)習(xí)可以去當(dāng)當(dāng)網(wǎng),關(guān)于qt4編程的書(shū)都可以,淘寶也有大量的可以購(gòu)應(yīng)該從哪里進(jìn)行入手研源碼里面直接漢化。上面有大量相關(guān)的。后期朵朵學(xué)院會(huì)不會(huì)出相關(guān)的開(kāi)發(fā)第一 的技術(shù)種類與發(fā)展歷怎么說(shuō)呢,其實(shí)就是現(xiàn)在冒充的人太多了。我記得有人,一萬(wàn)個(gè)小時(shí)學(xué)習(xí)與工作才有機(jī)會(huì)讓你成為一個(gè),而一萬(wàn)個(gè)小時(shí)是什么概念呢。本人不才,從2015年1月開(kāi)始進(jìn)行相關(guān)的開(kāi)發(fā),由于是,屬于第二職業(yè),因此整4個(gè)小時(shí)技術(shù),70030001002004個(gè)小1000個(gè)小4000個(gè)小時(shí)的在相關(guān)領(lǐng)域的就寫(xiě)文章人。我為什么敢這么說(shuō)呢,因?yàn)榻衲觊_(kāi)始,有很多大學(xué)生來(lái)淘寶咨詢項(xiàng)目,期間不乏985和211的大學(xué)。期間有一個(gè)讓我尤其深刻,那個(gè)項(xiàng)目組N結(jié)果我拿到他們的可行性分析報(bào)告,竟然發(fā)現(xiàn)里面50%以上的技術(shù)數(shù)據(jù)都是錯(cuò)的,我問(wèn)他們這些數(shù)據(jù)哪里來(lái)的,他們說(shuō)網(wǎng)上搜的,然后還把給我了。他們?cè)诹㈨?xiàng)的時(shí)候就明確的要求從底層協(xié)議解決,等于自己把自己堵死然而他們的一句回復(fù)讓我更哭笑不得“bitcoincore是誰(shuí)?”我瞬間。所以我打算寫(xiě)一下的技術(shù)種類與發(fā)展歷史,以示正聽(tīng)。第二節(jié)的技術(shù)分請(qǐng)批評(píng)指正。有的可以自行檢索。:代表:Bitcoin(首創(chuàng),2010年正式發(fā)布代表:litecoin(非首創(chuàng),但最通用,2012年正式發(fā)布)代表:Peercoin(點(diǎn)點(diǎn)幣社區(qū)首創(chuàng),2012年正式發(fā)布)代表:nxt(2013年首創(chuàng))鏈:目前熱門(mén)的熱點(diǎn)之代表:比特股(2013年首創(chuàng),人制度,當(dāng)時(shí)引起巨大爭(zhēng)議代表1:peershares(點(diǎn)點(diǎn)幣社區(qū)首創(chuàng),2013年正式發(fā)布),nxt(2013,nu資產(chǎn)(2014,部分實(shí)現(xiàn))代表1:代表2:代表3:代表4:萬(wàn)事達(dá)幣(2013年以側(cè)鏈的概念進(jìn)行首創(chuàng),但好像沒(méi)做成,說(shuō)原因老婆不讓他從事這方面職業(yè)幣(2012年首創(chuàng)并正式運(yùn)行)微幣(2014年正式運(yùn)行IBMadept項(xiàng)目(2014年商業(yè)化運(yùn)行,2016年部分開(kāi)源Linux的超級(jí)賬本(2016年開(kāi)始正式運(yùn)行寫(xiě)這么一節(jié),就是告訴剛開(kāi)始進(jìn)行400個(gè)小時(shí)都不夠的所謂磚家寫(xiě)的文章給了,開(kāi)發(fā)領(lǐng)域非常龐大,除了那個(gè)天天在幣圈做的xx坊外,還有很多相關(guān)技術(shù)。而所謂的智能合約,其實(shí)只是第三節(jié)編程語(yǔ)言的討論與選目前的編程語(yǔ)言的主流是C\C++,圖形界面的開(kāi)發(fā)則是qt4和qt5.例外的目前只有兩個(gè),一個(gè)是基于java的未來(lái)幣,以及基于go語(yǔ)言的以太坊。剩下的99%以上的數(shù)字加密貨幣都是基于C\C++開(kāi)發(fā)的。可大量的初學(xué)者并不懂得這個(gè)道理,尤其是各個(gè)高校,看以太坊火就go語(yǔ)言的資料也本是基于bitcon和其相關(guān)延伸代碼進(jìn)行講解的,因此也主要是基第四節(jié)國(guó)內(nèi)幣圈的虛擬幣正的莊持成本是以忽不計(jì)的他們?cè)诤鯍佒皇窃诤踝约簰伋鋈ァ?guó)內(nèi)幣圈史句話說(shuō),國(guó)內(nèi)幣圈的史,同時(shí)也是幣圈小白的血淚史。2013201320152014年是期,新的唯一的一個(gè)亮點(diǎn)是以太坊。國(guó)內(nèi)發(fā)展則萎靡不振 其實(shí)我們經(jīng)常能看到這么一個(gè)現(xiàn)象,就是第一個(gè)吃螃蟹的人往往沒(méi)有賺到我寫(xiě)的這個(gè)不是告訴大家怎么去做創(chuàng)新,去寫(xiě),或者弄個(gè)發(fā)明專利然很多學(xué)員會(huì)疑惑,為什么不講XXX啊?;蛘吣脕?lái)出來(lái)一些連400小時(shí)都不夠朵朵學(xué)院體驗(yàn)幣制作可以從兩個(gè)地到和代碼朵學(xué)初級(jí)3.0版: 直接登錄即可,免。請(qǐng)學(xué)會(huì)第一篇——初級(jí)幣的開(kāi)或者到淘寶寶貝 里面有專題2的免費(fèi)部分和涉及到的源碼。較,完成服務(wù)器建部分后者是,較簡(jiǎn)單而且內(nèi)我們從第三章開(kāi)始的底層源析是建立這個(gè)開(kāi)發(fā)環(huán)境當(dāng)中進(jìn)行講解的。在本節(jié)大家必須完成我在這里再次強(qiáng)調(diào)一下,本章所要求的內(nèi)容非常簡(jiǎn)單,要求學(xué)員盡獨(dú)立行完成如果這簡(jiǎn)單弄不明,那說(shuō)你真適合做開(kāi)發(fā)。真學(xué)習(xí);要不就換一個(gè)看了,本真不適合你。千萬(wàn)不要指望不花錢(qián)讓我教你,這個(gè)是免費(fèi)面向大眾的,我在這里再次強(qiáng)調(diào)一下,本不是《朵朵學(xué)院初級(jí)3.0版》全看個(gè)人的悟性。有什么疑問(wèn)可以發(fā)給我,但我無(wú)法保證一定順便再次強(qiáng)調(diào)一下,我強(qiáng)烈建議學(xué)員自己做一個(gè)基于數(shù)字加密貨幣——朵朵幣(DC2)一樣,這樣你不但會(huì)學(xué)到很多在里面永暗的內(nèi)容。到過(guò)太多朵朵學(xué)院的學(xué)員因?yàn)樾±c傳銷組織或者炒幣合作,最終上當(dāng)受騙,背著黑鍋,挨著罵,替著別人數(shù)錢(qián)。請(qǐng)借你的名 ,也找不到任何的機(jī)會(huì)C:\xueyuancoin\contrib\easywinbuilder里面4a_build_daemon.bat,出然后運(yùn)行C:\xueyuancoin\contrib\easywinbuilder里面的4b_build_qt.bat,這說(shuō)明我們的qt4編譯環(huán)境也成功了。C:\文件,雙擊打開(kāi),如果出現(xiàn)如下界面,說(shuō)明你的qt安裝也成功了。關(guān)于c++學(xué)習(xí):推薦的為《C++Primerplus中文版另外強(qiáng)教授寫(xiě)的關(guān)于C語(yǔ)言和C++的兩本書(shū)也是我所推薦的,盡管很多人 qt4,c,c++,數(shù)據(jù)結(jié)構(gòu),你不會(huì)而且也不打算學(xué)的話,抱歉,后面的內(nèi)容數(shù)據(jù)結(jié)構(gòu),不但會(huì)而且要非常熟悉才行,否則學(xué)起來(lái)也是重重。第二節(jié)客戶端(錢(qián)包)一般性解客戶端的,這是一個(gè)基本的網(wǎng)絡(luò)開(kāi)發(fā)原則。但與bt則有一些相似,這里沒(méi)有服務(wù)端,而只有客戶端,我們稱之為數(shù)字加密貨幣錢(qián)包,簡(jiǎn)稱錢(qián)包。錢(qián)包啟動(dòng)的時(shí)候會(huì)連接內(nèi)置的ip地址,我們一般稱之為節(jié)點(diǎn),然后 ,我們稱之為數(shù)據(jù)同步;并且與IRC的廣播頻道當(dāng)中,與的錢(qián)包通訊。錢(qián)包分兩種,一種是命令行模式,一種是gui模式,但從底層角度來(lái)接收與功能,同時(shí)提供api接口,供外部程序調(diào)用。我這里用的是我做的數(shù)字加密貨幣DDC2(朵朵幣2)舉例,其中錢(qián)包啟動(dòng)后的界wallet部分是這個(gè)錢(qián)包里面的幣數(shù),其中余額表示這個(gè)錢(qián)包里面有多少幣。Stake表示的是出塊的幣數(shù)。未確認(rèn)表示的是收到了幣,但卻沒(méi)有進(jìn)行出塊跑幾個(gè)月,這樣對(duì)你進(jìn)行開(kāi)發(fā),有極大的好處。于挖礦。這個(gè)是pos出塊特有的指令,主要是用于pos模式下的錢(qián)包出塊。gui客戶端的大概組成。盡管現(xiàn)在的各種“錢(qián)包”長(zhǎng)的千差萬(wàn)別對(duì)于經(jīng)?;燠E在幣圈里面的學(xué)員可能覺(jué)得這一節(jié)簡(jiǎn)單到了無(wú)聊,但的遇 第一個(gè)build主要是gui界面編譯過(guò)程中第二個(gè)contrib存放是一些編譯用的小工具,我們一鍵編譯用的那兩個(gè)快easywinbuilder里面。當(dāng)然我們要特別說(shuō)明一下,這個(gè)easywinbuilder并不是所有源碼里面都有,而是有人專門(mén)做的,在第四Doc是一個(gè)很關(guān)鍵但會(huì)被大多數(shù)人忽略的,這個(gè)里面主要存放是這Src里面是所有的錢(qián)包源碼文件,在第五節(jié)進(jìn)行進(jìn)一步的解析。除了這些外,還有一個(gè)文件值得關(guān)注,就是這個(gè)pro的文件,第四節(jié)easywinbuilder我們?cè)诘谌?jié)說(shuō)到,第二個(gè)contrib存放是一些編譯用的小工具,我們一鍵編譯用的那兩個(gè)快捷方式就是在這個(gè)文件夾的easywinbuilder里面。 的構(gòu)成其中帶齒輪的就是批命令,其中1到3都是做編譯環(huán)境用的,我們暫且不提。4a4bshsetvars.bat。當(dāng)然還有一個(gè)文件是最容易忽略但最建議看的,就是readme.md。(c)2013phelix -MIT all_easywinbuilder.batormanuallystartthebatchfilesinorder.BuildingonWindowsreallyisapain.Hopefullythissavespeoplesome//這里大概說(shuō)的是這個(gè)可以自動(dòng)編譯比特幣,幣和其他競(jìng)爭(zhēng)幣EasyWinBuildercanrunonamintwindowssystem(e.g.avirtualmachine)oranormalsystem.ItmightoverwriteyourMinGWorQtinstallation,though.Pleasenotetheprocesstakesabouthalfanhourormoreandwillneedabout3GBofharddrivespace.InthisrepositorytherearenochangestotheBitcoincodeitselfthoughtheprocessmakesahandfulofsmallchanges.Thismeansitshouldbepossibletoplug'n'playtheeasywinbuilderdirectoryintosimilarBitcoinversions.Tochangedirectoriesanddependencyversionsedit Moreinfohere:首先,這個(gè)是基于bitcon在2013年的版本進(jìn)行的自動(dòng)編譯,可以編譯比特幣的早期版本和幣的早期版本,或者是類似的修改參數(shù)比較少的其他競(jìng)爭(zhēng)其次,這個(gè)的版本號(hào)為0.5,這就意味著我們找到那個(gè)帖子的原出處后,可特別說(shuō)明的是,需要服務(wù)器才能上,也就是需要買(mǎi)一個(gè) 至于怎么買(mǎi),自己去。容是什么,然后關(guān)注一下4a4b兩個(gè)bat,最后,去set_vars.bat的解@setPATH=%MINGTH%\msys\1.0\bin;%MING@setLANG=en_US.UTF8@setOPENSSL=openssl-1.0.1g@setBOOST=boost_1_55_0@remIfyouwonderwhythereisno-s- @setBOOSTSUFFIX=-mgw48-mt-1_55@setMINIUP @setROOTPATH=..\..@set//設(shè)置編譯路@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@setPERL=%MSYS%/perl.exe@remthefollowingwillbesetasadditionalCXXFLAGSandCFLAGSforeverything-no'or",spaceisok-Wno-unused-variable-Wno-unused- @remNote:VariablessetherecanNOTbeoverwrittenin命令調(diào)用。那我們接著看看4a和4b兩個(gè)批命令是怎么調(diào)用的。 的解@call@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首先是調(diào)用set_vars.bat設(shè)置基本環(huán)境我們接下來(lái)看看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"小進(jìn)行編譯的,因此就先講了,而且Easywinbuilder的源代碼也比較簡(jiǎn)單,方便學(xué)員入手。bat 第五節(jié)src下面 這一節(jié)課我們簡(jiǎn)單講一下源碼的組成,也就是,源碼究竟大概都有哪些的內(nèi)容一掠而過(guò)。Json、test,obj-test不提。首先是obj文件夾,這個(gè)是用來(lái)預(yù)編譯的臨時(shí)文件用的,里面的內(nèi)容可是.cpp,這是c\c++文件,再一個(gè)是makefile.mingw,這個(gè)是編譯用的文件??偣捕嗌賯€(gè)文件呢,我們數(shù)一下,一共是64個(gè)文件。也就是說(shuō),我們只要掌握了這64個(gè)文件,你就是了。Ok,看起來(lái)就是這么簡(jiǎn)單 然后知道了內(nèi)核源碼都是在src文件夾一級(jí) 下面,總共是64個(gè)文件。第七節(jié)客戶端的啟動(dòng)源碼分析(準(zhǔn)備階段客戶端的啟動(dòng)流程尋找源碼 沒(méi)有出現(xiàn)這 advancedfindmain(。為什么要輸入這個(gè)函數(shù)?很簡(jiǎn)單,因?yàn)閏\c++的函數(shù)就叫做main(。那為什么不輸入main()?同main后面會(huì)跟著一個(gè)括第一個(gè)在bitcoinrpp里面,是暗色的,之前有一個(gè)#ifdefTEST,說(shuō)明這是測(cè)!沒(méi)有定QT_GUI的時(shí)候則執(zhí)行,什么意思的,我們找QT_GUI注釋掉了,就可以正常顯示了?Ok,我們把這個(gè)刪除了看一init.cpp176行,發(fā)現(xiàn)灰色已經(jīng)變成白色了。說(shuō)明我們的intmain(intargc,char*intmain(intargc,char*{boolfRet=//ConnectbitcoindsignalhandlersfRet=AppInit(argc,if(fRet&&fDaemon)return0;return}口函數(shù)AppInit。//#if果進(jìn)行g(shù)ui編譯,則從另一個(gè)函數(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;}個(gè)就是引入新的函數(shù)AppInit2。其余的部分由于修改的很少,自行學(xué)習(xí)即 第八節(jié)客戶端的啟動(dòng)源碼分析(AppInit2的step1到boolAppInit2()概/**Initialize @preParametersshouldbeparsedandconfigfileshouldbebool{…}3078799自身進(jìn)行死循環(huán)。換句話說(shuō),客戶端的啟動(dòng)源碼就完全在這個(gè)函數(shù)里面,Step23ParseParameters(argcargv)進(jìn)行預(yù)處理 進(jìn)行鎖定,防止在使用的過(guò)程中產(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(GetBoolArg("-shrinkdebugfile",ShrinkDebugFile();//debug文 CLIENT_DATE.c_str());//朵朵學(xué)院體驗(yàn)幣版本 if GetTime()).c_str());//時(shí)printf("Defauatadirectory%s\n",GetDefauataDir().string().c_str());//缺省printf("Useddatadirectorys\nstrDataDir.c_str());//使用的數(shù)據(jù)std::ostringstreamstrErrors;if(filesystem::exists(GetDataDir()/{ }db.cpp里面,所以我們得到一個(gè)結(jié)論——db.hdb.cpp的功能之一是處理錢(qián)包 (*recoverFunc)(CDBEnv&dbenv,std::stringstrFile)){Dbdb(&dbenv,intresult=db.verify(strFile.c_str(),NULL,NULL,//berkeleyDB->verify()函數(shù)對(duì)wallet.dat進(jìn)行校驗(yàn)。}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"])這個(gè)是輸入節(jié)點(diǎn)的Step4是做一些應(yīng)用初始化的;Step5是用來(lái)檢測(cè)錢(qián)包完整性的;Step6是用來(lái)做網(wǎng)絡(luò)初始化的。第九節(jié)客戶端的啟動(dòng)源碼分析(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*>::iteratormi=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ù)進(jìn)行發(fā)現(xiàn)filesystem::pathpathLogDir=pathDataDir/"database";filesystem::pathpathErrorFilepathDataDir"db.log";首先處理的是database下面的nDbCache=GetArg("-dbcache",25);
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)該是在最佳里面確認(rèn)塊身intnCheckLevel=GetArg("-checklevel",intnCheckDepth=GetArg("-checkblocks",2500);if(nCheckDepth==0)nCheckDepth=1000000000;//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)。這個(gè)函boolLoadBlockIndex(bool{//LoadblockCTxDBif//Initwithgenesisif{if(!fAllowNew)returnfalse;//Genesisconstchar*pszTimestamp="Ari20,2014,PutinSignsTreatyToAddCrimeaToMap.";CTransactiontxNew;txNew.nTime=nChainStartTime;txNew.vin[0].scriptSig=CScript()<<486604799<<<<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和之前的不一樣,是一個(gè)非常具體的功能,就是載入。一個(gè)是bitdb.Open(GetDataDir(),做 LoadBlockIndex(boolfAllowNew)函數(shù),用于的。其中用的是 if{if(!fAllowNew)returnfalse;//Genesisconstchar*pszTimestamp="Ari20,2014,PutinSignsTreatyToAddCrimeaToMap.";第一個(gè)意思是,如果你之前不會(huì)做幣,也對(duì)的源碼就完全沒(méi)有概念,第二個(gè)意思是,其實(shí)所謂的,在我看來(lái)就是對(duì)整個(gè)的家,而且比那些連400小時(shí)可能都不夠的強(qiáng)多了。第十一節(jié)客戶端的啟動(dòng)源碼分析(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} ..LoadWallet()CWalletDB::LoadWallet(CWallet*pwallet){tryintnMinVersion=0;//GetDbc*pcursor=GetCursor();if(!pcursor){printf("Errorgettingwalletdatabasecursor\n");returnDB_CORRUPT;}{//ReadnextCDataStreamssKey(SER_DISK,CLIENT_VERSION);CDataStreamssValue(SER_DISK,CLIENT_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;}及對(duì)特殊的pos部分進(jìn)行專門(mén)的處理?!?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>::iteratoritpwallet->mapWallet.begin();it!=pwallet->mapWallet.end();{CWalletTx*wtx=&((*it).second);}ListAccountCreditDebit("",int64&nOrderPosNext=pwallet->nOrderPosNext;nOrderPosNext=0;std::vector<int64>for(TxItems::iteratorit=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>::iteratormi=while(mi!=
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 口頭承諾合同范本
- 新冠課題申報(bào)書(shū)
- 涼茶加盟合同范本
- 品牌共建協(xié)議合同范例
- 單位轉(zhuǎn)讓二手房合同范本
- 東芝熱水器安裝合同范本
- 臺(tái)球球員合同范本
- 員工股合同范本模板
- 品牌特賣(mài)合同范本
- 雙方出資合作合同范本
- 作品集合同范本
- 保安員綜合理論考試題庫(kù)備考500題(含各題型)
- 《苗圃生產(chǎn)與管理》教案-第一章 園林苗圃的建立
- 山泉水公司《質(zhì)量管理手冊(cè)》
- X證書(shū)失智老年人照護(hù)身體綜合照護(hù)講解
- 2025年內(nèi)蒙古自治區(qū)政府工作報(bào)告測(cè)試題及參考答案
- 2024年全國(guó)中學(xué)生生物學(xué)聯(lián)賽試題及答案詳解
- 2024年全國(guó)職業(yè)院校技能大賽高職組(社區(qū)服務(wù)實(shí)務(wù)賽項(xiàng))考試題庫(kù)(含答案)
- 中醫(yī)治療男科疾病的方法
- 2025年度花卉產(chǎn)業(yè)大數(shù)據(jù)服務(wù)平臺(tái)建設(shè)合同2篇
- 2025年度花卉產(chǎn)業(yè)大數(shù)據(jù)平臺(tái)建設(shè)合同3篇
評(píng)論
0/150
提交評(píng)論