轉(zhuǎn)載:以太坊聯(lián)盟鏈quorum搭建(一)

原文鏈接:https://blog.csdn.net/zhj_fly/article/details/80560744

關(guān)于quorum的介紹可以看一些這幾篇文章:

https://blog.csdn.net/about_blockchain/article/details/78684901

https://blog.csdn.net/about_blockchain/article/details/78750686

https://blog.csdn.net/about_blockchain/article/details/78814873

本文參考官網(wǎng)教程:https://github.com/jpmorganchase/quorum-examples/tree/master/examples/7nodes

官網(wǎng)教程中創(chuàng)建了7個(gè)節(jié)點(diǎn)罕模,由這7個(gè)節(jié)點(diǎn)來(lái)模擬聯(lián)盟鏈網(wǎng)絡(luò)窖铡。

作為聯(lián)盟鏈,節(jié)點(diǎn)接入是有權(quán)限要求的仰楚,通過(guò)permissioned-nodes.json文件和permissioned參數(shù)來(lái)控制哪些節(jié)點(diǎn)可以和本節(jié)點(diǎn)建立連接岔霸,后面會(huì)詳解薛躬。對(duì)原來(lái)教程中有些比較省略,本文會(huì)將一些省略的地方介紹呆细。

一型宝、下載資源

1八匠、首先安裝quorum

git?clone?--recursive https://github.com/jpmorganchase/quorum.git

cd quorum

make all

編譯完后,quorum/build/bin目錄下會(huì)生成如下文件列表

abigen bootnode evm examples faucet geth p2psim puppeth rlpdump swarm wnode

將上面這些加入系統(tǒng)path中趴酣。

2梨树、獲取costellation-node可執(zhí)行文件

https://github.com/jpmorganchase/constellation/releases

下載下來(lái)后解壓,得到constellation-node岖寞,加入系統(tǒng)PATH中抡四。

3、下載教程樣例:

git clone https://github.com/jpmorganchase/quorum-examples

二仗谆、搭建raft共識(shí)的聯(lián)盟鏈

因?yàn)槁?lián)盟間一般是存在信任關(guān)系指巡,因此可以使用raft共識(shí)算法,這個(gè)算法可以容忍節(jié)點(diǎn)掛掉隶垮,但不能容忍拜占庭錯(cuò)誤藻雪,即不能存在惡意節(jié)點(diǎn)。這樣就不用以太坊中的pow算法了狸吞,節(jié)省cup勉耀、內(nèi)存,而且出塊時(shí)間塊蹋偏。另外便斥,這個(gè)算法中不會(huì)存在空塊,節(jié)省大量空間威始,如果沒有交易枢纠,那么生成區(qū)塊就暫停。

1字逗、初始化京郑,創(chuàng)建7個(gè)節(jié)點(diǎn),其中1-4號(hào)節(jié)點(diǎn)是permissioned節(jié)點(diǎn)葫掉,即這些節(jié)點(diǎn)只允許和permissioned-nodes.json中的節(jié)點(diǎn)建立連接,其他節(jié)點(diǎn)無(wú)法連接到這個(gè)節(jié)點(diǎn)跟狱。初始化的腳本如下:

raft-init.sh

#!/bin/bash

set -u

set -e

echo"[*] Cleaning up temporary data directories"

rm -rf qdata

mkdir -p qdata/logs

echo"[*] Configuring node 1 (permissioned)"

mkdir -p qdata/dd1/{keystore,geth}

cp permissioned-nodes.json qdata/dd1/static-nodes.json

cp permissioned-nodes.json qdata/dd1/

cp keys/key1 qdata/dd1/keystore

cp raft/nodekey1 qdata/dd1/geth/nodekey

geth --datadir qdata/dd1 init genesis.json

echo"[*] Configuring node 2 (permissioned)"

mkdir -p qdata/dd2/{keystore,geth}

cp permissioned-nodes.json qdata/dd2/static-nodes.json

cp permissioned-nodes.json qdata/dd2/

cp keys/key2 qdata/dd2/keystore

cp raft/nodekey2 qdata/dd2/geth/nodekey

geth --datadir qdata/dd2 init genesis.json

echo"[*] Configuring node 3 (permissioned)"

mkdir -p qdata/dd3/{keystore,geth}

cp permissioned-nodes.json qdata/dd3/static-nodes.json

cp permissioned-nodes.json qdata/dd3/

cp keys/key6 qdata/dd3/keystore

cp keys/key3 qdata/dd3/keystore

cp raft/nodekey3 qdata/dd3/geth/nodekey

geth --datadir qdata/dd3 init genesis.json

echo"[*] Configuring node 4 (permissioned)"

mkdir -p qdata/dd4/{keystore,geth}

cp permissioned-nodes.json qdata/dd4/static-nodes.json

cp permissioned-nodes.json qdata/dd4/

cp keys/key4 qdata/dd4/keystore

cp raft/nodekey4 qdata/dd4/geth/nodekey

geth --datadir qdata/dd4 init genesis.json

echo"[*] Configuring node 5"

mkdir -p qdata/dd5/{keystore,geth}

cp permissioned-nodes.json qdata/dd5/static-nodes.json

cp keys/key5 qdata/dd5/keystore

cp raft/nodekey5 qdata/dd5/geth/nodekey

geth --datadir qdata/dd5 init genesis.json

echo"[*] Configuring node 6"

mkdir -p qdata/dd6/{keystore,geth}

cp permissioned-nodes.json qdata/dd6/static-nodes.json

cp raft/nodekey6 qdata/dd6/geth/nodekey

cp keys/key7 qdata/dd6/keystore

geth --datadir qdata/dd6 init genesis.json

echo"[*] Configuring node 7"

mkdir -p qdata/dd7/{keystore,geth}

cp permissioned-nodes.json qdata/dd7/static-nodes.json

cp raft/nodekey7 qdata/dd7/geth/nodekey

cp keys/key8 qdata/dd7/keystore

geth --datadir qdata/dd7 init genesis.json

以第一個(gè)節(jié)點(diǎn)的配置為例解釋命令:

第一行:創(chuàng)建節(jié)點(diǎn)1的目錄

第二行:permissioned-nodes.json中存了已經(jīng)設(shè)置好的enode值俭厚,即節(jié)點(diǎn)的地址,通過(guò)這個(gè)值驶臊,運(yùn)行g(shù)eth客戶端時(shí)可以將不同的節(jié)點(diǎn)連接起來(lái)挪挤。與普通以太坊的geth客戶端不同,這里需要一個(gè)static-nodes关翎,應(yīng)該是指定和哪些節(jié)點(diǎn)建立連接吧扛门。如果啟動(dòng)geth時(shí)不指定--permissioned,啟動(dòng)后本節(jié)點(diǎn)就會(huì)尋找static-node里面的節(jié)點(diǎn)建立連接纵寝。

另外论寨,這個(gè)enode的值是與nodekey相關(guān)的,就是第五行中的nodekey文件,兩者應(yīng)該是一一對(duì)應(yīng)的葬凳。所以第五行中將nodekey復(fù)制到這個(gè)目錄中绰垂,就相當(dāng)于把一個(gè)節(jié)點(diǎn)的唯一標(biāo)識(shí)復(fù)制過(guò)去。nodekey的生成方法:運(yùn)行bootnode -genkey nodekey即可生成nodekey文件火焰,再運(yùn)行bootnode -nodekey nodekey就會(huì)輸出本節(jié)點(diǎn)的enode信息劲装,記錄下來(lái)即可。

第三行:將permissioned-node.json復(fù)制到節(jié)點(diǎn)1的目錄下昌简,這里面記錄了哪些節(jié)點(diǎn)可以與本節(jié)點(diǎn)建立連接占业,不在這個(gè)列表里的節(jié)點(diǎn)是不能和本節(jié)點(diǎn)連接的。

第四行:將一個(gè)賬戶文件復(fù)制到節(jié)點(diǎn)1下的目錄纯赎,啟動(dòng)geth后谦疾,用eth.accounts查賬戶,就會(huì)顯示這個(gè)文件中的賬戶地址址否。

第五行:將nodekey復(fù)制到節(jié)點(diǎn)1目錄下餐蔬,它作用如上面所述。

第六行:根據(jù)創(chuàng)世區(qū)塊信息genesis.json初始化區(qū)塊鏈佑附。

2樊诺、啟動(dòng)constellation和geth節(jié)點(diǎn)

(1)constellation:可以將其看成是分布式密鑰服務(wù)器、PGP加密和郵件傳輸代理的合并音同,用它來(lái)實(shí)現(xiàn)quorum的私有機(jī)制词爬。

使用方法:生成密鑰constellation-node --generatekeys node,就會(huì)生成node.pub和node.key兩個(gè)密鑰文件权均,分別是公私鑰文件顿膨。如果在生成是使用密碼加密,那么在啟動(dòng)contellation-node時(shí)是需要輸入密碼的叽赊,為了方便恋沃,下面的方法中不輸入密碼。

下面來(lái)看啟動(dòng)節(jié)點(diǎn)的constellation-start.sh腳本:

#!/bin/bash

set -u

set -e

foriin{1..7}

do

DDIR="qdata/c$i"

? ? mkdir -p $DDIR

? ? mkdir -p qdata/logs

cp"keys/tm$i.pub""$DDIR/tm.pub"

cp"keys/tm$i.key""$DDIR/tm.key"

rm -f"$DDIR/tm.ipc"

CMD="constellation-node --url=https://127.0.0.$i:900$i/ --port=900$i --workdir=$DDIR --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/"

echo"$CMD >> qdata/logs/constellation$i.log 2>&1 &"

$CMD >>"qdata/logs/constellation$i.log"2>&1&

done

DOWN=true

while$DOWN;do

sleep0.1

DOWN=false

foriin{1..7}

do

if[ ! -S"qdata/c$i/tm.ipc"]; then

DOWN=true

fi

? ? done

done

其中必指,

第五行是代表一共啟動(dòng)7個(gè)節(jié)點(diǎn)囊咏,需要在不同的節(jié)點(diǎn)目錄

第7-9行:建立節(jié)點(diǎn)目錄

第10-11行:將之前生成的公私鑰對(duì)放到對(duì)應(yīng)幾點(diǎn)目錄中

第12行:刪除之前存在的舊的 .ipc文件(如果存在的話)

第13行:?jiǎn)?dòng)constellation-node節(jié)點(diǎn),具體參數(shù)參考https://github.com/jpmorganchase/constellation/blob/master/sample.conf

第15行:將控制臺(tái)的輸出定向到指定文件里塔橡,如果啟動(dòng)錯(cuò)誤梅割,可以去對(duì)應(yīng)文件查看錯(cuò)誤內(nèi)容

第18-28行:等待所有constellation-node啟動(dòng)完畢,其中24行 -S 是查看對(duì)應(yīng)文件是否存在葛家。

可以運(yùn)行./constellation-start.sh來(lái)啟動(dòng)測(cè)試啦逆,啟動(dòng)完畢后輸入ps -ef | grep constellation-node可以查看進(jìn)程情況忿墅,輸入killall constellation-node 來(lái)終止程序運(yùn)行。

(2)下面來(lái)啟動(dòng)7個(gè)geth節(jié)點(diǎn)

raft-start.sh

#!/bin/bash

set -u

set -e

mkdir -p qdata/logs

echo"[*] Starting Constellation nodes"

./constellation-start.sh

echo"[*] Starting Ethereum nodes"

set -v

ARGS="--nodiscover --raft --rpc --rpcaddr 0.0.0.0 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints"

PRIVATE_CONFIG=qdata/c1/tm.ipc nohup geth --datadir qdata/dd1 $ARGS --permissioned --raftport50401--rpcport22000--port21000--unlock0--password passwords.txt2>>qdata/logs/1.log &

PRIVATE_CONFIG=qdata/c2/tm.ipc nohup geth --datadir qdata/dd2 $ARGS --permissioned --raftport50402--rpcport22001--port21001--unlock0--password passwords.txt2>>qdata/logs/2.log &

PRIVATE_CONFIG=qdata/c3/tm.ipc nohup geth --datadir qdata/dd3 $ARGS --permissioned --raftport50403--rpcport22002--port21002--unlock0--password passwords.txt2>>qdata/logs/3.log &

PRIVATE_CONFIG=qdata/c4/tm.ipc nohup geth --datadir qdata/dd4 $ARGS --permissioned --raftport50404--rpcport22003--port21003--unlock0--password passwords.txt2>>qdata/logs/4.log &

PRIVATE_CONFIG=qdata/c5/tm.ipc nohup geth --datadir qdata/dd5 $ARGS --raftport50405--rpcport22004--port21004--unlock0--password passwords.txt2>>qdata/logs/5.log &

PRIVATE_CONFIG=qdata/c6/tm.ipc nohup geth --datadir qdata/dd6 $ARGS --raftport50406--rpcport22005--port21005--unlock0--password passwords.txt2>>qdata/logs/6.log &

PRIVATE_CONFIG=qdata/c7/tm.ipc nohup geth --datadir qdata/dd7 $ARGS --raftport50407--rpcport22006--port21006--unlock0--password passwords.txt2>>qdata/logs/7.log &

set +v

echo

echo"All nodes configured. See 'qdata/logs' for logs, and run e.g. 'geth attach qdata/dd1/geth.ipc' to attach to the first Geth node."

echo"To test sending a private transaction from Node 1 to Node 7, run './runscript.sh private-contract.js'"

其中

第7行:調(diào)用上面寫的constellation-start.sh腳本麦撵,啟動(dòng)7個(gè)constellation

第11行:?jiǎn)?dòng)geth節(jié)點(diǎn)需要的參數(shù),這里需要制定--raft來(lái)使用raft共識(shí)方法

第12-18行,啟動(dòng)7個(gè)geth節(jié)點(diǎn),需要指定raftport端口號(hào),用 --permissioned參數(shù)來(lái)指定那些節(jié)點(diǎn)是有連接權(quán)限的喇澡。

這樣,constellation-node和geth節(jié)點(diǎn)都啟動(dòng)起來(lái)了殊校,也就是環(huán)境已經(jīng)搭建好了晴玖,可以在上面開發(fā)了。開發(fā)之前先做一下測(cè)試为流。

3呕屎、測(cè)試環(huán)境

zhj@zhj-HP:~/project/test_chain/quorum/quorum-examples/examples/7nodes$ ps -ef | grep constellation-node

zhj171502994409:23pts/300:00:03constellation-node --url=https://127.0.0.1:9001/ --port=9001 --workdir=qdata/c1 --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/

zhj171742994309:23pts/300:00:02constellation-node --url=https://127.0.0.2:9002/ --port=9002 --workdir=qdata/c2 --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/

zhj172002994309:23pts/300:00:02constellation-node --url=https://127.0.0.3:9003/ --port=9003 --workdir=qdata/c3 --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/

zhj172182994309:23pts/300:00:03constellation-node --url=https://127.0.0.4:9004/ --port=9004 --workdir=qdata/c4 --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/

zhj172262994309:23pts/300:00:03constellation-node --url=https://127.0.0.5:9005/ --port=9005 --workdir=qdata/c5 --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/

zhj172652994409:23pts/300:00:03constellation-node --url=https://127.0.0.6:9006/ --port=9006 --workdir=qdata/c6 --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/

zhj172822994309:23pts/300:00:03constellation-node --url=https://127.0.0.7:9007/ --port=9007 --workdir=qdata/c7 --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/

zhj1769011030009:24pts/600:00:00grep --color=auto constellation-node

zhj@zhj-HP:~/project/test_chain/quorum/quorum-examples/examples/7nodes$ ps -ef |grep geth

zhj173542994109:23pts/300:00:05geth --datadir qdata/dd1 --nodiscover --raft --rpc --rpcaddr0.0.0.0--rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints --permissioned --raftport50401--rpcport22000--port21000--unlock0--password passwords.txt

zhj173552994109:23pts/300:00:05geth --datadir qdata/dd2 --nodiscover --raft --rpc --rpcaddr0.0.0.0--rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints --permissioned --raftport50402--rpcport22001--port21001--unlock0--password passwords.txt

zhj173562994209:23pts/300:00:08geth --datadir qdata/dd3 --nodiscover --raft --rpc --rpcaddr0.0.0.0--rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints --permissioned --raftport50403--rpcport22002--port21002--unlock0--password passwords.txt

zhj173572994109:23pts/300:00:05geth --datadir qdata/dd4 --nodiscover --raft --rpc --rpcaddr0.0.0.0--rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints --permissioned --raftport50404--rpcport22003--port21003--unlock0--password passwords.txt

zhj173582994109:23pts/300:00:05geth --datadir qdata/dd5 --nodiscover --raft --rpc --rpcaddr0.0.0.0--rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints --raftport50405--rpcport22004--port21004--unlock0--password passwords.txt

zhj173592994109:23pts/300:00:04geth --datadir qdata/dd6 --nodiscover --raft --rpc --rpcaddr0.0.0.0--rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints --raftport50406--rpcport22005--port21005--unlock0--password passwords.txt

zhj173602994109:23pts/300:00:04geth --datadir qdata/dd7 --nodiscover --raft --rpc --rpcaddr0.0.0.0--rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints --raftport50407--rpcport22006--port21006--unlock0--password passwords.txt

zhj1794611030009:29pts/600:00:00grep --color=auto geth

說(shuō)明節(jié)點(diǎn)都已正常運(yùn)行,下面連接第一個(gè)節(jié)點(diǎn)的geth控制臺(tái):

輸入geth attach qdata/dd1/geth.ipc敬察,查看基本信息:

zhj@zhj-HP:~/project/test_chain/quorum/quorum-examples/examples/7nodes$ geth attach qdata/dd1/geth.ipc

Welcome to the Geth JavaScriptconsole!

instance: Geth/v1.7.2-stable-fd0e3b9d/linux-amd64/go1.10.1

coinbase:0xed9d02e382b34818e88b88a309c7fe71e65f419d

at block:0(Thu,01Jan197008:00:00CST)

datadir:/home/zhj/project/test_chain/quorum/quorum-examples/examples/7nodes/qdata/dd1

modules: admin:1.0debug:1.0eth:1.0miner:1.0net:1.0personal:1.0raft:1.0rpc:1.0txpool:1.0web3:1.0

> eth.accounts

["0xed9d02e382b34818e88b88a309c7fe71e65f419d"]

> acc0 = eth.accounts[0]

"0xed9d02e382b34818e88b88a309c7fe71e65f419d"

> eth.getBalance(acc0)

1e+27

> eth.blockNumber

0

可以看到有一個(gè)賬戶地址秀睛,就是復(fù)制進(jìn)去的賬戶,里面有余額(在創(chuàng)世文件里設(shè)置的)莲祸,現(xiàn)在的區(qū)塊數(shù)目是0蹂安,現(xiàn)在沒有交易,是不產(chǎn)生區(qū)塊的锐帜,下面進(jìn)行發(fā)送一筆交易田盈。

連接第7個(gè)節(jié)點(diǎn)的geth控制臺(tái),查看賬戶和余額:

zhj@zhj-HP:~/project/test_chain/quorum/quorum-examples/examples/7nodes$ geth attach qdata/dd7/geth.ipc

Welcome to the Geth JavaScriptconsole!

instance: Geth/v1.7.2-stable-fd0e3b9d/linux-amd64/go1.10.1

coinbase:0xa9e871f88cbeb870d32d88e4221dcfbd36dd635a

at block:0(Thu,01Jan197008:00:00CST)

datadir:/home/zhj/project/test_chain/quorum/quorum-examples/examples/7nodes/qdata/dd7

modules: admin:1.0debug:1.0eth:1.0miner:1.0net:1.0personal:1.0raft:1.0rpc:1.0txpool:1.0web3:1.0

> eth.accounts

["0xa9e871f88cbeb870d32d88e4221dcfbd36dd635a"]

> acc0 =eth.accounts[0]

"0xa9e871f88cbeb870d32d88e4221dcfbd36dd635a"

> eth.getBalance(acc0)

0

然后從節(jié)點(diǎn)1的賬戶發(fā)送一筆錢到節(jié)點(diǎn)7的賬戶:

> eth.sendTransaction({from:acc0,to:"0xa9e871f88cbeb870d32d88e4221dcfbd36dd635a",value:100000})

"0xa0da7ef1632361e7b4d37f5258598bce0bbb074935c613c7e565a2c93964807f"

這時(shí)查看賬戶7的余額:

> eth.getBalance(acc0)

100000

再查看區(qū)塊數(shù)目:

> eth.blockNumber

1

可以看到因?yàn)檫@筆交易已經(jīng)生成了一個(gè)區(qū)塊缴阎。

如果要發(fā)送一筆私有交易允瞧,可以用privateFor來(lái)指定,例如節(jié)點(diǎn)1賬戶發(fā)送一筆私有交易給節(jié)點(diǎn)2的賬戶:

>eth.sendTransaction({from: acc0,to: acc1,value:10000,privateFor:["QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]})

"0x241c0d71035cce2891e82a883d010bbf0151e79fc3aace8966a626cf0598e7ff"

其中acc0是節(jié)點(diǎn)1的賬戶蛮拔,acc1是節(jié)點(diǎn)2的賬戶述暂,privateFor后面的地址是tm2.pub中的內(nèi)容,返回的交易的地址,下面查看這筆交易:

> eth.getTransaction("0x241c0d71035cce2891e82a883d010bbf0151e79fc3aace8966a626cf0598e7ff")

{

blockHash:"0x6e74d807e1951e168489e54b23dd39f367f62312b1463a160c8730ad360f48bf",

blockNumber:1,

from:"0xed9d02e382b34818e88b88a309c7fe71e65f419d",

gas:90000,

gasPrice:18000000000,

hash:"0x241c0d71035cce2891e82a883d010bbf0151e79fc3aace8966a626cf0598e7ff",

input:"0x33e358398b2bc693db176718211e9a80b2d2cf58df79e7a760c9b68baa2f41d95a5bec625b3f3eb3b0bb996afb6692e8187164fed745ebd726abd74455895d90",

nonce:0,

r:"0xfa734439ccc3f8d54f22a012703d951a0891c2914b1361967e3f755466f778b6",

s:"0x79ba2235b3d049e3132a32e4bac3d6023f3c460875d098a61c6c829d3c65af7f",

to:"0xca843569e3427144cead5e4d5999a3d0ccf92b8e",

transactionIndex:0,

v:"0x25",

value:100000

}

其中倒數(shù)第二行的v字段值是0x25建炫,即37畦韭。當(dāng)值為37、 38時(shí)代表是一筆私有交易肛跌。

(7.13補(bǔ)充:我又試了一下廊驼,現(xiàn)在quorum還不支持私有交易發(fā)送以太幣,上面這筆私有交易可以成功發(fā)送并被記錄在區(qū)塊里惋砂,但是查一下雙方的余額時(shí),發(fā)現(xiàn)都沒有改變绳锅。github上開發(fā)者是這么說(shuō)的:鏈接西饵。但是私有合約可以正常執(zhí)行,下一篇文章中有具體介紹)

本篇到此結(jié)束鳞芙,下一篇文章介紹在quorum上部署和執(zhí)行智能合約眷柔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末期虾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驯嘱,更是在濱河造成了極大的恐慌镶苞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞠评,死亡現(xiàn)場(chǎng)離奇詭異茂蚓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剃幌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門聋涨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人负乡,你說(shuō)我怎么就攤上這事牍白。” “怎么了抖棘?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵茂腥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我切省,道長(zhǎng)最岗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任数尿,我火速辦了婚禮仑性,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘右蹦。我一直安慰自己诊杆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布何陆。 她就那樣靜靜地躺著晨汹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贷盲。 梳的紋絲不亂的頭發(fā)上淘这,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音巩剖,去河邊找鬼铝穷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛佳魔,可吹牛的內(nèi)容都是我干的曙聂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鞠鲜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宁脊!你這毒婦竟也來(lái)了断国?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤榆苞,失蹤者是張志新(化名)和其女友劉穎稳衬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坐漏,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薄疚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仙畦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片输涕。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慨畸,靈堂內(nèi)的尸體忽然破棺而出莱坎,到底是詐尸還是另有隱情,我是刑警寧澤寸士,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布檐什,位于F島的核電站,受9級(jí)特大地震影響弱卡,放射性物質(zhì)發(fā)生泄漏乃正。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一婶博、第九天 我趴在偏房一處隱蔽的房頂上張望瓮具。 院中可真熱鬧,春花似錦凡人、人聲如沸名党。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)传睹。三九已至,卻和暖如春岸晦,著一層夾襖步出監(jiān)牢的瞬間欧啤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工启上, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邢隧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓冈在,卻偏偏與公主長(zhǎng)得像府框,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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