[转帖]智能合约和 DApp
智能合约和 DApp
https://www.jianshu.com/p/5e7df3902957
2017年11月份和2018年5月份的技术雷达,都将Ethereum for decentralised applications. 放到了 Technique 象限的 ASSESS 环里,鼓励在数字货币和银行等金融领域之外多尝试构建崭新的DApp。那我们就来聊聊什么是去中心化应用。
Ethereum(以太坊)是众多区块链平台里除了比特币之外最为有名的区块链平台了。它标榜成为世界的计算机,然后在这台世界计算机上运行的就是智能合约,智能合约相当于后台程序,和前端程序一组合(sdk/rpc)也就是这里的DApp。
智能合约和 DApp
大侠留步,智能合约(Smart Contract)是个什么东西,和AI有关系?嗯,没半毛钱关系。
举个例子,我们来听首歌:“阿珍爱上了阿强,在一个有星星的夜晚,飞机从头顶飞过,流星也划破那夜空”。这是一首描写爱情的美妙歌曲,因为太美妙了,所以很多人在传唱,结果很多人都知道了一个事实:阿珍爱上了阿强。这就是多人形成的一种共识,传播方式类似于流行感冒,所以也叫流行歌曲(大概是这么回事儿)。
智能合约和这个原理差不多,不同的是它会把事件编成代码,放到区块链这个不可篡改的数据库上,然后区块链网络中的每个节点都去跑一遍这个代码,结果都得到“阿珍爱上了阿强”这个事实。以后,你跑去查一查区块链的历史记录,总是能得到“阿珍爱上了阿强”,这就叫做可追溯。
为什么要DApp
互联网发展至今,大部分网络应用都是中心化的服务模式。这种集中式的服务模式容易导致服务内容缺乏透明度,用户隐私泄露、数据被滥用等问题。服务方和消费者之间的交易需要由极高的公司信誉和完善的评价系统甚至社会征信体系背书。部分服务天然存在单点故障的缺陷。
什么是DApp
Dapp 是去中心化应用(Decentralized Application)的简称。与之相对的是中心化应用(Centralized Application),比如现在常见的BS模式下的 web 应用。而中心化应用通常会出于可用性的考虑将实例部署到多个节点上,形成分布式应用。所以说,中心化应用可以是分布式的,也可以是非分布式,但是去中心化应用一定是分布式的。那么由此就会引出一个思考,去中心化应用和现在的分布式应用的区别到底在哪里呢?去中心化应用具有四个基本特点:
- 开源
- 内部货币
- 去中心化的共识机制
- 无单点故障缺陷
DApp天然是分布式应用,因此避免了单点故障。区块链上的用户数据通常是用加密方式存储,数据的所有权归属用户,而非DApp的开发者。DApp的后端程序是部署在区块链上的智能合约,智能合约是一组预定义的业务规则,具备确定性(Deterministic)执行的特征,能有效降低信任成本。DApp中消耗的资源由数字货币经济模型予以补偿或激励。
DApp 和普通的 App 有什么不同?
DApp和App之间最大的不同就在这D(Decentralized)上,这个D有两层含义,第一它具备分布式(Distributed)的特征,第二它具备分权(Decentralized)的特征。
分布式理解起来比较简单,这个app是部署到多个节点上的,不用害怕单点故障。
关键是这个分权比较难以理解。在这里,分权其实也包含两层含义。第一点,应用的开发者在上线应用之后,就不能随意修改升级应用内容,当然更加不可能修改数据;第二点,应用本身具有博弈的特点,都把用户想象成理性经济人,做事之前考虑成本,这也是为什么大多数DApp都有它内置的代币(Token,也作通证)。
这样说起来比较抽象,我们来看看一些典型的DApp的特征。
购买商品合约
想象一个场景,我们在一个没有淘宝这种电商平台下,怎么和个体商家做交易?
假想一下,商家发布了一个合约,合约里说,我这里有一件商品价值1块钱,你给这个合约打入一块钱,我就把商品发过去,然后你那边确认收货之后,我就收到这1块。
听上去不错,但是这里面有问题。如果用户打进1块钱,商家根本没有货,那用户只能白白浪费一块钱。只要用户不傻,他就不会打进去这1块钱,这个交易不可能完成。
怎么办?商家说那好,我先打进去1块钱表示我这里有1块钱的商品,这样就能确保我发货。然后用户打入1块钱,然后商家发货,用户签收,商家得到2块钱。
听上去不错,但是这里面还是有问题。如果用户收到货之后,不去触发签收操作呢?对于用户而言,没啥损失,但是商家不仅损失了商品,还损失了1块钱。
怎么办?用户说那好,你先打进去1块钱,我打进去2块钱。我收到商品之后,自然会触发签收操作,那样你就得到了2块钱,返还我1块钱。如果我不进行这样的操作,就会损失1块钱呢。
听上去不错,不过我们稍微钻点牛角尖,就会说刚才方案还是有漏洞,商家可能会用1块钱套住用户2块钱的,就是不发货。那商家就得和用户一样打进去2块钱,但是用户收货之后,完全会考虑我只损失1块钱,你损失了3块钱,那我就不签收哈哈哈。
不过,我们还是基于理性经济人的假设,商家是想通过买东西赚钱的,所以他在抵押1块钱的情况下,一定会发货。
通过这个例子,我们很容易发现,在没有中间人担保的场景下,两个陌生人也是可能完成一笔交易的。这里面充满了博弈的套路,在实际编码的过程中,最好有两个人扮演不同的角色,然后坐到一起,从自己的利益出发,达成交易,而且使交易的信任成本最小化。刚才的场景下效率肯定不高,我想不会有哪个商家和顾客愿意质押自己的现金流,去达成这种交易吧。
锤子剪刀布
如何在Dapp中玩锤子剪刀布的游戏呢?我们面对面玩这个游戏还是比较简单的,彼此同时亮出来就好了。但是在网络环境下就不一样了,总有一个人先出,另一个后出。那放到DApp中更加有问题了,先出的人一定会输,为啥?因为先出的已经被记录在区块链上,那就意味着后面的人一定能看到对方的出拳结果,所以他一定会赢。
所以先出的人一定会把出拳的结果加salt然后hash才上链,后出因为看不到结果,所以只能随机选择一个出拳。
不过这个时候,问题又来了。先出的一看结果,是对方赢了,那就干脆不揭露结果。这对游戏而言不公平。所以还得设计在对方出拳之后,多长时间内,如果先出拳的一方不揭露,那么不论结果如何都算他输。
去中心的智能锁
区块链上的智能合约承载了原来中间商信任担保的角色,也是我们常常说的“去中介”和“去信任”的由来。详细请看这篇《基于以太坊的去中心化智能锁》
在很多共享经济的场景当中,其实一把“智能”的锁就可以胜任。这也是为什么我们会有去中心化智能锁的想法。整体的实现逻辑如下:
- 房东通过智能合约 Smart Lock Contract 设置房屋租金。
- 租客通过查找合约地址,对所要租的房屋合约转账;
- 租客来到房屋门前出示二维码(由自己签名的消息转成的二维码);
- 门锁上的摄像头识别二维码,并向合约验证签名的真实性以及租客的租房时间的合法性,进行开门。
以太猫(Cryptokitty)
Cryptokitty是一款构建在以太坊区块链平台上的以太猫游戏(cryptokitties)着实火了,火热的程度直接引发以太坊网络的大拥堵,由于这个游戏占用了较多的以太坊网络带宽,导致很多交易得不到及时处理,比如你想从火币网转出一笔 ETH 到自己的钱包,这笔交易就会长时间处于等待确认的状态。
Cryptokitties 类似于此前席卷全球的游戏 Pokémon,不过它是一个基于以太坊的DAPP(Decentralized Application,去中心化应用),由设计工作室 AxiomZen 设计打造,上线不到10天就迅速成为以太坊上交易量最大的 DAPP。在这个游戏当中,你可以收藏,交易和繁殖以太喵,有别于比特币这类加密货币,以太喵更像加密收藏品,这意味着你的 CryptoKitty 始终属于你,合法性由智能合约(Smart Contract)确定,而智能合约是无法关停的,这点也是它区别于 Pokémon 的地方,因为一旦 Pokémon 背后的公司倒闭,你所拥有的宠物也随之消失。而且作为收藏品,以太喵的市场价格是由市场需求、本身的稀缺性和你的报价决定的,这也是为什么一只以太喵的价格会如此之高,甚至高达17万美元。
CryptoKittes 是一个收藏游戏,它能满足人们娱乐的需求。你可以收藏和买卖那些通过隐形基因繁殖出来的稀有品种、给喵命名、给它找对象,开启一段区块链吸猫的新时尚。这里也显现了 DAPP 的另一个重要特征 —— 内部代币,通过和外部转换代币进而盈利。
FoMo3D
传销集大成者,前段时间火的不能再火的DApp FoMo3D,它的网站名称叫做 exitscam.me,妥妥的骗局?
这个赌博的方式类似传销,它设置了崩盘的上限为24小时,每个新加入这个骗局的人都会自动给游戏续命30s(嗯,+30s)。为啥明知是个骗局还有很多人愿意进来玩呢,因为它的规则是在崩盘的时候,最后一个游戏参与者能获得之前所有参与者资金的23%,而其他的后来者需要为前面进来的人买单。
当然也有人给这款天才之作洗白,这归功于DApp的特性,代码开源,无法篡改。它巧妙地将阳谋编码到程序当中,而且明码标价地让参与者投注,即便是程序的拥有者也无法“携款潜逃”!驱使赌局越来越大的是人的贪婪本性。所以从本质上,这又不是传销。
这样一款邪恶的游戏现在已经募集了21,468.75ETH,价值9,903,536.56252刀,而且还会继续涨下去。把人性玩得如此得心应手,这也是区块链当前的状态。
小结
综合来看,我们可以下个简明的定义:DApp 是一种运行在去中心化 P2P 网络上,没有任何一个节点可以获得完全控制权并且源码开放,含有内部激励的网络应用。
[转帖]智能合约和 DApp的更多相关文章
- 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发
智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约
本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...
- 从零构建以太坊(Ethereum)智能合约到项目实战——第23章 从零构建和部署去中心化投票App,decentralization Voting Dapp
P90 .1-从零构建和部署去中心化投票App-01 P91 .2-从零构建和部署去中心化投票App-02 P92 .3-从零构建和部署去中心化投票App-03 参考博文:http://liyuech ...
- 呼叫河马——搭建在NGK公链上的去中心化智能合约DAPP
基于区块链技术发展的DAPP是一种分布式应用生态系统.目前最受DAPP欢迎的区块链有以太坊.EOS.波场等公链. 但由于当前 EOS资源模型的局限性,使得其使用成本较高.尽管 EOS的DPOS共识机制 ...
- BOOM -- 智能合约编程
译注:原文首发于ConsenSys开发者博客,原作者为Eva以及ConsenSys的开发团队.如果您想要获取更多及时信息,可以访问ConsenSys首页点击左下角Newsletter订阅邮件.本文的翻 ...
- 智能合约开发solidity编程语言开发一个以太坊应用区块链投票实例
智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...
- 使用Remix编译和部署以太坊智能合约
Remix 是一個开源的 Solidity 智能合约开发环境,提供基本的编译.部署至本地或测试网络.执行合约等功能.Solidity 是 以太坊Ethereum 官方设计和支持的开发语言,专门用于 ...
- 用solidity语言开发代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...
- 深入以太坊智能合约 ABI
开发 DApp 时要调用在区块链上的以太坊智能合约,就需要智能合约的 ABI.本文希望更多了解 ABI,如为什么需要 ABI?如何解读 Ethereum 的智能合约 ABI?以及如何取得合约的 ABI ...
随机推荐
- 2019 多点Dmalljava面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.多点Dmall等公司offer,岗位是Java后端开发,因为发展原因最终选择去了多点Dmall,入职一年时间了 ...
- Sharding-Jdbc源码探究-读写分离
1. Sharding-Jdbc源码探究-读写分离 1.1. 主入口 找到源码入口 这一个类围绕了springboot配置属性的加载,加载了spring.shardingsphere.datasour ...
- VBA笔记
1.VBA数据类型 数据类型 存储空间大小 范围 Byte 1个字节 0-255 Boolean 2个字节 true或false Integer 2个字节 -32768-32767 Long 4个字节 ...
- Qt TCP通信
工程文件 QT += network 服务端 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpS ...
- JVM参数最佳实践:元空间的初始大小和最大大小
本文阅读时间大约4分钟. JVM加载类的时候,需要记录类的元数据,这些数据会保存在一个单独的内存区域内,在Java 7里,这个空间被称为永久代(Permgen),在Java 8里,使用元空间(Meta ...
- SpringBoot 发送简单邮件
使用SpringBoot 发送简单邮件 1. 在pom.xml中导入依赖 <!--邮件依赖--> <dependency> <groupId>org.springf ...
- 【Cookie】java.lang.IllegalArgumentException An invalid character [32] was present in the Cookie value
创建时间:6.30 java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie va ...
- 使用apache.tika判断文件类型
一. 判断文件类型一般可采用两种方式 1. 后缀名判断 简单易操作,但无法准确判断类型 2. 文件头信息判断 通常可以判断文件类型,但有些文件类型无法判断(如word和excel头信息的前几个字节是一 ...
- Nacos 学习资料
资料 网址 官方网站 https://nacos.io/zh-cn/docs/what-is-nacos.html github https://github.com/alibaba/nacos 程序 ...
- Linux—— 记录所有登陆用户的历史操作记录
前言 记录相应的人登陆服务器后,做了那些操作,这个不是我自己写的,因为时间久了,原作者连接也无法提供,尴尬. 步骤 history是查询当前连接所操作的命令,通过编写以下内容添加至/etc/profi ...