二、搭建以太坊私链及客户端基本操作

1、搭建私有链,创建自己的创始区块

建立私链根目录

$makedir geth-private-chain
$cd get-private-chain

创始区块的配置写在json文件中,我们需要将下面文件的内容保存为一个json文件
ps:下面所有操作的根目录都为: get-private-chain

{
      "config": {
        "chainId": 10, 
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
      },
   "alloc"   : {},
   "coinbase"  : "0x0000000000000000000000000000000000000000",
   "difficulty" : "0x20000",
   "extraData" : "",
   "gasLimit"  : "0x2fefd8",
   "nonce"   : "0x0000000000000042",
   "mixhash"  :"0x0000000000000000000000000000000000000000000000000000000000000000",
   "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
   "timestamp" : "0x00"
}
KEY
mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
nonce nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
difficulty 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase 矿工的账号,随便填
timestamp 设置创世块的时间戳
parentHash 上一个区块的hash值,因为是创世块,所以这个值是0
extraData 附加信息,随便填,可以填你的个性信息
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

此文件可以从官网直接复制,原始的chainId为0,但有可能在部署合约时出现问题,建议修改为10或其他数字

建立存放区块数据的目录

$makedir data0

目录结构为

geth-private-chain
|-----data0
|-----genesis.json
$ ls
data0       genesis.json

初始化以太坊私链数据

$ geth init genesis.json --datadir data0

geth是命令,init是命令选项,genesis.json 是init的参数,表示按照配置文件进行初始化。--datadir data0,指定区块链的数据存放目录为data0。

运行命令,执行的结果如下,表示初始化成功:

INFO [03-12|14:36:52] Maximum peer count                 ETH=25 LES=0 total=25
INFO [03-12|14:36:52] Allocated cache and file handles   database=/Users/HaoZai/geth-private-chian/data0/geth/chaindata cache=16 handles=16
INFO [03-12|14:36:52] Writing custom genesis block 
INFO [03-12|14:36:52] Persisted trie from memory database nodes=0 size=0.00B time=136.941µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [03-12|14:36:52] Successfully wrote genesis state database=chaindata                hash=5e1fc7…d790e0
INFO [03-12|14:36:52] Allocated cache and file handles database=/Users/HaoZai/geth-private-chian/data0/geth/lightchaindata cache=16 handles=16
INFO [03-12|14:36:52] Writing custom genesis block 
INFO [03-12|14:36:52] Persisted trie from memory       database   nodes=0 size=0.00B time=1.775µs  gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [03-12|14:36:52] Successfully wrote genesis state database=lightchaindata              hash=5e1fc7…d790e0

初始化成功后,会生成如下的目录结构

geth-private-chian/ 
|----data0/
|      |----geth/
|      |      |---chaindata/          //存放数据区块的目录
|      |      |    |---000001.log
|      |      |    |---LOG
|      |      |    |---CURRENT
|      |      |    |---LOCK
|      |      |    |---MANIFEST-000000
|      |      |----lightchaindata/
|      |----keystore/                   //存放用户信息的目录,此时为空,刚初始化,还未创建任何用户
|----genesise.json
Haozai-Macbook:geth-private-chian HaoZai$ geth --datadir data0 --networkid 1108 console
INFO [03-12|14:41:23] Maximum peer count            ETH=25 LES=0 total=25
INFO [03-12|14:41:23] Starting peer-to-peer node        instance=Geth/v1.8.2-stable/darwin-amd64/go1.10
INFO [03-12|14:41:23] Allocated cache and file handles     database=/Users/HaoZai/geth-private-chian/data0/geth/chaindata cache=768 handles=128
WARN [03-12|14:41:23] Upgrading database to use lookup entries 
INFO [03-12|14:41:23] Database deduplication successful    deduped=0
INFO [03-12|14:41:23] Initialised chain configuration     config="{ChainID: 10 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Constantinople: <nil> Engine: unknown}"
INFO [03-12|14:41:23] Disk storage enabled for ethash caches  dir=/Users/HaoZai/geth-private-chian/data0/geth/ethash count=3
INFO [03-12|14:41:23] Disk storage enabled for ethash DAGs   dir=/Users/HaoZai/.ethash               count=2
INFO [03-12|14:41:23] Initialising Ethereum protocol      versions="[63 62]" network=1108
INFO [03-12|14:41:23] Loaded most recent local header     number=0 hash=5e1fc7…d790e0 td=131072
INFO [03-12|14:41:23] Loaded most recent local full block   number=0 hash=5e1fc7…d790e0 td=131072
INFO [03-12|14:41:23] Loaded most recent local fast block   number=0 hash=5e1fc7…d790e0 td=131072
INFO [03-12|14:41:23] Regenerated local transaction journal  transactions=0 accounts=0
INFO [03-12|14:41:23] Starting P2P networking 
INFO [03-12|14:41:25] UDP listener up             self=enode://43e1647742e194501c44f2b765e06366d3ede47355e3c158c642e22a1a1c13288b492e6c02d27554ee26d9dcb91a032a09e6aeebac01fe98bbcc212296fa1ca8@[::]:30303
INFO [03-12|14:41:25] RLPx listener up            self=enode://43e1647742e194501c44f2b765e06366d3ede47355e3c158c642e22a1a1c13288b492e6c02d27554ee26d9dcb91a032a09e6aeebac01fe98bbcc212296fa1ca8@[::]:30303
INFO [03-12|14:41:25] IPC endpoint opened         url=/Users/HaoZai/geth-private-chian/data0/geth.ipc

Welcome to the Geth JavaScript console!

instance: Geth/v1.8.2-stable/darwin-amd64/go1.10
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
  • 查看私链下的账户
> eth.accounts
[]

PS:初始化不会创建账户,keystore目录为空,还不存在任何账户

  • 新建账户,两种方式
> personal.newAccount()   //通过密码形式创建张华
Passphrase: 
Repeat passphrase: 
"0xe2d463c53f5b4b8c48420304965af10db7290b65"
> 
> personal.newAccount('1111')  //把密码作为参数创建账户
"0xf7cd6aee057409e8ecfa88a8e5b18033d456ff05"
> eth.accounts
["0xe2d463c53f5b4b8c48420304965af10db7290b65", "0xf7cd6aee057409e8ecfa88a8e5b18033d456ff05"]

再次运行查看账户命令,以数组形式返回刚才创建的两个账户

  • 查看每个账户下的以太币数量
> u0=eth.accounts[0]
"0xe2d463c53f5b4b8c48420304965af10db7290b65"
> u1=eth.accounts[1]
"0xf7cd6aee057409e8ecfa88a8e5b18033d456ff05"

> eth.getBalance(u0)
0
> eth.getBalance(u1)
0

PS:只是创建了账户,还未经过任何交易或挖矿奖励,因此这里每个账户的比特币数量都是0,

  • 启动挖矿命令
>miner.start(2)  //这里的参数2,指启动两个现成进行挖矿

返回如下结果(忽略其中很多无用的输出,检出重点)

INFO [03-12|14:55:37] Updated mining threads          threads=2 //线程数为 2
INFO [03-12|14:55:37] Transaction pool price threshold updated price=18000000000
INFO [03-12|14:55:37] Etherbase automatically configured    address=0xE2D463c53f5b4b8c48420304965af10Db7290B65 //自动设置第一个账户为矿机账号
INFO [03-12|14:55:37] Starting mining operation 
null  //此处为start命令返回的结果,按道理应该是 true,为什么是 null?
//第 1 个区块
INFO [03-12|14:55:37] Commit new mining work          number=1 txs=0 uncles=0 elapsed=423.284µs
INFO [03-12|14:58:27] Successfully sealed new block      number=1 hash=516d22…7b94ac
INFO [03-12|14:58:27] mined potential block         number=1 hash=516d22…7b94ac
//第 2 个区块
INFO [03-12|14:58:27] Commit new mining work          number=2 txs=0 uncles=0 elapsed=131.175µs
INFO [03-12|14:58:29] Successfully sealed new block      number=2 hash=700256…f3f9c4
INFO [03-12|14:58:29] 🔨 mined potential block         number=2 hash=700256…f3f9c4
//第 3 个区块
INFO [03-12|14:58:29] Commit new mining work          number=3 txs=0 uncles=0 elapsed=123.273µs
INFO [03-12|14:58:29] Successfully sealed new block      number=3 hash=93f7de…005bdc
INFO [03-12|14:58:29] 🔨 mined potential block         number=3 hash=93f7de…005bdc

INFO [03-12|14:58:29] Commit new mining work          number=4 txs=0 uncles=0 elapsed=161.181µs
INFO [03-12|14:58:32] Successfully sealed new block      number=4 hash=c056e9…5e0b12
INFO [03-12|14:58:32] 🔨 mined potential block         number=4 hash=c056e9…5e0b12

INFO [03-12|14:58:32] Commit new mining work          number=5 txs=0 uncles=0 elapsed=136.386µs
INFO [03-12|14:58:34] Successfully sealed new block      number=5 hash=dd22e3…b04d54
INFO [03-12|14:58:34] 🔨 mined potential block         number=5 hash=dd22e3…b04d54

INFO [03-12|14:58:34] Commit new mining work          number=6 txs=0 uncles=0 elapsed=170.81µs
INFO [03-12|14:58:43] Successfully sealed new block      number=6 hash=4b2f3f…910609
INFO [03-12|14:58:43] 🔨 mined potential block         number=6 hash=4b2f3f…910609

INFO [03-12|14:58:43] Commit new mining work          number=7 txs=0 uncles=0 elapsed=119.437µs
INFO [03-12|14:58:43] Successfully sealed new block      number=7 hash=e40528…354748
INFO [03-12|14:58:43] 🔗 block reached canonical chain     number=2 hash=700256…f3f9c4
INFO [03-12|14:58:43] 🔨 mined potential block         number=7 hash=e40528…354748
//第 8 个区块
INFO [03-12|14:58:43] Commit new mining work          number=8 txs=0 uncles=0 elapsed=248.772µs
INFO [03-12|14:58:46] Successfully sealed new block      number=8 hash=4fad7c…5e318e
INFO [03-12|14:58:46] 🔗 block reached canonical chain     number=3 hash=93f7de…005bdc
INFO [03-12|14:58:46] 🔨 mined potential block         number=8 hash=4fad7c…5e318e
//提交第 9 个区块的挖矿操作
INFO [03-12|14:58:46] Commit new mining work          number=9 txs=0 uncles=0 elapsed=139.52µs

//第9区块还未返回结果,停止挖矿任务
> miner.stop()
true

查看当前每个账户的以太币数量

> eth.getBalance(u0)
40000000000000000000
> eth.getBalance(u1)
0

PS:因为是以第一个账户为矿工,所以只有 u0 获得了奖励,每挖出一个区块奖励5个以太币,这里显示的单位是wei,1eth=10的18次幂
查看当前挖矿的状态,返回 false

> eth.mining
false
  • 打印基础账户,等于第一个账户的地址
> eth.coinbase
"0xe2d463c53f5b4b8c48420304965af10db7290b65"
> u0
"0xe2d463c53f5b4b8c48420304965af10db7290b65"
> u1
"0xf7cd6aee057409e8ecfa88a8e5b18033d456ff05"
  • 换算成以太币
> web3.fromWei(eth.getBalance(u0),'ether')
40
  • 查看当前区块的数量
> eth.blockNumber
8
  • Wei 与 Eth 互转操作
> acmount=web3.fromWei(1,'ether')
"0.000000000000000001"
> acmount=web3.toWei(1,'ether')
"1000000000000000000"
  • 查看 eth 对象
> eth
{
accounts:["0xe2d463c53f5b4b8c48420304965af10db7290b65","0xf7cd6aee057409e8ecfa88a8e5b18033d456ff05"], //当前账户
blockNumber: 8, //区块数量
coinbase: "0xe2d463c53f5b4b8c48420304965af10db7290b65", //基础账户
compile: {
  lll: function(),
  serpent: function(),
  solidity: function()
 },
 defaultAccount: undefined,
 defaultBlock: "latest",
 gasPrice: 18000000000,
 hashrate: 0,
 mining: false,  // 因为已经停止挖矿,所以这里为 false
 pendingTransactions: [],
 protocolVersion: "0x3f",
 syncing: false,
 call: function(),
 contract: function(abi),
 estimateGas: function(),
 filter: function(options, callback, filterCreationErrorCallback),
 getAccounts: function(callback),
 getBalance: function(),
 getBlock: function(),
 getBlockNumber: function(callback),
 getBlockTransactionCount: function(),
 getBlockUncleCount: function(),
 getCode: function(),
 getCoinbase: function(callback),
 getCompilers: function(),
 getGasPrice: function(callback),
 getHashrate: function(callback),
 getMining: function(callback),
 getPendingTransactions: function(callback),
 getProtocolVersion: function(callback),
 getRawTransaction: function(),
 getRawTransactionFromBlock: function(),
 getStorageAt: function(),
 getSyncing: function(callback),
 getTransaction: function(),
 getTransactionCount: function(),
 getTransactionFromBlock: function(),
 getTransactionReceipt: function(),
 getUncle: function(),
 getWork: function(),
 iban: function(iban),
 icapNamereg: function(),
 isSyncing: function(callback),
 namereg: function(),
 resend: function(),
 sendIBANTransaction: function(),
 sendRawTransaction: function(),
 sendTransaction: function(),
 sign: function(),
 signTransaction: function(),
 submitTransaction: function(),
 submitWork: function()
}
  • 以太币交易操作
> amount=web3.toWei(1,'ether')
"1000000000000000000"
> eth.sendTransaction({from:u0,to:u1,value:amount})
Error: authentication needed: password or unlock
  at web3.js:3143:20
  at web3.js:6347:15
  at web3.js:5081:36
  at <anonymous>:1:1

PS:这里提示需要密码认证,账户每隔一段时间就会自动上锁,因此需要创建用户时的密码解锁

> personal.unlockAccount(u0)
Unlock account 0xe2d463c53f5b4b8c48420304965af10db7290b65
Passphrase: 
true

输入密码,解锁用户,再重新发起交易

> eth.sendTransaction({from:u0,to:u1,value:amount})
INFO [03-12|23:23:03] Submitted transaction          fullhash=0x039235641128e2192883802594f6de746459fc9154cad7ce17ba4342c9c2b027 recipient=0xf7cd6Aee057409E8eCfa88A8e5b18033d456ff05
"0x039235641128e2192883802594f6de746459fc9154cad7ce17ba4342c9c2b027"

ps:交易已经提交,是否成功了呢?No,交易的确认,这里仅仅是提交了交易任务

> txpool.status
{
 pending: 1,
 queued: 0
}

ps: pending=1,表示有一条交易,但还未被处理
我们再次提交一条交易,转账 2 比特币

> amount=web3.toWei(2,'ether')
"2000000000000000000"
> eth.sendTransaction({from:u0,to:u1,value:amount})
INFO [03-12|23:23:56] Submitted transaction          fullhash=0x991ea03c44915d2383863ce31d7e61015e066e58d81bff352f10dbf68ca1ec17 recipient=0xf7cd6Aee057409E8eCfa88A8e5b18033d456ff05
"0x991ea03c44915d2383863ce31d7e61015e066e58d81bff352f10dbf68ca1ec17"

再次查看交易池的状态

> txpool.status
{
 pending: 2,    //这里的pending 变成了 2,两个任务提交后还未被处理
 queued: 0
}

要使交易被处理,必须挖矿,获得新的区块记录交易数据。

  • 启动挖矿,获取下一个区块,就停止挖矿操作
> miner.start(1);admin.sleepBlocks(1);miner.stop();
INFO [03-12|23:26:06] Updated mining threads          threads=1
INFO [03-12|23:26:06] Transaction pool price threshold updated price=18000000000
INFO [03-12|23:26:06] Starting mining operation 
INFO [03-12|23:26:06] Commit new mining work          number=9 txs=2 uncles=0 elapsed=1.970ms
INFO [03-12|23:26:19] Successfully sealed new block      number=9 hash=31655d…7cec9b
INFO [03-12|23:26:19] 🔨 mined potential block         number=9 hash=31655d…7cec9b

再次查看交易池对象的状态

> txpool.status
{
 pending: 0,  //两个任务都被提交并处理,此处的 pending 值变成了 0
 queued: 0
}
  • 查看两个账户的余额,分别是42, 3。
> web3.fromWei(eth.getBalance(u0),'ether')
42
> web3.fromWei(eth.getBalance(u1))
3

ps:账户u1因为是矿工账号,每挖一个区块就获得5个比特币,因此40-3+5=42

  • 查询交易,根据交易返回的哈希值,可以查询该交易的数据内容
    查询第一笔交易内容
> eth.getTransaction('0x039235641128e2192883802594f6de746459fc9154cad7ce17ba4342c9c2b027')
{
 blockHash: "0x31655d1b7b60001e851849db4734742c24374f5ca82313cfb2b32fb0f27cec9b",
 blockNumber: 9, //该条交易被记录在第 9 区块
 from: "0xe2d463c53f5b4b8c48420304965af10db7290b65",//该笔交易的发起账号地址
 gas: 90000,
 gasPrice: 18000000000,
 hash: "0x039235641128e2192883802594f6de746459fc9154cad7ce17ba4342c9c2b027",
 input: "0x",
 nonce: 0,
 r: "0xfb0a7541c5ada67a1c34dde394178fb154401f28300659d86b9c4f2bf3cf4028",
 s: "0x263f46bcef9bbff8f24de845fce5bf80f2a22511d0f69f00b052ac140689c93c",
 to: "0xf7cd6aee057409e8ecfa88a8e5b18033d456ff05", //该笔交易的接收账号地址
 transactionIndex: 0,   //第 0 条交易
 v: "0x38",
 value: 1000000000000000000    //交易额度
}

查询第二笔交易内容

> eth.getTransaction('0x991ea03c44915d2383863ce31d7e61015e066e58d81bff352f10dbf68ca1ec17')
{
   blockHash: "0x31655d1b7b60001e851849db4734742c24374f5ca82313cfb2b32fb0f27cec9b",
   blockNumber: 9,   //该条交易被记录在第 9 区块
   from: "0xe2d463c53f5b4b8c48420304965af10db7290b65",  //该笔交易的发起账号地址
   gas: 90000,
   gasPrice: 18000000000,
   hash: "0x991ea03c44915d2383863ce31d7e61015e066e58d81bff352f10dbf68ca1ec17",
   input: "0x",
   nonce: 1,
   r: "0x5867dbfa40f1ea43b7b791b4306fb78948992289509af3ef07a23d4e4376bc9e",
   s: "0x78c71836cce53bcb1c81fe9b7e6efae7d4d1d9e483485a0a977292350381477f",
   to: "0xf7cd6aee057409e8ecfa88a8e5b18033d456ff05",   //该笔交易的接收账号地址
   transactionIndex: 1,  //第 1 条交易
   v: "0x37",
   value: 2000000000000000000  //交易额度
}
  • 查看区块内容,这里查询第9区块内容,验证上述两笔交易是否存在
> eth.getBlock(9)
{
    difficulty: 131072,
    extraData: "0xd783010802846765746886676f312e31308664617277696e",
    gasLimit: 3169294,
    gasUsed: 42000,
    hash: "0x31655d1b7b60001e851849db4734742c24374f5ca82313cfb2b32fb0f27cec9b",
    logsBloom:"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    miner: "0xe2d463c53f5b4b8c48420304965af10db7290b65",  //矿工账号地址,奖励会发放到次矿工
    mixHash: "0xaed7970963913fbef04fd92d341bd01c802e3a17a897d0666918d6c1e6f836cf",
    nonce: "0x4f52ee328ec62233",
    number: 9,  //区块号
    parentHash: "0x4fad7ce8e03b0b1f58b691e019e2e45b8db08db9176d0603832f99b2015e318e",
    receiptsRoot: "0x87c123b7108d5f4cff435404a984c52842c71f0d9fffb8a41744d2f80d18585d",
    sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
    size: 760,
    stateRoot: "0x2cfe64cf081483fea64ead3639bb2e352a13b11b21779107eaef8683f085e10a",
    timestamp: 1520868366,
    totalDifficulty: 1312064,
    transactions: ["0x039235641128e2192883802594f6de746459fc9154cad7ce17ba4342c9c2b027", "0x991ea03c44915d2383863ce31d7e61015e066e58d81bff352f10dbf68ca1ec17"], //上面两笔交易的哈希值
    transactionsRoot: "0x54f42a4444125c2e369b075442bb2d3b46756fe215a5332dd869bae56621cb4f",
    uncles: []
}
  • 退出以太控制台
> exit
INFO [03-13|10:01:26] IPC endpoint closed           endpoint=/Users/HaoZai/geth-private-chian/data0/geth.ipc
INFO [03-13|10:01:26] Writing cached state to disk       block=27 hash=2f5509…334855 root=9b2193…ff92ca
INFO [03-13|10:01:26] Persisted trie from memory database   nodes=3 size=514.00B time=841.642µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=45 livesize=5.92kB
INFO [03-13|10:01:26] Writing cached state to disk       block=26 hash=6cb0e7…2abfa6 root=7bb30d…895aa7
INFO [03-13|10:01:26] Persisted trie from memory database   nodes=2 size=263.00B time=39.712µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=43 livesize=5.66kB
INFO [03-13|10:01:26] Blockchain manager stopped 
INFO [03-13|10:01:26] Stopping Ethereum protocol 
INFO [03-13|10:01:26] Ethereum protocol stopped 
INFO [03-13|10:01:26] Transaction pool stopped 
INFO [03-13|10:01:26] Database closed             database=/Users/HaoZai/geth-private-chian/data0/geth/chaindata
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容