




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