區(qū)塊鏈源碼解析與內(nèi)核級移植1朵朵學院_第1頁
區(qū)塊鏈源碼解析與內(nèi)核級移植1朵朵學院_第2頁
區(qū)塊鏈源碼解析與內(nèi)核級移植1朵朵學院_第3頁
區(qū)塊鏈源碼解析與內(nèi)核級移植1朵朵學院_第4頁
區(qū)塊鏈源碼解析與內(nèi)核級移植1朵朵學院_第5頁
已閱讀5頁,還剩119頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

增加第二部分(比特幣、點點幣及幣的源碼解析)增加第三部分(各大數(shù)字加密貨幣(或基于數(shù)字加密貨幣的ICO)源碼解析說明本歸朵朵學院及大慶萬朵物聯(lián)網(wǎng)科技所有,任何單位和個 2017511特別說我在這里再次強調(diào)一下,本所要求的基礎(chǔ)知識真的非常少,就是c\c++和數(shù)據(jù)結(jié)構(gòu),所以如果連這個要求都達不到的,那說明你真的不適合做開發(fā)。真學習;要不就換一個更基礎(chǔ)的看了,本真不適合你。做具體的講解,這種我基本上都是拉黑,因為本為免費教本發(fā)布的地方,以及在哪里可以找到我本主要在三個地方發(fā)布B 至于在哪里找到我有問題可以發(fā)給我: 基本就這三種方式。Qq群我已經(jīng)了,說什么我都看不到,qq一前篇一我寫這個的目的——愈演愈烈的ICO鬧 前篇二你能從本學到些什 前篇三不推薦有以下三個毛病的人學 前篇四關(guān)于基于qt4的gui圖形界面的指 前篇五本書的整體思 第一章的技術(shù)種類與發(fā)展歷 第一節(jié)前 第二節(jié)的技術(shù)分 第三節(jié)編程語言的討論與選 第四節(jié)國內(nèi)幣圈的 第六節(jié)總 第二章朵朵學院體驗幣制 部分 第一節(jié)體驗幣的編譯 展 第二節(jié)客戶端(錢包)一般性解 第二節(jié) 的構(gòu) 第三節(jié)set_vars.bat的解 第四節(jié)4a_build_daemon.bat的解 第五節(jié)4a_build_daemon.bat的解 第六節(jié)小 組 第二節(jié)第一階段的小結(jié)與下一步的規(guī) 第三節(jié)客戶端的啟動源碼分析(準備階段 intmain(intargc,char* boolAppInit(intargc,char* 第四節(jié)客戶端的啟動源碼分析(AppInit2的step1到 Step2與 Step1到6的簡單總 第五節(jié)客戶端的啟動源碼分析(AppInit2的 Step7概 Step7下的 Step7下的 Step7下的PrintBlockTree Step7下的LoadBlockIndex Step7的總 第六節(jié)從做幣到專家其實只有二步之 第七節(jié)客戶端的啟動源碼分析(AppInit2的 Step8概 Step8下的RandAddSeedPerfmon Step8下的GetKeyFromPool Step8的總 第八節(jié)關(guān)于錢包文件的若干補充說 第九節(jié)客戶端的啟動源碼分析(AppInit2的 第十節(jié)客戶端的啟動源碼分析(AppInit2的 Step11啟動節(jié) Step12收 第六章朵朵學院體驗幣的源碼解析(startnode部分 第一節(jié)承上與啟 第二節(jié)startnode概 第三節(jié)學到這里應(yīng)該具備的基 第四節(jié)ThreadStakeMinter概 第七節(jié)總 前言我們要學什 第一節(jié)什么是版本追 第二節(jié)什么是參數(shù)剝離 第八章比特幣的源碼解析(pow模式的創(chuàng)始者 第一節(jié)比特幣的版本歷 第九章點點幣的源碼解析(pos模式的創(chuàng)始者 第一節(jié)朵朵學院體驗幣與幣的關(guān) 前篇一我寫這個的目的——愈演愈烈的ICO鬧2015年底,為了打破開發(fā)的神秘感,于是發(fā)布了《朵朵學院虛擬不在統(tǒng)計內(nèi)的相互共享,那就了。我記得當時寫《朵朵學院開發(fā)初級3.0版》的大環(huán)境是因為無意義的克隆幣在國內(nèi)實在太多了,炒幣和交易所想著法的做幣騙錢。所以這本主要是為了通過簡單的開發(fā)學習,消除人們對開發(fā)的陌生感,防止無意義的克隆幣在國內(nèi)泛濫成災(zāi),以至于量的50%以上。這是挺好的一個事情,一方面,大家都學會了的簡單制作,這就是虛是——毀也朵朵。新的更大規(guī)模的行為在變的愈演愈烈,那就是ICO——基于代幣的眾籌行為。最典型的例子莫過于2016年基于的theDAO。我們很難想象,一個號稱眾籌十多億ico初創(chuàng)項目,竟然連一個眾籌代碼都寫不好。別的公司20104100萬,在2011年12月,第二輪融資9000萬,兩輪加起來還趕不上一個ICO項目,我更是懶得提了。這么說吧,即便是國家級的斷了人家的財路干嘛。所以我也懶得繼續(xù)分析。具體誰是,誰不,有興其實,ICO在早期就是一個人或者一個團隊,在社區(qū)籌點錢做一個項目,比ICO已經(jīng)完全變味了,動輒就是幾千萬幾億,而且沒有,這已經(jīng)是一個非常嚴重的事情,我不是搞金融的,我不大懂,但絕對不因此本著繼續(xù)遵循“成也朵朵,毀也朵朵”的基本原則,即2015年公開虛學到的知識到自行相關(guān)ICO的源代碼,自行評估好了。我估計到時候90%的人都會感慨“了,就這么個玩意也敢籌那么多錢”前篇二你能從本學到些什首先說明一下,的源碼解析并不需要多少知識,只我看過現(xiàn)在有的人本主要分為三大部分第一大部分是源碼的閱讀源碼的過程中搜集了過去大量的資料,發(fā)現(xiàn)最大的問題就是不夠系朵朵學院的是,目的是告訴大家如何進行內(nèi)核級移植,所以在第二大部分是內(nèi)核的第三大部分是內(nèi)核級功能移基于的通基于的信息基于的智能合基于的內(nèi)嵌系基于的特殊共識實現(xiàn)(比如鏈擬幣的相關(guān)代碼,移植到自己的代碼當中,并且正常運行。 完全不一樣。這個我之所以命名為《蘑菇隨筆》,而不是《XXX開發(fā) ICO項目就前篇三2015c語言都沒學不了開發(fā)人員。第一個毛病:你是否還停留在群里問問題的階段,而不是通過或者進行詢問?如何也是這樣的話,你將停留著一個初學者階段。第二個毛?。翰痪邆涑绦騿T的基本修次之后肯定拉。第三個毛病:希望找保姆的學前篇四關(guān)于基于qt4的gui圖形界面的指盡管本主要是講述底層源碼解析的,但鑒于很多學員苦于對圖形可以去當當網(wǎng),關(guān)于qt4編程的書都可以,淘寶也有大量的可以購如何漢化源碼里面直接漢化。上面有大量相關(guān)的。后期朵朵學院會不會出相關(guān)的開發(fā)前篇五本書的首先是第一部分,用朵朵學院體驗幣的源碼做整體的分析主要是告訴大家最終會拆分為三部分源碼,btc,ppc和novacoin。幣三個目前主要的數(shù)字加密貨幣在近一年內(nèi)上的新幣或者基于數(shù)字加密貨幣做的ICO進行整體的技術(shù)評估,看看是否有值得借鑒前的重點是把第二部的幾個章節(jié)做好際的移植例程,包括智能合約,通訊,共識模式的修改。不過第一 的技術(shù)種類與發(fā)展歷才,從2015年1月開始進行相關(guān)的開發(fā),由于是,屬于第二職業(yè),因此整4個小時技術(shù),7003000100200410004000就寫文章人。目,期間不乏985和211的大學。期間有一個讓我尤其深刻,那個項目組N結(jié)果我拿到他們的可行性分析報告,竟然發(fā)現(xiàn)里面50%以上的技術(shù)數(shù)據(jù)都是錯他們在立項的時候就明確的要求從底層協(xié)議解決,等于自己把自己堵死然而他們的一句回復(fù)讓我更哭笑不得“bitcoincore是誰?”我瞬間。所以我打算寫一下的技術(shù)種類與發(fā)展歷史,以示正聽。第二節(jié)的技術(shù)分請批評指正。有的可以自行檢索。:代表:Bitcoin(首創(chuàng),2010年正式發(fā)布代表:litecoin(非首創(chuàng),但最通用,2012年正式發(fā)布)代表:Peercoin(點點幣社區(qū)首創(chuàng),2012年正式發(fā)布)智能資產(chǎn):目前的熱點之一代表:nxt(2013年首創(chuàng))鏈:目前熱門的熱點之代表:比特股(2013年首創(chuà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è)系統(tǒng):內(nèi)嵌系統(tǒng)幣(2012年首創(chuàng)并正式運行)微幣(2014年正式運行IBMadept項目(2014年商業(yè)化運行,2016年部分開源Linux的超級賬本(2016年開始正式運行時都不夠的所謂磚家寫的文章給了,開發(fā)領(lǐng)域非常龐大,除了那個天天在幣圈做的xx坊外,還有很多相關(guān)技術(shù)。而所謂的智能合約,其實只是第三節(jié)編程語言的討論與選目前的編程語言的主流是C\C++,圖形界面的開發(fā)則是qt4和qt5.例外的目前只有兩個,一個是基于java的未來幣,以及基于go語言的。剩下的99%以上的數(shù)字加密貨幣都是基于C\C++開發(fā)的??纱罅康某鯇W者并不懂得這個道理,尤其是各個高校,看火就用做項目,結(jié)果發(fā)現(xiàn),不但的資料非常的少,連go語言的資料也同樣非常少,做起項目痛苦。本是基于bitcon和其相關(guān)延伸代碼進行講解的,因此也主要是基第四節(jié)國內(nèi)幣圈的是在乎自己拋出去。句話說,國內(nèi)幣圈的史,同時也是幣圈小白的血淚史。20132014年是期,新的唯一的一個亮點是。國內(nèi)發(fā)展則萎靡不振2015年之后國外的幣重點則是炒,一直到去年和今年其實我們經(jīng)常能看到這么一個現(xiàn)象,就是第一個吃螃蟹的人往往沒有賺到我寫的這個不是告訴大家怎么去做創(chuàng)新,去寫,或者弄個發(fā)明專利然很多學員會疑惑,為什么不講XXX啊?;蛘吣脕沓鰜硪恍┻B400小時都不夠第二章朵朵學院體驗幣朵朵學院初級3.0版:用qq直接登錄即可,免。請學會第一篇——初級幣的開或者到我的淘寶寶貝 適合做開發(fā)。真學習;要不就換一個看了,本真不適合你。第三 朵朵學院體驗幣源碼解析 部分我在這里再次強調(diào)一下,本不是《朵朵學院開發(fā)初3.0版》那種手把你做的easy,本質(zhì)上屬于我在進行朵也不會寫的那面俱到,否則內(nèi)容過于龐大,非把我累死不可。能學到什么程度完全看個人的悟性。有什么疑問可以發(fā)給我,但幣——朵朵幣(DDC2)一樣,這樣你不但會學到很多在里面永到過太多朵朵學院的學員因為小利而與傳銷組織或者炒幣合作,最終上當受騙,背著黑鍋,挨著罵,替著別人數(shù)錢。請記住借你的名義,也找不到任何的機會C:\xueyuancoin\contrib\easywinbuilder4a_build_daemon.bat,出然后運行C:\xueyuancoin\contrib\easywinbuilder里面的4b_build_qt.bat,這說明我們的qt4編譯環(huán)境也成功了。C:\文件,雙擊打開,如果出現(xiàn)如下界面,說明你的qt安裝也成功了。關(guān)于c++學習:推薦的為《C++Primerplus中文版另外譚浩強教授寫的關(guān)于C語言和C++的兩本書也是我所推薦的,盡管很多人 數(shù)據(jù)結(jié)構(gòu),不但會而且要非常熟悉才行,否則學起來也是重重。第二節(jié)客戶端(錢包)一般性解客戶端的,這是一個基本的網(wǎng)絡(luò)開發(fā)原則。但bt則有一些相似,這里沒有服務(wù)端,而只有客戶端,我們稱之為ip地址,我們一般稱之為節(jié)點,然后,我們稱之為數(shù)據(jù)同步;并且與IRC的廣播頻道當中,與的錢包通訊。錢包分兩種,一種是命令行模式,一種是gui模式,但從底層角度來接收與功能,同時提供api接口,供外部程序調(diào)用。我這里用的是我做的數(shù)字加密貨幣DDC2(朵朵幣2)舉例,其中錢包啟動后的界主界面主要是三部分組成,wallet部分,當前,和網(wǎng)絡(luò)狀態(tài)wallet部分是這個錢包里面的幣數(shù),其中余額表示這個錢包里面有多少幣。Stake表示的是出塊的幣數(shù)。未確認表示的是收到了幣,但卻沒有進行出塊跑幾個月,這樣對你進行開發(fā),有極大的好處。于挖礦。這個是pos出塊特有的指令,主要是用于pos模式下的錢包出塊。gui客戶端的大概組成。盡管現(xiàn)在的各種“錢包”長的千差萬別對于經(jīng)?;燠E在幣圈里面的學員可能覺得這一節(jié)簡單到了無聊,但的遇 第一個build主要是存gui界面編譯過程中的一些中間文如果這個第二個contrib存放是一些編譯用的小工具,我們一鍵編譯用的那兩個快個easywinbuilder并不是所有源碼里面都有,而是有人專門做的,在第四Doc是一個很關(guān)鍵但會被大多數(shù)人忽略的,這個里面主要存放是這Libs里面是編譯的二進制代碼庫,這個也不是所有的源碼里面都有Src里面是所有的錢包源碼文件,在第五節(jié)進行進一步的解析。pro的文件,我第四朵學院體驗幣源碼解析(編譯部第一節(jié)easywinbuilder contrib存放是一些編譯用的小工具,我們一鍵編譯用的那兩個快捷方式就是在這個文件夾的easywinbuilder里面。第二節(jié) 其中帶齒輪的就是批命令,其中1到3都是做編譯環(huán)境用的,我們暫且不提。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年的版本進行的自動編譯,可以編譯比特幣的早期版本和幣的早期版本,或者是類似的修改參數(shù)比較少的其他競爭其次,這個的版本號為0.5,這就意味著我們找到那個帖子的原出處后,可特別說明的是,需要服務(wù)器才能上,也就是需要買一個 至于怎么買,自己去。容是什么,然后關(guān)注一下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命令調(diào)用。那我們接著看看4a和4b兩個批命令是怎么調(diào)用的。@call//調(diào)用set_vars.bat設(shè)置基本環(huán)@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)境我們接下來看看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的源代碼也比較簡單,方便學員入手。站去看看版本的源碼。第五朵學院體驗幣源碼解析(啟動部第一節(jié)src下面的這一節(jié)課我們簡單講一下源碼的組成,也就是,源碼究竟大概都有哪些的內(nèi)容一掠而過。Json、test,obj-test不提。首先是obj文件夾,這個是用來預(yù)編譯的臨時文件用的,里面的內(nèi)容可是.cppc\c++makefile.mingw,這個是編譯用的文件??偣捕嗌賯€文件呢,我們數(shù)一下,一共是6464個文件,你就是專家了。Ok,看起來就是這么簡單 然后知道了內(nèi)核源碼都是在src文件夾一級 下面,總共是64個文件。第三節(jié)客戶端的啟動源碼分析(準備階段客戶端的啟動流尋找源碼 advancedfindmain(。為什么要輸入這個函數(shù)?很簡單,因為c\c++的函數(shù)就叫做main(。那為什么不輸入main()?同main后面會跟著一個括號。然從啟動角度研究,那自然就要找到這個函數(shù)了。!沒有QT_GUI的時候則執(zhí)行,什么意思的,我們DEFINES+=QT_GUIBOOST_THREAD_USE_LIBQT_GUI注釋掉了,就可以正常顯示了?Ok,我們把這個刪除了看一init.cpp176行,發(fā)現(xiàn)灰色已經(jīng)變成白色了。說明我們的intmain(intargc,char*我們閱讀一下函數(shù)intmain(intargc,char*{boolfRet=//ConnectbitcoindsignalhandlersfRet=AppInit(argc,if(fRet&&fDaemon)return0;return}口函數(shù)AppInit。boolAppInit(intargc,char*//#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。其余的部分由于修改的很少,自行學習即 第四節(jié)客戶端的啟動源碼分析(AppInit2的step1到boolAppInit2()概/**Initialize @preParametersshouldbeparsedandconfigfileshouldbebool{…}3078799客戶端的啟動源碼就完全在這個函數(shù)里面,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());//使用的數(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{InitError(_("Unabletosigncheckpoint,wrong}BOOST_FOREACH(stringstrDest,mapMultiArgs["-seednode"])Step16Step4是做一些應(yīng)用初始化的;Step5是用來檢測錢包完整性的;Step6是用來做網(wǎng)絡(luò)初始化的。第五節(jié)客戶端的啟動源碼分析(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我們從函數(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,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應(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}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)函數(shù),用于的。其中用的是CTxDB::LoadBlockIndex()函數(shù)。如果為空,則創(chuàng)建新的創(chuàng)世紀塊。第六節(jié)從做幣到專家其實只有二步之易得罪人,所以寫了一個溫柔的題目——從做幣到專家其實只有二步之if{if(!fAllowNew)returnfalse;//Genesisconstchar*pszTimestamp="Ari20,2014,PutinSignsTreatyToAddCrimeaToMap.";第一個意思是,如果你之前不會做幣,也對的源碼就完全沒有概念,第二個意思是,其實所謂的專家,在我看來就是對整個的運作家,而且比那些連400小時可能都不夠的專家強多了。第七節(jié)客戶端的啟動源碼分析(AppInit2的Step8概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,_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}息放到錢包文件當中。涉及到的具體的兩個函數(shù),ReadFromDisk和Step8析和處理,第二種是沒有錢包的情況下,我們從key池里面新key來建立錢錢包文件究竟是什么為什么錢包丟了,幣就找不回錢包軟件的文件名一般為wallet.dat。window用戶一般在我的文檔里面,而且是一個隱藏,因此一般的用戶很頭疼這個東西,往往是丟了還不知個幣就的丟失了,因為用不了。錢包文件里面究竟都有什么內(nèi)密鑰的每一筆信息。錢包文件與文件之間的關(guān)系錢包文件里面的信息從里面整理出來。你可以理解有這么一個過濾或者其他操作的時候就不用頻繁的對進行操作了。如何從編程的角度去看錢包文件及其源第九節(jié)客戶端的啟動源碼分析(AppInit2的 第十節(jié)客戶端的啟動源碼分析(AppInit2的里面了用于連接節(jié)點數(shù)據(jù)。在有的數(shù)字加密貨幣里面,用的是addr.dat?!癮db.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啟動節(jié)if(!CheckDiskSpace())returnfalse;if(!NewThread(StartNode,NULL))InitError(_("Error:couldnotstartifNewThread(ThreadRPCServer,Step12收這個函數(shù)是通過更新錢包。{CTxDBtxdb("r");boolfRepeat=true;while(fRepeat)//只要沒有解析完就繼續(xù)更{fRepeat=vector<CDiskTxPos>vMissingTx;BOOST_FOREACH(PAIRTYPE(constuint256,CWalletTx)&item,{}}}第十二節(jié)客戶端的啟動源碼分析(總結(jié)與意義未完啟動源碼的分析是進行開發(fā)的基啟動源碼的分析是進行內(nèi)核級移植的第六章朵朵學院體驗幣的源碼解析(startnode部分我在這里再次強調(diào)一下,本不是《朵朵學院開發(fā)初3.0版》那種手把你做的easy,本質(zhì)上屬于我在進行朵也不會寫的那面俱到,否則內(nèi)容過于龐大,非把我累死不可。能學到什么程度完全看個人的悟性。有什么疑問可以發(fā)給我,但本章節(jié)主要講授朵朵學院體驗幣的第三個部分,startnode部分好了,我們繼續(xù)做總結(jié),followingsrc64個文件。那么問題出來了,我們應(yīng)該如何且講的啟動的12個步驟。其中我們發(fā)現(xiàn),在第11個步驟當中,啟動了兩個線程,StartNodeThreadRPCServerStartNode是主網(wǎng)絡(luò)線程,主要的功能幾乎都是在這里進行實現(xiàn);而ThreadRPCServer主要是進行socket通訊用的,可以理解為做api接使StartNode部分當中,因此我們重點是講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)//ppcpos出塊模式。順便說一下,我竟然看到有所謂的專家說pos是發(fā)明的,想一大巴掌糊死他。Pos模式是點點幣社區(qū)的sk在2012年8月實現(xiàn)的那個時候這個所謂的專家還不知道在哪//Generatecoinsintherg("-gen",false),}分,后面的兩個,ThreadStakeMinterGenerateBitcoin

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論