【深度知識(shí)】Tendermint共識(shí)算法原理和框架流程

1. 摘要

Tendermint是跨鏈Cosmos項(xiàng)目的核心技術(shù)。本文主要介紹以下內(nèi)容:
(1)Tendermint的網(wǎng)絡(luò)層級(jí)框架圖
(2)Tendermint模塊組成及共識(shí)算法原理
(3)Tendermint工作流程

2. Tendermint概述

Cosmos的開發(fā)團(tuán)隊(duì)Tendermint其實(shí)早在2014年就開始意識(shí)到了其不足择吊,并持續(xù)專注于尋求不依賴挖礦等高電力消耗的共識(shí)機(jī)制挣棕,提供快速的交易處理能力,它們的目標(biāo)是為全事件所有的區(qū)塊鏈提供速度韭邓、安全和可擴(kuò)展性橱健。目前斯撮,Tendermint加入了微軟Azure區(qū)塊鏈即服務(wù)平臺(tái)批幌,也成為了以太坊區(qū)塊鏈聯(lián)盟成員之一础锐,同時(shí)Tendermint也是跨鏈技術(shù)Cosmos的核心技術(shù)。兩者大致的關(guān)系如下:

圖中可以輕松看出Cosmos就是在Tendermint基礎(chǔ)上添加一些插件功能來(lái)實(shí)現(xiàn)的荧缘。

2.1 Tendermint的概念

Tendermint的概念總結(jié)下有以下幾點(diǎn):
(1)Tendermint是一個(gè)能夠在不同機(jī)器上皆警,安全一致復(fù)制應(yīng)用的軟件,其中安全性和一致性也是分布式賬本的關(guān)鍵概念截粗。
(2)Tendermint具備拜占庭容錯(cuò)能力耀怜,是一種拜占庭容錯(cuò)共識(shí)算法恢着。
(3)Tendermint主要有兩部分組成:
1)Tendermint Core:區(qū)塊鏈共識(shí)引擎,負(fù)責(zé)節(jié)點(diǎn)之間數(shù)據(jù)傳輸以及拜占庭共識(shí)财破。
2)ABCI:區(qū)塊鏈應(yīng)用程序接口(the Application BlockChain Interface ),也是一個(gè)協(xié)議从诲,支持任何語(yǔ)言的交易處理實(shí)現(xiàn)左痢。
總體來(lái)講,Tendermint可以理解為一個(gè)模塊化的區(qū)塊鏈軟件框架系洛,支持開發(fā)者個(gè)性化定制自己的區(qū)塊鏈俊性,而又不需要考慮共識(shí)以及網(wǎng)絡(luò)傳輸?shù)膶?shí)現(xiàn)。

2.2 Tendermint設(shè)計(jì)原則

區(qū)塊鏈?zhǔn)且粋€(gè)具備確定性的狀態(tài)機(jī)描扯,可以在不信任的節(jié)點(diǎn)之間進(jìn)行狀態(tài)復(fù)制定页,包括應(yīng)用的狀態(tài)和改變狀態(tài)的交易。從架構(gòu)的層面上绽诚,區(qū)塊鏈可以簡(jiǎn)單分為三個(gè)概念層:
(1)網(wǎng)絡(luò)層(Networking):負(fù)責(zé)交易和數(shù)據(jù)傳輸和同步典徊。
(2)共識(shí)算法(Consensus):負(fù)責(zé)不同的驗(yàn)證節(jié)點(diǎn)處理完交易后,保證狀態(tài)的一致恩够,也就是將交易打包到區(qū)塊中卒落。
(3)應(yīng)用程序(Application):交易的真正執(zhí)行者。

大致框架如下:

目前大部分的區(qū)塊鏈實(shí)現(xiàn)都是采用上面的框架蜂桶,實(shí)現(xiàn)成單一的程序儡毕,但是這就很容易出現(xiàn)兩個(gè)問(wèn)題:
(1)代碼復(fù)用困難,代碼庫(kù)的分支管理變得復(fù)雜扑媚。
(2)限制了應(yīng)用開發(fā)的語(yǔ)言腰湾。

如何去規(guī)避這兩個(gè)問(wèn)題呢?Tendermint設(shè)計(jì)了自己的一套框架疆股,其設(shè)計(jì)原則是易使用费坊,易理解,高性能押桃,適用于各種分布式應(yīng)用葵萎。它的創(chuàng)新之處在于,將區(qū)塊鏈應(yīng)用(狀態(tài))與底層共識(shí)進(jìn)行了分離唱凯,將共識(shí)引擎和P2P網(wǎng)絡(luò)層封裝組成Tendermint Core羡忘。同時(shí)提供ABCI接口與應(yīng)用層進(jìn)行交互,應(yīng)用邏輯可以用任何語(yǔ)言編寫磕昼,應(yīng)用做的事情實(shí)際上就是狀態(tài)機(jī)控制卷雕。基于這種架構(gòu)票从,應(yīng)用的開發(fā)者可以方便地實(shí)現(xiàn)自己的區(qū)塊鏈漫雕。

Tendermint的框架總體來(lái)講分為ABCI Application以及Tendermint Core兩部分滨嘱,兩者通過(guò)ABCI連接。

3. Tendermint核心模塊

3.1 ABCI Application

開發(fā)者定制開發(fā)的區(qū)塊鏈應(yīng)用浸间,開發(fā)語(yǔ)言不受限制太雨,可以使用任何語(yǔ)言進(jìn)行開發(fā),但是必須實(shí)現(xiàn)為一個(gè)ABCI Server魁蒜,即需要滿足以下幾點(diǎn):

(1)是一個(gè)Socket Server囊扳,需支持TSP或GRPC兩種方式之一。
(2)能夠處理ABCI Message兜看。
所有的ABCI消息類型都是通過(guò)protobuf來(lái)定義的锥咸,具體的消息格式可參考https://github.com/tendermint/abci/blob/master/types/types.proto
(3) 實(shí)現(xiàn)區(qū)塊鏈應(yīng)用接口(ABCI)。
ABCI是Tendermint中定義的一套Application與Tendermint Core之間交互的協(xié)議细移。詳細(xì)定義如下(版本:0.10.3):

ABCI接口可以分為三類:信息查詢搏予、交易校驗(yàn)以及共識(shí)相關(guān)處理。而Tendermint Core作為ABCI Client在啟動(dòng)時(shí)弧轧,會(huì)與ABCI Server建立三個(gè)連接雪侥,分別用于這三類接口消息的處理。

在Tendermint Core與Application交互的所有消息類型中劣针,有3種主要的消息類型:
(1)CheckTx消息用于驗(yàn)證交易校镐。Tendermint Core中的mempool通過(guò)此消息校驗(yàn)交易的合法性,通過(guò)之后才會(huì)將交易廣播給其它節(jié)點(diǎn)捺典。
(2)DeliverTx消息是應(yīng)用的主要工作流程鸟廓,通過(guò)此消息真正執(zhí)行交易,包括驗(yàn)證交易襟己、更新應(yīng)用程序的狀態(tài)引谜。
(3)Commit消息通知應(yīng)用程序計(jì)算當(dāng)前的事件狀態(tài),并存在下一區(qū)塊頭中擎浴。

3.2 Tendermint Core

Tendermint共識(shí)引擎员咽,包含區(qū)塊鏈需要大部分功能實(shí)現(xiàn),主要有:

  • 共識(shí)算法:拜占庭POS算法贮预。
  • P2P:采用gossip算法贝室,默認(rèn)端口是46656。
  • RPC:區(qū)塊鏈對(duì)外接口仿吞,默認(rèn)端口是46657滑频。支持三種訪問(wèn)方式:URI over HTTP、JSONRPC over HTTP唤冈、JSONRPC over websockets峡迷。詳細(xì)的RPC接口定義列表可以參考https://tendermint.github.io/slate
  • 其它:交易緩存池、消息隊(duì)列等。

3.2.1 共識(shí)算法

Tendermint是一個(gè)易于理解的BFT共識(shí)協(xié)議绘搞。協(xié)議遵循一個(gè)簡(jiǎn)單的狀態(tài)機(jī)彤避,如下:

協(xié)議中有兩個(gè)角色:
(1)驗(yàn)證人:協(xié)議中的角色或者節(jié)點(diǎn),不同的驗(yàn)證者在投票過(guò)程中具備不同的權(quán)力(vote power)夯辖。
(2)提議人:由驗(yàn)證人輪流產(chǎn)生琉预。
驗(yàn)證人輪流對(duì)交易的區(qū)塊提議并對(duì)提議的區(qū)塊投票。區(qū)塊被提交到鏈上楼雹,且每個(gè)區(qū)塊就是一個(gè)區(qū)塊高度模孩。但區(qū)塊也有可能提交失敗,這種情況下協(xié)議將選擇下一個(gè)驗(yàn)證人在相同高度上提議一個(gè)新塊贮缅,重新開始投票。

從圖中可以看到介却,成功提交一個(gè)區(qū)塊谴供,必須經(jīng)過(guò)兩階段的投票,稱為pre-vote和pre-commit齿坷。當(dāng)超過(guò) 2/3 的驗(yàn)證人在同一輪提議中對(duì)同一個(gè)塊進(jìn)行了pre-commit投票桂肌,那么這個(gè)區(qū)塊才會(huì)被提交。

由于離線或者網(wǎng)絡(luò)延遲等原因永淌,可能造成提議人提議區(qū)塊失敗崎场。這種情況在Tendermint中也是允許的,因?yàn)轵?yàn)證人會(huì)在進(jìn)入下一輪提議之前等待一定時(shí)間遂蛀,用于接收提議人提議的區(qū)塊谭跨。

假設(shè)少于三分之一的驗(yàn)證人是拜占庭節(jié)點(diǎn),Tendermint能夠保證驗(yàn)證人永遠(yuǎn)不會(huì)在同一高度重復(fù)提交區(qū)塊而造成沖突李滴。為了做到這一點(diǎn)螃宙,Tendermint 引入了鎖定機(jī)制,一旦驗(yàn)證人預(yù)投票了一個(gè)區(qū)塊所坯,那么該驗(yàn)證人就會(huì)被鎖定在這個(gè)區(qū)塊谆扎。然后:
(1)該驗(yàn)證人必須在預(yù)提交的區(qū)塊進(jìn)行預(yù)投票。
(2)當(dāng)前一輪預(yù)提議和預(yù)投票沒成功提交區(qū)塊時(shí)芹助,該驗(yàn)證人就會(huì)被解鎖堂湖,然后進(jìn)行對(duì)新塊的下一輪預(yù)提交。

可以看到状土,Tendermint共識(shí)算法和PBFT時(shí)非常相似的无蜂,可以說(shuō)是PBFT的變種,那我們來(lái)比較一下:

(1)相同點(diǎn):
1)同屬BFT體系声诸。
2)抗1/3拜占庭節(jié)點(diǎn)攻擊酱讶。
3)三階段提交,第一階段廣播交易(區(qū)塊)彼乌,后兩階段廣播簽名(確認(rèn))泻肯。
4)兩者都需要達(dá)到法定人數(shù)才能提交塊渊迁。

(2)不同點(diǎn):
1)Tendermint與PBFT的區(qū)別主要是在超過(guò)1/3節(jié)點(diǎn)為拜占庭節(jié)點(diǎn)的情況下。
當(dāng)拜占庭節(jié)點(diǎn)數(shù)量在驗(yàn)證者數(shù)量的1/3和2/3之間時(shí)灶挟,PBFT算法無(wú)法提供保證琉朽,使得攻擊者可以將任意結(jié)果返回給客戶端。而Tendermint共識(shí)模型認(rèn)為必須超過(guò)2/3數(shù)量的precommit確認(rèn)才能提交塊稚铣。舉個(gè)例子箱叁,如果1/2的驗(yàn)證者是拜占庭節(jié)點(diǎn),Tendermint中這些拜占庭節(jié)點(diǎn)能夠阻止區(qū)塊的提交惕医,但他們自己也無(wú)法提交惡意塊耕漱。而在PBFT中拜占庭節(jié)點(diǎn)卻是可以提交塊給客戶端。
簡(jiǎn)單的說(shuō)抬伺,就是比特幣的網(wǎng)絡(luò)存在分叉的可能螟够,而Tendermint不會(huì)發(fā)生這種情況。
2)另一個(gè)不同點(diǎn)在于拜占庭節(jié)點(diǎn)概念不同峡钓,PBFT指的是節(jié)點(diǎn)數(shù)妓笙,而Tendermint代表的是節(jié)點(diǎn)的權(quán)益數(shù),也就是投票權(quán)力能岩。
3)最后一點(diǎn)寞宫,PBFT需要預(yù)設(shè)一組固定的驗(yàn)證人,而Tendermint是通過(guò)要求超過(guò)2/3法定人數(shù)的驗(yàn)證人員批準(zhǔn)會(huì)員變更拉鹃,從而支持驗(yàn)證人的動(dòng)態(tài)變化辈赋。

鎖機(jī)制詳解
舉個(gè)例子,有四個(gè)validator 節(jié)點(diǎn)毛俏,A,B,C,D, 在某個(gè)R輪炭庙,在propose階段,
(1)proposer節(jié)點(diǎn)廣播出了新塊blockX煌寇;
(2)A的超時(shí)時(shí)間內(nèi)沒有收到這個(gè)新塊焕蹄,向外廣播pre-vote nil,B,C,D都收到了阀溶,向外廣播pre-vote投給blockX腻脏;
(3)現(xiàn)在四個(gè)節(jié)點(diǎn)進(jìn)入了pre-commit階段,A處于紅色內(nèi)圈银锻,B,C,D處于藍(lán)色外圈永品;
(4)假設(shè)A由于自身網(wǎng)絡(luò)不好,又沒有在規(guī)定時(shí)間內(nèi)收到超過(guò)2/3個(gè)對(duì)blockX的投票击纬,于是只能發(fā)出 pre-commit nil投票消息投給空塊
(5)D收到了B和C的pre-vote消息鼎姐,加上自己的,就超過(guò)了2/3了,于是D在本機(jī)區(qū)塊鏈里commit了blockX
(6)假設(shè)此時(shí)B和C網(wǎng)絡(luò)出現(xiàn)問(wèn)題炕桨,收不到D在pre-commit消息饭尝,這是B和C只能看到2票投給了blockX,一票投給了空塊献宫,全部不足2/3钥平,于是B和C都只能 commit空塊,高度不變姊途,進(jìn)人R+1輪涉瘾,A也只能看到2票投給了blockX,一票投給了空塊捷兰,也只能commit空塊立叛,高度不變,進(jìn)人R+1輪贡茅;
(7)在R+1輪囚巴,由于新?lián)Q了一個(gè)proposer, 提議了新的區(qū)塊blockY,A,B,C 三個(gè)個(gè)可能會(huì)在達(dá)成共識(shí)友扰,提交blockY,于是在同樣的高度庶柿,就有blockX和blockY兩個(gè)塊村怪,產(chǎn)生了分叉?其實(shí)浮庐,Tendermint加上了鎖的機(jī)制落竹,具體就是袜匿,在第7步,即使proposer出了新塊blockY,A,B,C只能被鎖定在第6步他們的pre-commit塊上恶阴,即A在第6步投給了空塊,那么在第R+1輪助泽,只能繼續(xù)投給空塊熬北,B在第6步投給了blockX,那么在新一輪璧坟,永遠(yuǎn)只能投給blockX既穆,C也是類似。這樣在R+1輪雀鹃,就會(huì)有1票投給空塊幻工,兩票投給blockX,最終達(dá)成共識(shí)blockX黎茎,A,B,C三人都會(huì)commit blockX囊颅,與D一致,沒有產(chǎn)生沖突。

3.2.2 P2P網(wǎng)絡(luò)

Tendermint的P2P網(wǎng)絡(luò)協(xié)議借鑒了比特幣的對(duì)等發(fā)現(xiàn)協(xié)議踢代,更準(zhǔn)確地說(shuō)盲憎,Tendermint是采用了BTCD的P2P地址簿(Address Book)機(jī)制。當(dāng)連接建立后奸鬓,新節(jié)點(diǎn)將自身的Address信息(包含IP焙畔、Port、ID等)發(fā)送給相鄰節(jié)點(diǎn)串远,相鄰節(jié)點(diǎn)接收到信息后加入到自己的地址薄宏多,再將此條Address信息,轉(zhuǎn)播給它的相鄰節(jié)點(diǎn)澡罚。

此外為了保證節(jié)點(diǎn)之間數(shù)據(jù)傳輸?shù)陌踩陨斓琓endermint采用了基于Station-to-Station協(xié)議的認(rèn)證加密方案,此協(xié)議是一種密鑰協(xié)商方案留搔,基于經(jīng)典的DH算法更胖,并提供相互密鑰和實(shí)體認(rèn)證。大致的流程如下:

(1)每一個(gè)節(jié)點(diǎn)都必須生成一對(duì)ED25519密鑰對(duì)作為自己的ID隔显。
(2)當(dāng)兩個(gè)節(jié)點(diǎn)建立起TCP連接時(shí)却妨,兩者都會(huì)生成一個(gè)臨時(shí)的ED25519密鑰對(duì),并把臨時(shí)公鑰發(fā)給對(duì)方括眠。
(3)兩個(gè)節(jié)點(diǎn)分別將自己的私鑰和對(duì)方的臨時(shí)公鑰相乘彪标,得到共享密鑰。這個(gè)共享密鑰對(duì)稱加密密鑰掷豺。
(4)將兩個(gè)臨時(shí)公鑰以一定規(guī)則進(jìn)行排序捞烟,并將兩個(gè)臨時(shí)公鑰拼接起來(lái)后使用Ripemd160進(jìn)行哈希處理,后面填充4個(gè)0当船,這樣可以得到一個(gè)24字節(jié)的隨機(jī)數(shù)题画。
(5)得到的隨機(jī)數(shù)作為加密種子,但為了保證相同的隨機(jī)數(shù)不會(huì)被相同的私鑰使用兩次德频,我們將隨機(jī)數(shù)最后一個(gè)bit置為1苍息,這樣就得到了兩個(gè)隨機(jī)數(shù),同時(shí)約定排序更高的公鑰使用反轉(zhuǎn)過(guò)的隨機(jī)數(shù)來(lái)加密自己的消息抱婉,而另外一個(gè)用于解密對(duì)方節(jié)點(diǎn)的消息档叔。
(6)使用排序的臨時(shí)公鑰拼接起來(lái),并進(jìn)行SHA256哈希蒸绩,得到一個(gè)挑戰(zhàn)碼衙四。
(7)每個(gè)節(jié)點(diǎn)都使用自己的私鑰對(duì)挑戰(zhàn)碼進(jìn)行簽名,并將自己的公鑰和簽名發(fā)給其它節(jié)點(diǎn)校驗(yàn)患亿。
(8)校驗(yàn)通過(guò)之后传蹈,雙方的認(rèn)證就驗(yàn)證成功了押逼。后續(xù)的通信就使用共享密鑰和隨機(jī)數(shù)進(jìn)行加密,保護(hù)數(shù)據(jù)的安全惦界。

3.3 應(yīng)用示例

Tendermint官方項(xiàng)目里內(nèi)置了ABCI Application的兩個(gè)簡(jiǎn)單實(shí)現(xiàn)counter以及kvstore挑格。這個(gè)兩個(gè)Demo邏輯非常簡(jiǎn)單,運(yùn)行起來(lái)也非常簡(jiǎn)單沾歪,以kvstore為例漂彤,只需要下面三條簡(jiǎn)單的指令就可以輕松的跑起來(lái):

tendermint init

abci-cli kvstore

tendermint node

復(fù)雜一點(diǎn),假設(shè)想使用Tendermint實(shí)現(xiàn)一套類似Ethereum的應(yīng)用灾搏,最終應(yīng)該是這樣:

由Tendermint Core負(fù)責(zé)交易和區(qū)塊的共享以及共識(shí)處理挫望,開發(fā)者只需將go-ethereum和ABCI Server集成一個(gè)ABCI應(yīng)用。Ethermint項(xiàng)目就是Tendermint團(tuán)隊(duì)開發(fā)的一個(gè)類似應(yīng)用狂窑,大家可以參考媳板,遺憾的是目前Ethermint目前只支持低版本的abci和go-ethereum。

4. Tendermint工作流程

上圖簡(jiǎn)單描述了Tenermint的工作流泉哈。大致為:
(1)client通過(guò)RPC接口broadcast_tx_commit提交交易蛉幸;
(2)mempool調(diào)用ABCI接口CheckTx用于校驗(yàn)交易的有效性,比如交易序號(hào)丛晦、發(fā)送者余額等奕纫,同時(shí)訂閱交易執(zhí)行后的事件并等待監(jiān)聽。
(3)共識(shí)從mempool中獲取交易開始共識(shí)排序烫沙,打包區(qū)塊若锁,確定之后依次調(diào)用ABCI相關(guān)接口更新當(dāng)前的事件狀態(tài),并觸發(fā)事件斧吐。
(4)最終將交易信息返回client。

5. 參考

本文轉(zhuǎn)載自《深度解析Tendermint仲器,快速融入Cosmos生態(tài)》煤率。

更多Tendermint資料參考:
(1)拜占庭共識(shí)Tendermint介紹及簡(jiǎn)單入門
https://blog.csdn.net/niyuelin1990/article/details/80537329
(2)Tendermint 說(shuō)明文檔
https://tendermint.readthedocs.io/en/master/
(3)Tendermint GIT地址
https://github.com/tendermint/tendermint
(4)深度解析Tendermint,快速融入Cosmos生態(tài)[質(zhì)量高]
https://zhuanlan.zhihu.com/p/38252058
(5)區(qū)塊鏈框架 Tendermint 入門教程
https://hbliu.coding.me/2018/04/02/tendermint-introduction-1/
(6)詳解Tendermint共識(shí)算法
https://www.odaily.com/post/5134145
(7)分布式一致性協(xié)議介紹(Paxos乏冀、Raft)
https://www.cnblogs.com/zhang-qc/p/8688258.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝶糯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辆沦,更是在濱河造成了極大的恐慌昼捍,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肢扯,死亡現(xiàn)場(chǎng)離奇詭異妒茬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蔚晨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門乍钻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肛循,“玉大人,你說(shuō)我怎么就攤上這事银择《嗫罚” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵浩考,是天一觀的道長(zhǎng)夹孔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)析孽,這世上最難降的妖魔是什么搭伤? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮绿淋,結(jié)果婚禮上闷畸,老公的妹妹穿的比我還像新娘。我一直安慰自己吞滞,他們只是感情好佑菩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裁赠,像睡著了一般殿漠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佩捞,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天绞幌,我揣著相機(jī)與錄音,去河邊找鬼一忱。 笑死莲蜘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帘营。 我是一名探鬼主播票渠,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芬迄!你這毒婦竟也來(lái)了问顷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤禀梳,失蹤者是張志新(化名)和其女友劉穎杜窄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體算途,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塞耕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘴瓤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荷科。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唯咬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畏浆,到底是詐尸還是另有隱情胆胰,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布刻获,位于F島的核電站蜀涨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝎毡。R本人自食惡果不足惜厚柳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沐兵。 院中可真熱鬧别垮,春花似錦、人聲如沸扎谎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毁靶。三九已至胧奔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間预吆,已是汗流浹背龙填。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拐叉,地道東北人岩遗。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凤瘦,于是被迫代替她去往敵國(guó)和親喘先。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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