带你读《区块链开发实战: 基于JavaScript的公链与DApp开发》之二:DApp开发简介

简介: 本书用三个部分讲解了区块链技术以及Asch的相关实践,第一部分讲解了区块链技术的基本概念,并用300行代码实现了一个最小的、可运行的区块链;第二部分分析Asch的源码,讲解Asch的实现原理;第三部分介绍了基于Asch的侧链技术的DApp开发实战。

点击查看第一章
点击查看第三章
第2章

DApp开发简介

在开发一个区块链应用之前,我们首先需要了解智能合约和DApp(Decentralized Application)的概念。本章首先介绍智能合约的概念以及智能合约的案例,然后解释 DApp 的概念及特点,最后介绍目前几个主流的区块链应用开发平台。

2.1 智能合约

我们先来看一下合约的定义,根据维基百科,合约是这么定义的:合同(或合约)是以双方当事人互相对立合致的意思表示所构成的,其中包括要约及承诺两个基本的意思表示。要约是表意人所发出,欲得到相对人承诺而发生一定私法上效力的意思表示。承诺则是针对要约所为的肯定答复,承诺的内容必须和该要约的内容完全一致,否则即为新要约而非承诺。应与要约区分的是要约之引诱,其并非意思表示,而是观念通知,为准法律行为之一种,不生要约拘束力。
那什么是智能合约呢?智能合约的概念由计算机科学家尼克·萨博(Nick Szabo)于 1993 年左右提出。1994 年他把智能合约的概念整理为论文,这也是智能合约首次正式提出。在这篇论文里,尼克·萨博给出智能合约的定义如下:“智能合约超越了自动售货机中嵌入各种有价属性的范畴,通过数字方式控制合约。智能合约涉及具有动态性、频繁主动执行属性的财产,且提供更好的观察和验证点,其中主动积极的措施必须丝毫不差。”
简单来说,智能合约就是把双方的约定、条件以代码的形式存储在计算机系统上,当一定的条件被触发或者合约人主动调用合约内容时,那么智能合约就会被执行。
智能合约虽然在理论上很早就被提出,但是却一直停留在概念上。智能合约的实现需要几个条件:

  • 必须有货币参与。没有货币参与的合约只能是空谈。以前的货币只能是法币,加密货币的出现提供了合约里价值流通的手段。
  • 资产必须数字化。写在合约的资产要数字化。诞生于数字世界的资产(比如游戏里的装备等)天然具有数字化的属性,物理世界中其他的实物资产也必须有数字化的手段。
  • 资产必须联网且绝对信任某个数据库。以前这个数据库是由一个中心化的组织保管和维护的,智能合约的参与方必须相信这个组织。区块链的出现使得去中心化数据的存储成为可能。

简单地说,智能合约它必须是智能的,自动化的,不需要人来执行的,合约的执行是自动触发的。而这些特点在区块链诞生以前是很难满足的,而区块链的内置资产、去中心化存储等特性为智能合约的部署和执行提供了天然的土壤。
1. 撰写智能合约的步骤
撰写一个智能合约和撰写通常的合同比较类似,不过需要用代码的形式来实现而已。这里以以太坊为例,撰写智能合约的通常步骤有:
1)确定好参与人、涉及的条款和协议。
2)将第一步确定的细则使用智能合约编程语言(以太坊上用的是 Solidity )实现,编译成 bytebode,然后部署到以太坊上。
3)一旦合约被部署到以太坊,那么这个合约就获得了一个合约地址。参与方可以根据合约地址来调用智能合约。
4)智能合约一旦被部署到以太坊,任何人都无法再对合约进行更改,即使是最初合约的发布者。
2. 智能合约案例
我们以经典的“先发货还是先打款”的问题,看一下智能合约如何解决这个问题。
假设 A 想要从 B 那里买一批货物,A 和 B 在不同的城市,因此货物需要托运。双方都担心自己受到欺骗,因此 A 不想在没有收到货之前付款,但是 B 不想在没有收到钱之前就发货。为了保证交易的顺利进行,他们引入了一个第三方C做担保。A 先把货款打给 C, 当 A 收到货以后,就可以知会 C 把货款打给 B。这个流程用智能合约实现的话代码如下:
contract Escrow {
address buyer;
address seller;
address agent;

function Escrow(address _agent, address _seller) {

// 在这个智能合约里,由购买方发起合约
buyer = msg.sender;
agent = _agent;
seller = _seller;

}
function release() {

if (msg.sender == agent)
  suicide(seller); // 转币给发货方
else throw;

}
function cancel() {

if (msg.sender == agent)
  suicide(buyer); // 取消交易,货款返回给购买方 
else throw;

}
}
在这个智能合约里,最后的交易结果由 C 决定,他可以根据交易的结果决定把货款给发货方还是购买方。

2.2 DApp简介

经过前几年移动互联网以及智能手机的普及,相信几乎所有人都知道了什么是 App(Application 的简称)。时间转眼迈入区块链时代,一个新的名词 DApp 开始进入大众的视野。简单来说,DApp 是 Decentralized Application 的简称,发音为 Dee-App,类似于 E-mail。DApp 和 App 最大的不同是:DApp 是运行在去中心化的区块链中,区块链提供了计算资源和存储资源的支持,前端技术和传统的 Web 开发保持一致。
首先我们来看一下 DApp 的定义。关于 DApp 的具体理解和定义,人们目前并没有达成一致。 有人认为只有基于以太坊智能合约开发的应用才是 DApp,而有人也提出类似于BitTorrent 之类的 P2P 应用也可以称为 DApp。这里采用目前最通用的 DApp Fund CEO David Johnston 在文章《Decentralized Applications White Paper and Spec》里的说法,对 DApp 的定义做一个概括。在这篇文章里,只有当满足以下所有条件时,一个应用才可以称之为 DApp:

  • 应用必须完全开源、自治并且没有一个实体控制着该应用的大部分代币(Token)。该应用必须能够根据市场的反馈及技术要求进行升级,但是升级必须由应用的用户达成共识之后才可以进行。
  • 应用的数据必须加密后存储在公开的区块链上。
  • 应用必须拥有代币机制(可以使用已存在的代币或者新发行一种内置代币),矿工或者应用维护节点需要得到代币奖励。
  • 应用代币的产生必须依据标准的加密算法,有价值的节点可以根据该算法获取应用的代币奖励。

根据以上的标准,比特币就是一个 DApp, 为什么这么说呢?我们来看一下比特币是否符合上面的标准:

  • 比特币的代码完全开源且不受中心组织的控制。
  • 所有比特币的交易等信息都可以在区块链上查到。
  • 比特币的代币奖励机制有预先内置的加密算法决定,无法修改。矿工由于维护比特币节点的安全和稳定获取奖励。
  • 所有比特币区块链上数据的修改都要经过大多数用户的认可(共识)。

可见,比特币是一个 DApp,Asch 是一个 DApp,而基于 Asch 开发的 CCTime 也是一个 DApp。不同的是,有些 DApp 扮演了操作系统的角色(比如 Ethereum、Asch),基于这些平台可以很容易地开发出特定需求的 DApp,而有些 DApp(比如 CCTime)则是具体的应用。
那么,DApp 有哪些核心要素呢?
你可以从零开始,自己创造一个完整的区块链系统并开发自己的应用。这相当于开发一个新的区块链项目,比较费事费力且对个人能力要求较高。如果你只是一个普通的开发者,想基于区块链开发自己的应用,那么选择一个成熟的区块链应用开发平台就好了。这些平台一般会提供完善的接口以及开发工具,你只需要操心业务逻辑及其实现就好了。关于区块链的底层部分,这些平台都会帮你处理好。无论用哪种方法,DApp的核心要素包括如下几点:

  • 开发平台。目前最流行的开发平台是 Ethereum:Ethereum 是目前全球除了比特币以外第二大的区块链项目,它就像一台遍及全世界的分布式计算机,你只需要把你的应用部署在 Ethereum上,应用的运行就可以由所有的 Ethereum 节点来保证了。应用的运行需要支付手续费(GAS)。缺点是需要学习一门新的语言 Solidity。另外一个平台是现在笔者所在团队开发的 Asch(中文名叫做阿希)。只要掌握 JavaScript,就可以基于 Asch 开发 DApp。Asch 采用的是侧链架构,每一个 DApp 就是一套侧链。侧链可以有独立的区块链和节点网络。不同的DApp 之间互相不会影响。不同于 Ethereum,Asch 系统上 DApp 数量的增加不会增加主链的负担,是一套更加先进的机制。
  • 共识机制。共识机制决定了运行 DApp 的各节点如何达成共识及获取奖励,目前最常用的共识机制有 POW、POS 以及 DPoS 等。POW 依据计算资源分配奖励,目前 Bitcoin、Ethereum 都采用了这种机制(不过 Ethereum 后面可能要迁移到 POS)。Asch采用的是DPoS机制,核心系统是由 101 个委托人节点组成,委托人是被社区选举的可信账户,得票最高的 101 个委托人负责生产区块。得票排名未进入前 101 名的账户被称为候选人,当他们将来获得足够多的选票并进入前 101 名后,将成为正式的委托人。基于Asch开发的 DApp 默认采用这种共识机制,不过开发者可以自己修改并决定使用哪种共识机制。
  • 代币分发。一般 DApp都会内置代币(Token),而想让更多用户参与到 DApp 的维护与使用中的话,就需要考虑好如何把代币分发到用户手中。目前最常见的有以下几种方案。挖矿:以 Bitcoin 为例,任何拥有计算资源的人都可以加入到 Bitcoin 的挖矿中来,通过挖矿奖励来获取新的 Bitcoin。ICO:可以简单理解为众筹。通过收集市面上已经成熟的其他代币,根据一定比例兑换为本 DApp 内的代币来完成。Ethereum 就是按照 1BTC/2000ETH 的比例通过 ICO众筹到了很多Bitcoin作为起始资金。目前这种分发方式在国内已被禁止。空投:将代币免费分发到用户手中。持有其他代币的用户只需要完成一个简单的绑定流程,就可以得到代币。最近的案例有 CCTime空投,具体方式可参考CCTime官网。私募:这与找投资一样,依个人能力而定。

一个 DApp 的生命周期主要分为三部分:
1)撰写白皮书。白皮书描述了 DApp 的技术原理、要解决的问题以及特点等。社区对白皮书的反馈可以添加到后期的更新中。
2)分发代币。可以采用上一节描述的代币分发机制的一种。
3)开发 DApp,逐步进化完善。在 DApp 发布之后,如果该 DApp 走向了一个健康发展的道路,可以期望会有越来越多掌握各种技能的用户加入到社区,一起维护 DApp 的发展。这时早期开发者在社区所占的比重越来越小,DApp 的发展交由社区整体进行运营、更新。无论是比特币还是比特股,早期开发者所起到的作用已经越来越小,去中心化的社区已经可以推动这些项目的继续发展。
目前社会对 DApp 开发的关注刚开始,市面上还难以看到流行的 DApp 应用。随着区块链技术的发展,传统的 C/S 模式可能会被颠覆,开发者也不用再去买云服务器部署自己的应用。有了区块链开发平台,开发者可以很容易地把应用部署到区块链上,这是一个基于全球服务器,7×24不间断服务的应用平台。另外由于 DApp 代币机制的存在,开发者可以很容易地基于代币获得价值回报。相信在不久的将来,DApp 会超越传统 App,在人们的社会生活中扮演越来越重要的角色。

2.3 区块链应用开发平台简介

开发区块链应用的最快捷方式就是选择一个合适的开发平台,利用平台提供的开发工具和基础资源,完成业务代码的编写和部署。目前比较成熟的区块链应用开发平台有以太坊、Asch 以及 Hyperledger等。本章会介绍这三个平台的特点,读者可以根据自己的需求自行决定选择哪个平台来进行后续开发。

2.3.1 以太坊

主网上线时间:2015.7.30
平台开发语言:Go
智能合约开发语言:主要是 Solidity,也有其他的开发语言
代码仓库地址:https://github.com/ethereum
以太坊(Ethereum)是一个开源的区块链智能合约开发平台。和比特币不同,以太坊提供了一个支持图灵完备的智能合约开发语言以及其他更加灵活的架构。开发者可以基于以太坊提供的开发语言和接口开发区块链应用。以太坊的区块头如图2-1所示。
image.png

图2-1 以太坊的区块头

2014年7月~8月,以太坊团队通过 ICO 的方式销售了系统的内置代币 ETH,换取了大量的比特币用于以后的研发和运营。这也是全球第一个 ICO 项目。当时1个 ETH 的价格在 3元左右,现在的价格已经是 5000 多元。3年多的时间实现了 1600 多倍的增长,早期的投资人都获得了极为丰厚的回报。
这里我们详细对比一下以太坊和比特币:
以太坊是一个智能合约开发平台,它支持图灵完备的开发语言。通过这种语言,可以开发功能非常丰富的智能合约,目前最流行的语言是 Solidity。这大大扩展了平台的用途,而不仅仅是作为一个电子货币流通平台。
比特币原理简单,但功能也有限,目前只能作为一个封闭的数字货币流通平台来运转,几乎没有可扩展性如图2-2所示。
打个比方,这就像是有两条河,其中一条河叫比特币,你只能站在岸边看着它流淌,什么也干不了。而另一条河叫以太坊,你可以自己造船下河。你的船可以拉客、可以运货,甚至可以养猫,这就大大提高了这条河的利用率。这种模式相比比特币来说是一个非常大的进步,但是以太坊就没有问题了吗?这就引出了下一个问题——以太坊的拥堵问题。
image.png

图2-2 以太坊和比特币的对比

前面讲到了任何人都可以在以太坊这条大河上造船开展自己的业务,但是河只有一条,如果船多了会怎么样?拥挤,对吧。这也是我们在过去几年经常能看到的现象,那就是以太坊的网络拥堵。最近的一次拥堵发生在本书写作的2018年,一款基于以太坊开发的养猫游戏流行起来,它一度占据以太坊 20% 的流量,造成了以太坊主链的拥堵,影响到了基于以太坊开发的所有其他应用。这就相当于以太坊这条河中突然出现了一条大船,搞得其他船都没有空间了。

2.3.2 Asch

主网上线时间:2016.8.16
平台开发语言:Node.JS
智能合约开发语言:JavaScript
代码仓库地址:https://github.com/AschPlatform
Asch 是一个去中心化的应用平台,其架构如图2-3所示。它提供了一系列的SDK 和API来帮助开发者构建基于 JavaScript 和侧链技术的去中心化应用。 Asch 通过提供定制侧链、智能合约、应用托管等一体化的行业解决方案,致力于打造一个易于使用、功能完备、即插即用的系统。利用 Asch 生态系统,开发者可以快速迭代自己的 JavaScript 应用,并发布到系统内置的应用商店中,这些应用可以被平台中的分布式节点下载并执行,并服务于普通用户,整个过程都由Asch侧链共识网络提供安全保证。
image.png

图2-3 Asch 的架构

Asch系统本身也是一个完全开放的、去中心化的应用,内置有代币,单位为 XAS,中文名叫Asch币。Asch币可以通过双向锚定的方式与侧链或 DApp 进行交互,作为所有 DApp 之间资产转换的桥梁和媒介,这些代币将在系统发布之前以众筹的方式预售给投资人。系统一旦发布,Asch 最初的核心团队将不再掌控系统的走向,只有系统的权益人和代币的拥有者决定系统将来的发展。
Asch 平台除提供一些基本服务外,还将提供技术和工具上的支持,主要面向以下群体:

  • 开发者。开发者可以根据 Asch 平台的应用开发规则和商业行为准则,并按照相关的规范进行开发和提交 DApp。DApp 的商业模式或免费,或定价销售,或按增值服务付费。采用何种商业模式完全由开发者决定。
  • 企业。Asch 平台提供的工具可以非常容易地创建一个完整的区块链,更重要的是可以楔入到 Asch 平台的主链或者比特币的区块链中,实现与成熟电子货币的对接,这对中小型企业,特别是初创企业是非常有吸引力的。中小企业可以通过区块链技术提供原本封闭在企业内部、互联网内部的信息和数据,甚至与监管机构的相关系统数据相互链接,增强透明度,以此树立良好的形象,赢得投资者、金融机构的信任度,顺利拿到融资或项目合同等。中小企业主动公开和开放资料,已成无法阻挡的趋势。因为现在有很多的公开渠道来获取数据,中小企业已经越来越难隐瞒它们不想让外界知道的信息。我们可以大胆预测,区块链将是未来帮助中小企业发展的重要武器。
  • 普通用户。普通用户可以通过 Asch 内置的应用商店进行下载、安装和使用去中心化应用,这跟手机平台的应用商店是类似的模式。Asch 系统支持多种类型的去中心化应用,普通用户在消费这些应用的同时,还可以通过贡献内容来获得收益。开发者与普通用户将共同组成一个繁荣的生态系统。
    Asch 主网于2016年8月16日上线,目前已经安全运行了2年多的时间。期间遭遇过多次攻击,但没有发生过分叉或者宕机的情况,在安全性和效率上都已经得到了验证。

2.3.3 Hyperledger

主网上线时间:2017.7.11
平台开发语言: Go
代码仓库地址:https://github.com/hyperledger
Hyperledger(超级账本)是由 Linux 基金会支持,很多巨头(包括IBM、Intel等)参与一个面向企业打造的一个透明、公开的去中心化分布式账本项目。目标是制定一个区块链技术的开源规范和标准,让更多的应用可以容易地建立在区块链技术之上。
Hyperledger 目前包括5个技术框架,3+1 个工具包(1 个尚未发布)。这 5 个技术框架分别是:

  • Sawtooth:为物联网、生产、金融以及企业提供的区块链框架。
  • Iroha:聚焦于提供移动库,提供更多的库作为组件被其他组件共同使用。
  • Fabric:是一个许可网络,只有获得许可的参与者才可以接入网络。
  • Burrow:提供了一个模块化的带有许可智能协议解释器的区块链客户端。
  • Indy:一个用于去中心化身份的分布式账本。

3个工具包分别是:

  • Hyperledger Cello
  • Hyperledger Composer
  • Hyperledger Explorer
  • 还有一个尚未发布的工具包:Hyperledger Quilt

如果想要了解更详细的信息,可以查看 Hyperledger 的官网。

2.4 本章总结

本章介绍了智能合约和 DApp 的概念以及区块链应用开发平台。区块链技术的应用落地还刚刚开始,无论是开发智能合约还是 DApp,目前都还处于初始阶段,读者可以根据自己的应用场景选择合适的平台进行开发。
参考资料:

相关文章
|
18天前
|
监控 JavaScript 前端开发
使用Vue.js开发员工上网行为监控的实时数据展示页面
使用Vue.js开发的实时员工上网行为监控页面,展示员工访问的网站、应用和时间等数据。页面响应式设计,适应不同设备。通过Vue组件显示实时数据,如`<li v-for="activity in activities">`循环渲染。数据定时更新,利用Vue的生命周期钩子和axios从服务器获取并自动刷新,确保数据的时效性。该页面有助于管理者即时了解员工网络活动,保障企业网络安全和资源管理。
85 5
|
3天前
|
JavaScript 前端开发 程序员
探索Vue.js宝库:解锁基础知识与实用技能之门(1. 数据绑定与响应式 2. 条件与循环 3. 组件化开发;1. 路由管理与导航 2. 状态管理与Vuex 3. Vue.js的生命周期)
探索Vue.js宝库:解锁基础知识与实用技能之门(1. 数据绑定与响应式 2. 条件与循环 3. 组件化开发;1. 路由管理与导航 2. 状态管理与Vuex 3. Vue.js的生命周期)
9 1
|
4天前
|
JSON JavaScript 前端开发
JavaScript 简介
JavaScript 简介
7 1
|
8天前
|
缓存 JavaScript 前端开发
js开发代码片段与小技巧
js开发代码片段与小技巧
11 2
|
12天前
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
|
15天前
|
缓存 编解码 JavaScript
在JavaScript小游戏开发中,优化游戏性能是非常重要的
【6月更文挑战第16天】JavaScript小游戏性能优化涉及动画流畅度和减少重绘:使用requestAnimationFrame替代定时器;减少DOM操作,利用DocumentFragment或虚拟DOM;Canvas/WebGL高效渲染;压缩图像,使用雪碧图;分层渲染与视口裁剪;Web Workers处理后台计算;缓存计算结果;事件委托;定期性能分析。优化是持续过程,需结合具体需求调整。
48 8
|
15天前
|
JavaScript 前端开发 Android开发
kotlin开发 webview如何在收到JS调用后,native返回数据给到JS
这段内容描述了在Hybrid App开发中,使用Kotlin的Compose构建的Web视图(WebView)如何通过JsBridge实现JavaScript与原生代码的交互
|
18天前
|
JavaScript 前端开发 编译器
探讨TypeScript如何帮助JavaScript开发者避免这些常见错误,从而提高代码质量和开发效率
【6月更文挑战第13天】TypeScript,JavaScript的超集,通过添加静态类型检查和面向对象特性,帮助开发者避免常见错误,提升代码质量和开发效率。它能检测类型错误,防止运行时类型转变引发的问题;使用可选链和空值合并避免引用错误;通过枚举减少逻辑错误中的魔法数字;接口和泛型等特性提高代码可维护性。学习TypeScript对提升JavaScript开发质量有显著效果。
28 4
|
17天前
|
XML 前端开发 JavaScript
前端简介(HTML+CSS+JS)
前端简介(HTML+CSS+JS)
|
21天前
|
供应链 物联网 分布式数据库
区块链技术与智能合约开发的边界究竟在哪里?
【6月更文挑战第10天】本文探讨了区块链技术与智能合约的界限和挑战。区块链,本质是分布式数据库,以其不可篡改性和安全性在金融、供应链和物联网等领域广泛应用。智能合约,作为区块链上的自动执行代码,无需第三方介入,确保了执行的自动性和安全性。然而,技术上面临扩展性、性能和安全问题,法律与监管层则需解决合规监管和跨国法律协调的难题。尽管如此,随着技术进步和应用场景拓展,区块链与智能合约的潜力和未来前景依然广阔。
39 2

热门文章

最新文章