区块链、以太坊简介

1. 现实的货币和管理系统存在的问题

我们现在的货币系统和管理系统,存不存在风险?人们的房子、存款有没有可能被人平白无故地夺走?我们的房子的权属由房管局管理,我们的存款由银行管理,如果有黑客黑一下房管局或者银行,人们可能从腰缠万贯变为一贫如洗。而这里,房管局和银行都是第三方的公信机构,作为管理中心,他们能够切实保障用户的权益吗?将质疑的对象从第三方机构上升到国家,委内瑞拉曾出现过通货膨胀,导致人们开始进入以物易物的商业模式,倚靠它的民众的权益如何来保障?

2. 新的货币系统怎么解决这些问题

首先,我们的电子支付不是新的电子货币,电子支付本质上还是银行里的存款的体现;支付宝是除银行外的另一个中心组织;中心组织通过数据库特征如ACID保证不会重花。

发行货币可以看作是基于信用的货币系统,一样东西能否成为钱,只取决于人们是否相信它的价值。譬如马云在一张纸条上写"这张纸条价值10000元",附上防伪标记。以马云现在的身家,大部分人都会接受这张纸作为货币,参与流通,因为到马云那里可以兑付。同样,目前使用的人民币和美元等也是基于对国家机器的信任。

想要设计发行一种电子货币,要考虑以下问题:

  1. 如何生成货币:谁能获得这个货币,获得货币不能太容易,正如必须工作才能获得报酬;
  2. 如何将货币与所有者关联起来:现下的环境中,信用卡实名制,现金匿名;
  3. 如何保护交易双方:保护卖家,防止买家对支付进行回滚;保护买家,卖家对交易不能抵赖;
  4. 如何防止双花(double-spending):对于现金不存在双重支付的问题,花出去了,就没有了;如果是基于信用的,有可能重花;现实中,人们不是防止重花而是在检测出重花之后加以重罚。数字货币是完全虚拟的货币,也即一串数字就代表一块币,这个数字可以被无穷次的利用,怎么样能够防止双花呢?
  5. 如何记账:每一笔交易有据可查,同时保护用户的隐私

相信你看完本次的分享,可以得到以上问题的答案。

3. 区块链的基本概念

区块链是一种分布式数据库技术(不断增长的全网总账本),通过维护数据块的链式结构进行持续增长的、不可篡改的数据记录。每个完全节点都拥有完整的区块链,并且,节点总是信任最长的区块链,伪造区块链需要拥有超过51%的全网算力。

3.1 原理

实现一个分布的数据记录账本,这个账本只允许添加、不允许删除。账本底层的基本结构是一个线性的链表。链表由一个个“区块”串联组成,后继区块中记录前导区块的哈希(Hash)值。某个区块(以及块里的交易)是否合法,可通过计算哈希值的方式进行快速检验。网络中节点可以提议添加一个新的区块,但必须经过共识机制(比特币系统中使用的是工作量证明Proof Of Work)来对区块达成确认。

3.2 特点

  • 去中心化 (去信任)

    不再依赖于中心化机构,实现了数据的分布式记录、存储和更新。所有在区块链网络里面的节点,都有记账权,都可以进行记账,这可以规避操作中心化的弊端。

  • 高度透明

    除了交易各方的私有信息被加密外,数据对全网节点是透明的

  • 分布式自治

    区块链采用基于一套公开透明的算法使得整个系统中的所有节点能够在去信任的环境自由安全的交换数据,使得对“人”的信任改成了对机器的信任,任何人为的干预不起作用

  • 全球流通

    只要有互联网的地方,就可以进行区块链资产的转账流通

  • 不可篡改

    区块链系统的信息一旦经过验证并添加至区块链后,就会得到永久存储,无法更改(具备特殊更改需求的私有区块链等系统除外)。除非能够同时控制系统中超过51%的节点,否则单个节点上对数据库的修改是无效的,因此区块链的数据稳定性和可靠性极高。哈希算法的单向性是保证区块链网络实现不可篡改性的基础技术之一

  • 可追溯性

    后面区块拥有前面区块的哈希值,就像挂钩一样,只有识别了前面的哈希值才能挂得上去,从而形成一整条完整可追溯的链。可追溯性还有一个好的的特点就是便于数据的查询,因为这个区块是有唯一标识的

  • 匿名

3.3 用途

区块链正在改变商业、行业乃至整个世界......(区别对待区块链和比特币)

4. 比特币与以太坊的区别

接下来将通过以太坊来介绍具体的细节。比特币的原理可以参考比特币白皮书以及USTC courses

以太坊的概念首次在2013至2014年间由程序员Vitalik Buterin受比特币启发后提出,大意为“下一代加密货币与去中心化应用平台”,目前以太币是市值第二高的加密货币,仅次于比特币。

比特币系统的脚本语言存在一些严重的限制:

  • 缺少图灵完备性 :这就是说,尽管比特币脚本语言可以支持多种计算,但是它不能支持所有的计算。最主要的缺失是循环语句(不支持循环语句的目的是避免交易确认时出现无限循环)
  • 价值盲(Value-blindness):脚本不能为账户的取款额度提供精细的的控制
  • 缺少状态:只能是已花费或者未花费状态,这就没有给需要任何其它内部状态的多阶段合约或者脚本留出生存空间,意味着其只能用于建立简单的、一次性的合约。
  • 区块链盲(Blockchain-blindness):看不到区块链的数据,例如随机数和上一个区块的哈希

注:比特币脚本语言示例(基于栈的编程语言,指令线性执行)

<sig>

<pubkey>


OP_DUP

OP_HASH160

<pubKeyHash?>

OP_EQUALVERIFY

OP_CHECKSIG

来源:https://zhuanlan.zhihu.com/p/45207775

比特币与以太坊的区别:比特币主要用途是用于进行交易,定位是数字货币的支付功能。以太坊相比比特币是一个巨大的提升,将区块链的应用边界从货币和支付扩大到了智能合约的领域

“以太坊的目的是基于脚本、竞争币和链上元协议(on-chain meta-protocol)概念进行整合和提高,使得开发者能够创建任意的基于共识的、可扩展的、标准化的、特性完备的、易于开发的和协同的应用。……并且因为图灵完备性、价值知晓(value-awareness)、区块链知晓(blockchain-awareness)和多状态所增加的力量而比比特币脚本所能提供的智能合约强大得多。”

5. 以太坊的工作原理

5.1 以太坊模型介绍

以太坊的本质就是一个基于交易的状态机(transaction-based state machine),根据以太坊的状态机,我们从创世纪状态(genesis state)开始。这差不多类似于一片空白的石板,在网络中还没有任何交易的产生状态。当交易被执行后,这个创世纪状态就会转变成最终状态。在任何时刻,这个最终状态都代表着以太坊当前的状态。

以太坊的状态有百万个交易。这些交易都被“组团”到一个区块中。一个区块包含了一系列的交易,每个区块都与它的前一个区块链接起来。

区块链

为了让一个状态转换成下一个状态,交易必须是有效的。为了让一个交易被认为是有效的,它必须要经过一个验证过程,此过程也就是挖矿(mining)。挖矿就是一组节点(即电脑)用它们的计算资源来创建一个包含有效交易的区块出来。

任何在网络上宣称自己是矿工的节点都可以尝试创建和验证区块。世界各地的很多矿工都在同一时间创建和验证区块。每个矿工在提交一个区块到区块链上的时候都会提供一个数学机制的“证明”,这个证明就像一个保证:如果这个证明存在,那么这个区块一定是有效的。为了让一个区块添加到主链上,一个矿工必须要比其他矿工更快的提供出这个“证明”。通过矿工提供的一个数学机制的“证明”来证实每个区块的过程称之为工作量证明(proof of work)

证实了一个新区块的矿工都会被奖励一定价值的奖赏。奖赏是什么?以太坊使用一种内在数字代币—以太币(Ether)作为奖赏。每次矿工证明了一个新区块,那么就会产生一个新的以太币并被奖励给矿工。

那么问题来了,如果多个矿工都创建一个他们自己的链怎么办?及产生了分叉。在这种场景下,是没有办法确定哪个链才是最”有效的“?

分叉

为了确定哪个路径才是最有效的以及防止多条链的产生,以太坊使用了一个叫做“GHOST协议(GHOST protocol)”的数学机制。

GHOST协议就是让我们必须选择一个在其上完成计算最多的路径。一个方法确定路径就是使用最近一个区块(叶子区块)的区块号,区块号代表着当前路径上总的区块数(不包含创世纪区块)。区块号越大,路径就会越长,就说明越多的挖矿算力被消耗在此路径上以达到叶子区块。使用这种推理就可以允许我们赞同当前状态的权威版本。矿工挖矿的报酬也是延迟发送的,只有自己打包的区块被包含在最长的链上,才被视为打包成功。

下面将详细介绍以下内容(原理以及相关数据结构):

  1. 账户(accounts)
  2. 状态(state)
  3. 损耗和费用(gas and fees)
  4. 交易(transactions)
  5. 区块(blocks)
  6. 挖矿(mining),工作量证明(proof of work)

5.2 挖矿(PoW)

由于记账是有奖励的,每次记账都可以给自己凭空增加一定数量的个报酬(以太币 or 比特币),出现记账不一致的问题,引入工作量证明来解决这个问题,规则如下:

  • 一段时间内(具体时间会与密码学难题难度相互影响)只有一人可以记账成功
  • 通过解决密码学难题(即工作量证明)竞争获得唯一记账权
  • 其他节点复制记账结果

工作量证明其实就是计算一个hash值,为了提高难度,使得Hash的结果必须以若干个0开头

Example:给定的一个基本的字符串"Hello, world!",我们给出的工作量要求是,可以在这个字符串后面添加一个叫做 nonce 的整数值,对变更后(添加 nonce) 的字符串进行 SHA256 哈希运算,如果得到的哈希结果(以 16 进制的形式表示)是以"0000"开头的,则验证通过

"Hello, world!0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
"Hello, world!1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
"Hello, world!2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7
 ...
"Hello, world!4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965
"Hello, world!4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6
"Hello, world!4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

比特币体系里的工作量证明机制与上述示例类似,但要比它更复杂一些。即前面的0更多,算出nonce即为成功。而验算时只要将Hello, world!4250代入哈希函数一次即可。下面以一个比特币区块为例:

Hash值是由数字和大小写字母构成的字符串,每一位有62种可能性(可能为26个大写字母、26个小写字母,10个数字中任一个),我们可以看到Hash值以19个0开头,理论上需要尝试62的19次方次,这个数是非常非常巨大的,我已经算不清楚了,应该是亿亿级别以上了。如此大的计算量需要投入大量的计算设备、电力等。(国内由于电力成本较低,相对收益更高,中国的算力占整个网络的一半以上)

5.3 账户

每个账户都有一个与之关联的状态(state)和一个20字节的地址(address)。在以太坊中一个地址是160位的标识符,用来识别账户的。账户分为两种:

  1. 外部拥有的账户:被私钥控制且没有任何代码与之关联
  2. 合约账户:被它们的合约代码控制且有代码与之关联

外部账户可以触发交易(比如转移代币,写入内部存储,挖出一个新代币,执行一些运算,创建一个新的合约等等),而合约账户不能主动发起交易,只能在被触发后按预先编写的智能合约代码执行。因此,在以太坊上任何的动作,总是被外部控制账户触发的交易所发动的。

ethereum Blockchain

5.4 状态

以太坊的全局状态(世界状态)就是由账户地址账户状态的一个映射组成。这个映射被保存在一个叫做Merkle Tree(也被叫做Merkle trie)树的数据结构中,其是一系列节点组成的二叉树。树的节点包括:

  • 树底层包含了源数据的大量叶子节点
  • 一系列的中间的节点,这些节点是两个子节点的Hash值
  • 一个根节点,同样是两个子节点的Hash值,代表着整棵树
Merkle Tree

区块链中的区块主要依赖于两种基于Hash的数据结构:

  • 一是区块的哈希链,通过哈希指针(hash pointer)形成的链,在上面的链接中,通过点击哈希值,页面可以跳转到之前或者之后的区块
  • 二是区块内的每个块内的交易组成的树状结构

注:所有提到的hash都是KECCAK-256,加密算法是ECDSA(椭圆曲线数字签名算法)

可以看到,区块头里面包含“父区块哈希值”字段,所以当前区块的哈希值也受到该字段的影响。如果父区块的身份标识发生变化,子区块的身份标识也会跟着变化。当父区块有任何改动时,父区块的哈希值也发生变化。一旦一个区块有很多代以后,这种瀑布效应将保证该区块不会被改变,除非强制重新计算该区块所有后续的区块。正是这样的重新计算需要耗费巨大的计算量,所以一个长区块链的存在可以让区块链的历史不可改变,这也是其安全性的一个关键特征。

Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。生成一棵完整的Merkle树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点插入到Merkle树中,直到只剩一个哈希节点,该节点就是Merkle树的根

  • Merkle Tree的叶子节点是数据块的哈希
  • Merkle Tree的非叶子节点的哈希值根据它下面所有叶子节点的值哈希计算得到

由于哈希的单向性,可以得出结论,如果两棵Merkle树的merkle root相同,那么这两棵树的结构和每个节点也必然是相同的。另外,只要存储的叶子节点数据有任何的变动,就会逐级向上传递到相应的父节点,最终使得Merkle树的根节点哈希值发生变化(雪崩效应)

除了区块链之外,Merkle可信树在其他领域应用也很多,如在分布式系统中用于数据一致性验证,git中的版本一致性验证也是基于Merkle树。

5.5 损耗和费用

在以太坊中一个比较重要的概念就是费用(fees),由以太坊网络上的交易而产生的每一次计算,都会产生费用—没有免费的午餐。这个费用是以称之为”gas”的来支付(1Ether表示10^18Wei,“Wei”是Ether的最小单位)。

发送者在gas上花费的所有钱都发送给了“受益人”地址,通常情况下就是矿工的地址。因为矿工为了计算和验证交易做出了努力,所以矿工接收gas的费用作为奖励(在比特币系统中是以比特币作为回报的)。

gas

通常,发送者愿意支付更高的gas price,矿工从这笔交易总就能获得更多的价值。因此,矿工也就更加愿意选择这笔交易(竞价)。这样的话,矿工可以自由的选择一笔交易自己愿意验证或忽略。为了引导发送者应该设置gas price为多少,矿工可以选择建议一个最小的gas值他们愿意执行一个交易。

gas不仅仅是用来支付计算这一步的费用,而且也用来支付存储的费用。付费的原因?

  • 以太坊是一个图灵完备语言,即允许有循环,如果没有费用的话,恶意的执行者通过执行一个包含无限循环的交易就可以很容易的让网络瘫痪而不会产生任何反响。因此,费用保护网络不受蓄意攻击(费用也有最大限制Gas limit,交易发起时,发送者可设置gas limit和gas price)

  • 为什么我们还需要为存储付费?”其实就像计算一样,以太坊网络上的存储是整个网络都必须要负担的成本

  • 激励矿工打包

:以太币的来源有两个,创世区块中包含的7200w和大约每年挖矿产生的1872W,并且目前为止,总量无上限,参考这篇文章。后期可能会把PoW机制会切换到PoS(共识机制权益证明机制)机制进行新币发行,目前形势不明。但比特币是限量的,总量大概在2100w枚,PoW算法会动态调正挖矿的难度,所以就像限量版的乐高一样,越多的人支持,“收藏”越值钱。

5.6 交易

一个交易就是被外部拥有账户生成的加密签名的一段指令,序列化,然后提交给区块链。有两种类型的交易:消息通信合约创建(也就是交易产生一个新的以太坊合约)。交易是外部世界和以太坊内部状态的桥梁。

  1. nonce:发送者发送交易数的计数
  2. gasPrice:发送者愿意支付执行交易所需的每个gas的Wei数量
  3. gasLimit:发送者愿意为执行交易支付gas数量的最大值。这个数量被设置之后在任何计算完成之前就会被提前扣掉(如果余额不足gas会返回给发送者,并回滚操作)
  4. to:接收者的地址。在合约创建交易中,合约账户的地址还没有存在,所以值先空着
  5. value:从发送者转移到接收者的Wei数量。在合约创建交易中,value作为新建合约账户的开始余额
  6. v,r,s:用于产生标识交易发生着的签名
  7. init(只有在合约创建交易中存在):用来初始化新合约账户的EVM代码片段。init值会执行一次,然后就会被丢弃。当init第一次执行的时候,它返回一个账户代码体,也就是永久与合约账户关联的一段代码。
  8. data(可选域,只有在消息通信中存在):消息通话中的输入数据(也就是参数)。例如,如果智能合约就是一个域名注册服务,那么调用合约可能就会期待输入域例如域名和IP地址
image

5.7 日志

以太坊允许日志可以跟踪各种交易和信息。一个合约可以通过定义“事件”来显示的生成日志,日志被保存在bloom过滤器 中,过滤器高效的保存了无尽的日志数据。

一个日志的实体包含:

  1. 记录器的账户地址
  2. 代表本次交易执行的各种事件的一系列主题以及与这些事件相关的任何数据

布隆过滤器(Bloom Filter)是1970年由布隆提出的,用来判断某个元素是否在集合内,它具有运行速度快(时间效率),占用内存小的优点(空间效率),但是有一定的误识别率和删除困难的问题。它能够判断某个元素一定不在集合内或可能在集合内,也即Bloom Filter会造成一定的False Positive,但是不会造成False Negative。即某样东西一定不存在或者可能存在,以下使用十六位数组(N=16)和三个哈希函数(M=3)来演示Bloom过滤器的应用原理

bloom

Step-1:Bloom过滤器数组里的每一个数的初始值为零。关键词被加到Bloom过滤器中之前,会依次通过每一个哈希函数运算一次。该输入经第一个哈希函数运算后得到了一个在1和N之间的数,它在该数组(编号依次为1至N)中所对应的位被置为1,当全部3个哈希函数都运算过之后,一共有3个位的值从0变成了1,这个关键词也被“记录”在了Bloom过滤器里

Step-1

Step-2:增加第二个关键词就是简单地重复之前的步骤。需要注意的是,当Bloom过滤器里的关键词增加时,它对应的某个哈希函数的输出值的位可能已经是1了,这种情况下,该位不会再次改变。也就是说,随着更多的关键词指向了重复的位,Bloom过滤器随着位1的增加而饱和,准确性也因此降低了。因此,更大的数组和更多的哈希函数会记录更多的关键词以提高准确性。而小的数组及有限的哈希函数只能记录有限的关键词从而降低准确性。

Step-3:为测试某一关键词是否被记录在某个Bloom过滤器中,则将该关键词逐一代入各哈希函数中运算,并将所得的结果与原数组进行对比。如果所有的结果对应的位都变为了1,则表示这个关键词有可能已被该过滤器记录。之所以这一结论并不确定,是因为这些字节1也有可能是其他关键词运算的重叠结果。简单来说,Bloom过滤器正匹配代表着“可能是”。

可能是

Step-4:另一方面,如果我们代入关键词计算后的结果某位为0,说明该关键词并没有被记录在过滤器里。负匹配的结果不是可能,而是一定。也就是说,负匹配代表着“一定不是”。

一定不是

Bloom过滤器的用途:主要是解决大规模数据下不需要精确过滤的场景,如检查垃圾邮件地址,爬虫URL地址去重,解决缓存穿透问题等。

5.8 以太坊应用介绍

以太坊有个云养猫的游戏:谜恋猫(CryptoKitties),是一款以加密货币以太币(Ether)交易的虚拟猫咪休闲游戏,2017年11月28日公开上线营运,在加密货币爱好者圈内掀起一阵养猫的旋风,成为目前为止以太坊生态单日使用率最高的应用,曾占据以太坊网络16%以上的交易流量,导致以太坊网络不堪重负,出现严重拥堵,转账交易延迟、无法转账。

CryptoKitties

CryptoKitties是全球第一款基于区块链技术开发出来的游戏,玩家们可以购买、繁殖、出售猫咪。区块链技术的应用,保证了猫咪的唯一性和安全性,哪怕Axiom Zen公司关闭了,你的猫咪依然不会丢失。

特点

  • 使用以太币作为交易货币
  • 猫的永久性以及玩家的匿名性
  • 决定猫价值的因素
    • 基因
    • 稀有度
    • 毛色
    • 繁殖代数.....

6. 智能合约实践

1994年,计算机科学家和密码学家Nick Szabo首次提出“智能合约”概念。它早于区块链概念的诞生。Szabo描述了什么是“以数字形式指定的一系列承诺,包括各方履行这些承诺的协议”。虽然有它的好处,但智能合约的想法一直未取得进展——主要是缺乏可以让它发挥出作用的区块链。但直到2008年才出现采用智能合约所需的区块链技术,而最终于2013年,作为以太坊智能合约系统的一部分,智能合约首次出现。

智能合约是一种特殊协议,旨在提供、验证及执行合约。具体来说,智能合约是区块链被称之为“去中心化的”重要原因,它允许我们在不需要第三方的情况下,执行可追溯、不可逆转和安全的交易。智能合约包含了有关交易的所有信息,只有在满足要求后才会执行结果操作。智能合约和传统纸质合约的区别在于智能合约是由计算机生成的。

很多区块链网络使用的智能合约功能类似于自动售货机。智能合约与自动售货机类比:如果你向自动售货机(类比分类账本)转入比特币或其他加密货币,一旦输入满足智能合约代码要求,它会自动执行双方约定的义务。例如,“如果A完成任务1,那么,来自于B的付款会转给A。”通过这样的协议,智能合约允许各种资产交易,每个合约被复制和存储在分布式账本中。这样,所有信息都不能被篡改或破坏,数据加密确保参与者之间的完全匿名。

在以太坊网络上编写智能合约有三个主要步骤:

  1. 用以太坊高级语言编写
  2. 用EVM编译器编译成字节码
  3. 用以太坊客户端上传到区块链网络

以太坊则是目前为止最引人注目的智能合约框架,因为它是专门为支持智能合约的使用创建的。用Solidity语言编程,以太坊智能合约框架有助于促进去中心化网络,便于用智能合约处理交易。合约在执行交易方面的重要性,交易在区块链网络上是安全的、无须信任和分布式的。

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.8.0;

/**
 * @title Storage
 * @dev Store & retrieve value in a variable
 */
contract Storage {

    uint256 number;

    /**
     * @dev Store value in variable
     * @param num value to store
     */
    function store(uint256 num) public {
        number = num;
    }

    /**
     * @dev Return value 
     * @return value of 'number'
     */
    function retrieve() public view returns (uint256){
        return number;
    }
}

7. 参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350