四倍权、初始化和啟動(dòng)模塊(3)

(四)我們接著看bitcoind.cpp文件代碼的99-110行

這幾行主要作用是:判斷數(shù)據(jù)目錄是否存在并讀取配置文件參數(shù)指定的配置文件谦去。代碼的內(nèi)容是:

需要分析4個(gè)部分內(nèi)容:

  • GetDataDir(false)函數(shù);
  • BITCOIN_CONF_FILENAME 宏定義卦方;
  • GetArg()函數(shù);
  • ReadConfigFile()函數(shù)腐螟。
    (1)GetDataDir(false)函數(shù)
    這個(gè)函數(shù)在util.t中的第172行聲明:
    在util.cpp的第555行實(shí)現(xiàn):
    其中注釋文字內(nèi)容為:

這可以通過(guò)LogPrintf()來(lái)調(diào)用愿汰,因此我們緩存了值,這樣我們就不必在之后執(zhí)行內(nèi)存分配了.

更詳細(xì)的講解可以參考下面的鏈接:

http://www.reibang.com/p/bd1903a31b4b

(2)BITCOIN_CONF_FILENAME 宏定義
該定義在util.cpp中的第90行:


(3)GetArg()函數(shù)
此處的函數(shù)使用的代碼為:
gArgs.GetArg("-conf", BITCOIN_CONF_FILENAME)
其中 gArgsArgsManager類定義的變量乐纸,GetArg()聲明在util.h中第221行衬廷,屬于ArgsManager類中的方法:
std::string GetArg(const std::string& strArg, const std::string& strDefault);
它的實(shí)現(xiàn)在util.cpp中436-442行:

std::string ArgsManager::GetArg(const std::string& strArg, const std::string& strDefault)
{
    LOCK(cs_args);
    if (mapArgs.count(strArg))
        return mapArgs[strArg];
    return strDefault;
}

它在這里實(shí)現(xiàn)的功能為:

判斷是否有參數(shù)"-conf",如果有汽绢,則使用前面ParseParmeters()函數(shù)使用后保存的參數(shù)值作為配置文件吗跋;如果沒(méi)有,則使用默認(rèn)的“bitcoin.conf”。

(4)ReadConfigFile()函數(shù)
這個(gè)函數(shù)在util.h的第203行聲明跌宛,在util.cpp的第601實(shí)現(xiàn)酗宋,其中它的實(shí)現(xiàn)代碼如下圖所示:

這個(gè)函數(shù)主要是先讀取配置文件的參數(shù)和參數(shù)值,并存儲(chǔ)這些信息疆拘;最后用ClearDatadirCache()函數(shù)將數(shù)據(jù)文件路徑參數(shù)設(shè)置成空目錄蜕猫。其中ClearDatadirCache()函數(shù)在util.cpp的第584行實(shí)現(xiàn):

總之,對(duì)于這部分實(shí)現(xiàn)的功能邏輯如下所示:

  1. 判斷函數(shù)GetDataDir()得到的路徑是否為規(guī)范的目錄名稱哎迄。如果不是回右,打印指定目錄不存在的錯(cuò)誤信息,并返回false值漱挚,程序退出翔烁;如果是,則繼續(xù)下面的程序旨涝。
  2. 使用ReadConfigFile()函數(shù)來(lái)讀取配置文件中的參數(shù)名與參數(shù)值蹬屹,并把得到的參數(shù)信息存入mapArgs和_mapMultiArgs中。

(五)繼續(xù)看bitcoind.cpp中代碼的112-117行

對(duì)此段代碼的注釋為:

檢查- testnet- regtest參數(shù) (Params()調(diào)用僅在此子句之后有效)

其中- testnet指代比特幣的測(cè)試網(wǎng)絡(luò)Testnet白华,而- regtest指代比特幣的私有網(wǎng)絡(luò)Regression test慨默。那么可以知道這個(gè)部分是選擇比特幣網(wǎng)絡(luò)的。
其中主要的是兩個(gè)函數(shù):

  • ChainNameFromCommandLine()函數(shù)衬鱼;
  • SelectParams()函數(shù)业筏。
    其中SelectParams()是以ChainNameFromCommandLine()函數(shù)的返回值當(dāng)作參數(shù)的憔杨。下面對(duì)這兩個(gè)函數(shù)具體分析:
    (1)ChainNameFromCommandLine()函數(shù)
    這個(gè)函數(shù)的聲明在chainparamsbase.h中的第60行:
    對(duì)它的注釋內(nèi)容為:

尋找- regtest鸟赫,- testnet并返回適當(dāng)?shù)腂IP70鏈名。
如果給定無(wú)效組合消别,則返回CBaseChainParams::MAX_NETWORK_TYPES抛蚤;默認(rèn)情況下返回CBaseChainParams::MAIN

它的實(shí)現(xiàn)在chainparamsbase.cpp中的第90行,具體代碼如圖所示:

對(duì)于它的具體實(shí)現(xiàn)過(guò)程可以參考下面鏈接:

http://www.reibang.com/p/6fcfc5969733

總之:這是一個(gè)獲取網(wǎng)絡(luò)名稱的函數(shù)寻狂。對(duì)于具體的實(shí)現(xiàn)邏輯如下:

檢測(cè)是否含有- regtest- testnet參數(shù)岁经,如果只含有- regtest參數(shù),則獲取網(wǎng)絡(luò)名稱為"regtest"蛇券,即私有網(wǎng)絡(luò)缀壤;如果只含有- testnet參數(shù),則獲取的網(wǎng)絡(luò)名稱為"test"纠亚,即測(cè)試網(wǎng)絡(luò)塘慕;當(dāng)兩個(gè)參數(shù)同時(shí)含有,則會(huì)報(bào)錯(cuò)蒂胞;當(dāng)兩個(gè)參數(shù)都沒(méi)有則獲取的網(wǎng)絡(luò)名稱為"main"图呢,即主網(wǎng)絡(luò)。

(2)SelectParams()函數(shù)
這個(gè)函數(shù)的聲明在chainparams.h中的第116行:

對(duì)這個(gè)函數(shù)的注釋為:

根據(jù)params()返回的值設(shè)置成指定的BIP70的鏈名稱的參數(shù)。
當(dāng)鏈不被支持時(shí)蛤织,拋出錯(cuò)誤信息std::runtime_error

它的實(shí)現(xiàn)在chainparams.cpp中的第353行:

這個(gè)函數(shù)調(diào)用了兩個(gè)函數(shù):

  • SelectBaseParams()函數(shù)赴叹;
  • CreateChainParams()函數(shù)。
    SelectBaseParams()函數(shù)的聲明在chainparamsbase.h的第54行注釋上對(duì)它的解釋是:

根據(jù)params()返回的值設(shè)置成指定網(wǎng)絡(luò)的參數(shù)指蚜。

函數(shù)的實(shí)現(xiàn)在chainparamsbase.cpp中的第85行:

可以知道它調(diào)用了CreateBaseChainParams()函數(shù)乞巧,這個(gè)和下面說(shuō)要說(shuō)的CreateChainParams()函數(shù)名稱相似,其實(shí)這兩個(gè)函數(shù)的功能也相似摊鸡,都是對(duì)不同默認(rèn)網(wǎng)絡(luò)的參數(shù)設(shè)置摊欠,只是CreateChainParams()函數(shù)設(shè)置的更具體,而CreateBaseChainParams()函數(shù)只是基本設(shè)置柱宦。
CreateBaseChainParams()函數(shù)在chainparamsbase.h中的第39行聲明些椒,在chainparamsbase.cpp的第73行實(shí)現(xiàn):
可以知道根據(jù)不同的鏈名稱選擇對(duì)應(yīng)的CBaseMainParams()CBaseTestNetParams()CBaseRegTestParams() ,而則三個(gè)函數(shù)是分別對(duì)私有網(wǎng)絡(luò)掸刊、測(cè)試網(wǎng)絡(luò)和主網(wǎng)絡(luò)的RPC端口參數(shù)和數(shù)據(jù)目錄免糕。在chainparamsbase.cpp的30-63行:
從這些數(shù)據(jù)可以知道比特幣主網(wǎng)絡(luò)的RPC端口為8332,測(cè)試網(wǎng)絡(luò)的RPC端口為18332忧侧,私有網(wǎng)絡(luò)的RPC端口為18332石窑,以及他們各自的目錄名 。
CreateChainParams()函數(shù)
這個(gè)函數(shù)的聲明在chainparams.h中的第104行蚓炬,其中注釋對(duì)它解釋為:

創(chuàng)建并返回一個(gè)std::unique_ptr <cchainparams>的選擇鏈松逊。
返回所選鏈的CChainParams *指針。
如果這個(gè)鏈沒(méi)有被支持則拋出一個(gè)錯(cuò)誤信息:std::runtime_error

這個(gè)就是根據(jù)上面得到的網(wǎng)絡(luò)名稱設(shè)置成對(duì)應(yīng)的網(wǎng)絡(luò)參數(shù)肯夏,并把參數(shù)賦值給globalChainParams经宏。
它的實(shí)現(xiàn)在chainparams.cpp的第342行:

CreateBaseChainParams()函數(shù)類似,它在實(shí)現(xiàn)的時(shí)候同時(shí)也實(shí)例化了對(duì)應(yīng)網(wǎng)絡(luò)類型的參數(shù)設(shè)置函數(shù):CMainParams() 驯击、CTestNetParams()CRegTestParams()烁兰。對(duì)于這三個(gè)函數(shù)在chainparams.cpp的73-333行的大量代碼中有詳細(xì)的代碼實(shí)現(xiàn),這里基本上包含了不同網(wǎng)絡(luò)的網(wǎng)絡(luò)名稱徊都、挖礦難度沪斟、區(qū)塊信息等等幾乎所有需要的參數(shù)。

所以暇矫,如果想要?jiǎng)?chuàng)建自己需要的數(shù)字貨幣主之,只需要單獨(dú)修改這里面的參數(shù)就行了,比如修改難度李根,獎(jiǎng)勵(lì)金額等槽奕。這個(gè)部分是開發(fā)時(shí)經(jīng)常要修改的地方。

總結(jié):
SelectParams()函數(shù)實(shí)現(xiàn)的功能就是把ChainNameFromCommandLine()函數(shù)獲取得到的網(wǎng)絡(luò)名稱設(shè)置成對(duì)應(yīng)的基本的網(wǎng)絡(luò)基本參數(shù)朱巨。


(六)繼續(xù)看bitcoind.cpp中代碼的120-125行

這段代碼的注釋為:

當(dāng)命令行中有不準(zhǔn)確的無(wú)參數(shù)符號(hào)時(shí)出現(xiàn)錯(cuò)誤提示史翘。

這部分有個(gè)判斷函數(shù)IsSwitchChar(),它的作用是判斷是否有'-'或'/',含有的將會(huì)是正確的琼讽。它的實(shí)現(xiàn)在util.h中的第186行:

那么如果符號(hào)不正確必峰,則在終端輸出:
Error: Command line contains unexpected token '%s', see bitcoind -h for a list of options.
而且程序會(huì)因?yàn)楫惓6顺觥?p>


(七)繼續(xù)看bitcoind.cpp中代碼的第128行

這部分的代碼就只有一行,注釋對(duì)它的說(shuō)明為:

對(duì)于bitcoind來(lái)說(shuō)-server默認(rèn)是開啟的钻蹬,但對(duì)于GUI(圖形界面)-server默認(rèn)則是關(guān)閉的吼蚁,所以在此添加代碼。

這里面有個(gè)主要的函數(shù):SoftSetBoolArg(),這個(gè)函數(shù)的聲明在util.h的第257行:

它的注釋主要的意思是:

如果它還沒(méi)有值问欠,就設(shè)置一個(gè)布爾參數(shù)

它的實(shí)現(xiàn)在util.cpp中的第469行:

這個(gè)函數(shù)中調(diào)用了一個(gè)函數(shù)SoftSetArg()肝匆,這個(gè)函數(shù)在util.h中聲明,主要是:

如果它還沒(méi)有值顺献,就設(shè)置一個(gè)參數(shù)

它的實(shí)現(xiàn)在util.cpp中的第460行:


這個(gè)函數(shù)就有很多熟悉面孔旗国,它也是ArgsManager(即參數(shù)管理類)的一個(gè)方法;也有個(gè)互斥鎖:LOCK(cs_args);注整;也有mapArgs.count(strArg)函數(shù)能曾,這個(gè)是關(guān)于mapArgs參數(shù)的驗(yàn)證。還有個(gè)我們不是很熟悉的函數(shù):ForceSetArg()肿轨,這個(gè)函數(shù)在當(dāng)前文件中的第477行實(shí)現(xiàn):
主要還是對(duì)mapArgsmapMultiArgs這兩個(gè)參數(shù)的操作寿冕。

總的來(lái)看:
gArgs.SoftSetBoolArg("-server", true);函數(shù)的實(shí)現(xiàn)邏輯是:

解析mapArgs參數(shù),判斷其中是否有-server這個(gè)參數(shù)椒袍,如果存在就無(wú)需設(shè)置了驼唱;如果沒(méi)有這個(gè)參數(shù),就根據(jù)SoftSetBoolArg()傳入的fValue值進(jìn)行設(shè)置驹暑。


(八)繼續(xù)看bitcoind.cpp中代碼的130-131行

這個(gè)部分只有兩行玫恳,分別有兩個(gè)函數(shù),其中對(duì)它的注釋為:

提前設(shè)置這部分岗钩,使參數(shù)交互內(nèi)容進(jìn)入控制臺(tái)中纽窟。

InitLogging()函數(shù)
這個(gè)函數(shù)的聲明在init.h的第25行:

對(duì)它的注釋為:

初始化日志基礎(chǔ)設(shè)施

它的實(shí)現(xiàn)在init.cpp的821行:


可以了解這是一個(gè)初始化日志的函數(shù)肖油,而且通過(guò)查詢也知道這個(gè)函數(shù)作用的是把數(shù)據(jù)存儲(chǔ)在debug.log文件中兼吓,這個(gè)文件在ubuntu系統(tǒng)是在$HOME/.bitcoin/文件夾中,接下來(lái)對(duì)它初始化實(shí)現(xiàn)的6個(gè)設(shè)置內(nèi)容較詳細(xì)說(shuō)明:
a.函數(shù)的第一行代碼主要是檢測(cè)參數(shù)命令中是否含有-printtoconsole命令森枪,如果有則讓日志信息發(fā)送跟蹤/調(diào)試信息到控制臺(tái)中视搏,但默認(rèn)是false,即默認(rèn)只是記錄在日志文件debug.log中县袱,而不是在控制臺(tái)中顯示浑娜;
///////////////////////////////////////////////////////////////////
補(bǔ)充一點(diǎn):
DEFAULT_LOGTIMESTAMPS DEFAULT_LOGTIMEMICROS
DEFAULT_LOGIPS這三個(gè)靜態(tài)常量在util.h中有定義:
///////////////////////////////////////////////////////////////////
b.函數(shù)的第二行代碼主要是檢測(cè)參數(shù)命令中是否含有-logtimestamps,該參數(shù)的含義是在日志中打印時(shí)間戳式散,由上面的補(bǔ)充內(nèi)容知道默認(rèn)是在日志文件中打印時(shí)間戳的筋遭;
c.函數(shù)的第三行代碼主要是檢測(cè)參數(shù)命令中是否含有-logtimemicros,該參數(shù)的含義是打印日志單位精確到微妙(μs),由上面的補(bǔ)充內(nèi)容知道默認(rèn)是false漓滔,即默認(rèn)初始化日志文件精確到秒(s)编饺;
d. 函數(shù)的第四行代碼主要是檢測(cè)參數(shù)命令中是否含有-logips,該參數(shù)的含義是打印IP地址响驴,由上面的補(bǔ)充內(nèi)容知道默認(rèn)是false透且,即默認(rèn)在日志文件中是不打印IP地址的;
e.函數(shù)第五行是在日志文件中空19行豁鲤;
f.函數(shù)最后一行是打印“Bitcoin version”秽誊,并緊跟上比特幣客戶端的版本信息。

由上面可以知道琳骡,這個(gè)函數(shù)只是一個(gè)基本的初始化日志文件函數(shù)锅论。而接下來(lái)的InitParameterInteraction函數(shù)是日志文件中存儲(chǔ)參數(shù)交互信息。

如下圖為初始化日志的基本格式:

InitParameterInteraction()函數(shù)
開始還是解析這個(gè)函數(shù)代碼:
這個(gè)函數(shù)的聲明在init.h第27行:

對(duì)它的注釋為:

參數(shù)交互:根據(jù)不同的規(guī)則改變當(dāng)前參數(shù)楣号。

它的實(shí)現(xiàn)在init.cpp中的744-814行棍厌,它主要包括了8個(gè)規(guī)則:

下面簡(jiǎn)單的對(duì)這8部分解釋:
a.綁定并監(jiān)聽地址
注釋為:當(dāng)顯示指定了綁定地址后,即使指定了-connect和-proxy參數(shù)信息竖席,程序?qū)?huì)接受來(lái)自外部的連接耘纱,并監(jiān)聽該地址。
通過(guò)參數(shù)-bind-whitebind這兩個(gè)參數(shù)設(shè)置毕荐,并通過(guò)SoftSetBoolArg()函數(shù)實(shí)現(xiàn)了-listen參數(shù)的設(shè)置束析,把它設(shè)置成true,代表要監(jiān)聽設(shè)置的外部連接IP地址憎亚。
b.連接可信的節(jié)點(diǎn)
首先判斷參數(shù)命令中是否含有-connect參數(shù)员寇,如果有將-dnsseed(使用DNS查找節(jié)點(diǎn))和-listen(即接受來(lái)自外部的連接,并對(duì)其進(jìn)行監(jiān)聽)設(shè)置為true第美。并進(jìn)行日志打印蝶锋。
注意:此處代碼的有效執(zhí)行是在為設(shè)置-bind-whitebind參數(shù)的情況下進(jìn)行的。
c.代理模式
設(shè)置代理參數(shù)的目的是為了保護(hù)隱私什往,則此處將-listen扳缕、-upnp以及-discover均設(shè)置為false,也就是說(shuō)比特幣后臺(tái)進(jìn)程只使用代理提供的監(jiān)聽地址與端口别威,并且不去查找默認(rèn)的監(jiān)聽地址躯舔。這里的upnp代表的意思是使用全局即插即用(UPNP)映射監(jiān)聽端口,默認(rèn)不使用省古。
注意:此處代碼的有效執(zhí)行也是在為設(shè)置-bind-whitebind參數(shù)的情況下進(jìn)行的粥庄。
d.監(jiān)聽設(shè)置處理
當(dāng)不監(jiān)聽時(shí),不要映射端口或嘗試檢索公共IP豺妓。就是如果監(jiān)聽參數(shù)設(shè)置為false惜互,則upnp(端口)布讹、discover(自動(dòng)發(fā)現(xiàn)默認(rèn)地址)以及l(fā)istenonion(匿名地址監(jiān)聽)均設(shè)置為false侄泽。
/////////////////////////////////////////////////////////////////////
補(bǔ)充:這里的listenonion(匿名地址監(jiān)聽)實(shí)際上設(shè)計(jì)一個(gè)通信機(jī)制的一個(gè)概念:第二代洋蔥路由(onion routing)尺铣,對(duì)它的理解可以借鑒網(wǎng)絡(luò)的解釋:

Tor(The Onion Router)是第二代洋蔥路由(onion routing)的一種實(shí)現(xiàn),用戶通過(guò)Tor可以在因特網(wǎng)上進(jìn)行匿名交流娃圆。Tor專門防范流量過(guò)濾蔫慧、嗅探分析挠乳,讓用戶免受其害。最初該項(xiàng)目由美國(guó)海軍研究實(shí)驗(yàn)室贊助姑躲。2004年后期睡扬,Tor成為電子前哨基金會(huì)的一個(gè)項(xiàng)目。2005年后期黍析,EFF不再贊助Tor項(xiàng)目卖怜,但他們繼續(xù)維持Tor的官方網(wǎng)站。

而在bitcoind源碼src文件夾下的torcontrol.h和torcontrol.cpp實(shí)現(xiàn)了Tor的控制阐枣。
/////////////////////////////////////////////////////////////////////
e.外部IP參數(shù)處理
如果顯示指定了公共IP地址马靠,那么bitcoind就不需要查找其他監(jiān)聽地址了。
f.區(qū)塊模式參數(shù)設(shè)置
DEFAULT_BLOCKSONLY在net.h中定義蔼两,默認(rèn)值為false甩鳄。表示在blocksonly模式(區(qū)塊模式)下禁用whitelistrelay。即在區(qū)塊模式下白名單列表失效额划。
g.強(qiáng)制白名單節(jié)點(diǎn)連接參數(shù)處理
強(qiáng)制白名單節(jié)點(diǎn)連接參數(shù)處理意味著比特幣網(wǎng)絡(luò)中的信息將優(yōu)先在白名單節(jié)點(diǎn)間傳遞妙啃。
g.區(qū)塊大小設(shè)置
這個(gè)區(qū)塊大小是設(shè)置默認(rèn)的礦工產(chǎn)生區(qū)塊的大小。

總結(jié):

InitParameterInteraction()函數(shù)主要是根據(jù)參數(shù)命令俊戳,改變當(dāng)前的參數(shù)揖赴,并把相應(yīng)的信息打印到日志文件中。其中還涉及到一些網(wǎng)絡(luò)中IP地址的監(jiān)聽設(shè)置方法抑胎、白名單的禁用和啟用情況等燥滑。其實(shí)就是日志文件中初始化日志后(即版本信息打印后)的大量的日志內(nèi)容,如圖:

而這兩個(gè)函數(shù)基本決定了日志文件debug.log中的所有預(yù)輸出日志的打印內(nèi)容阿逃,但是我們知道日志不僅包括初始化準(zhǔn)備的預(yù)輸出日志铭拧,還包括啟動(dòng)程序時(shí)和啟動(dòng)之后的一系列操作的日志,那么日志文件中的啟動(dòng)后的輸出日志內(nèi)容是什么呢盆昙?我們將在后面的AppInitMain()函數(shù)中進(jìn)一步講解程序初始化啟動(dòng)時(shí)的調(diào)試日志內(nèi)容羽历。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市淡喜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诵闭,老刑警劉巖炼团,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澎嚣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瘟芝,警方通過(guò)查閱死者的電腦和手機(jī)易桃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锌俱,“玉大人晤郑,你說(shuō)我怎么就攤上這事∶澈辏” “怎么了造寝?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吭练。 經(jīng)常有香客問(wèn)我诫龙,道長(zhǎng),這世上最難降的妖魔是什么鲫咽? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任签赃,我火速辦了婚禮,結(jié)果婚禮上分尸,老公的妹妹穿的比我還像新娘锦聊。我一直安慰自己,他們只是感情好箩绍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布括丁。 她就那樣靜靜地躺著,像睡著了一般伶选。 火紅的嫁衣襯著肌膚如雪史飞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天仰税,我揣著相機(jī)與錄音构资,去河邊找鬼。 笑死陨簇,一個(gè)胖子當(dāng)著我的面吹牛吐绵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播河绽,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼己单,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了耙饰?” 一聲冷哼從身側(cè)響起纹笼,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苟跪,沒(méi)想到半個(gè)月后廷痘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔓涧,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年笋额,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了元暴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兄猩,死狀恐怖茉盏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枢冤,我是刑警寧澤鸠姨,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站掏导,受9級(jí)特大地震影響享怀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趟咆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一添瓷、第九天 我趴在偏房一處隱蔽的房頂上張望值纱。 院中可真熱鬧鳞贷,春花似錦、人聲如沸虐唠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疆偿。三九已至咱筛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杆故,已是汗流浹背迅箩。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留处铛,地道東北人饲趋。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撤蟆,于是被迫代替她去往敵國(guó)和親奕塑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Ⅲ:AppInit()函數(shù)解讀 這個(gè)函數(shù)定義在bitcoind.cpp中的63行,這是個(gè)重要的函數(shù)息楔,我們來(lái)一行行解...
    風(fēng)來(lái)霧去閱讀 900評(píng)論 0 2
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理寝贡,服務(wù)發(fā)現(xiàn)扒披,斷路器值依,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 2017年的元旦圃泡,在百無(wú)聊賴中發(fā)了一條朋友圈:回顧這一年,雞毛沒(méi)剩愿险。 配了張被禿嚕毛的雞颇蜡。 很少被關(guān)注的我...
    找削的蘋果閱讀 258評(píng)論 0 0
  • 今天在做后臺(tái)項(xiàng)目的時(shí)候,發(fā)現(xiàn)了一個(gè)單位 vh,媽呀辆亏,這是個(gè)什么鬼风秤,沒(méi)有接觸過(guò),雖然說(shuō)還是個(gè)菜鳥但是一般的單位還是知...
    AlisaMfz閱讀 1,391評(píng)論 0 0