dapp开发总览
互联网是一个去中心化的网络。相较于传统客户端/服务器应用,互联网的巨大优势在于其提供了开放、透明、公平的竞争环境。更多的竞争意味着更多的创新,这最终体现在为消费者提供更好的用户体验。其余的都是历史,互联网已经胜利了。
但是web时代和移动时代的应用再次以效率的名义出现了强大的权力集中。通过在单一平台提供方下聚合所有的数据和服务,互联网应用变得更加好用,并且也易于盈利。然而,正如最近公众对Facebook、Google、Uber等互联网巨头的强烈反弹所表现的那样,互联网应用的中心化已经使得互联网的体验逐步变差,甚至与上一代公司所建立的私有网络一样糟糕。
在中心化的互联网上,用户没有隐私可言,也无法从自己的数据中获益。在没有制衡的情况下,大公司制定、操纵并执行规则来使自己利益最大化,而小商家在这些中心化平台上的利润空间不断萎缩。
去中心化的应用(DApp)是下一代开放式网络应用程序。DApp使用公共区块链来存储关键数据,而不是使用不透明公司的私有数据库。公链的数据是透明的、不可篡改的,并且用户能够通过私钥直接控制自己的数据。
如同web或移动互联网的早期阶段,开发者社区仍在探索构建复杂且高度可用的DApp的最佳方法。今天,DApp架构,开发者工具和部署环境都难以使用甚至难以理解。这对广大开发人员造成了很高的门槛。
在这篇文章,我会介绍当前最新的DApp开发技术基础架构和工具,解释一些术语并为开发人员开发DApp提供实用指南。
总览
与传统的web应用不同,DApp的核心数据和事务逻辑存储在公链上。部署在区块链上的全自动不可更改的软件称为智能合约。在智能合约内部,数据和操作可以精细化到只允许特定的账户持有者访问,从而实现了个人的数据所有权。
DApp的web或移动前端UI是任何人都可以部署的应用程序。它们与区块链智能合约进行交互。前端应用程序可以建立自己的数据库来存储非核心数据。但是由于核心数据和逻辑位于公链上,因此任何人都可以创建和部署前端应用程序,这就是DApp名字的由来。
智能合约
智能合约是DApp的核心,是公链上的不可变软件。当满足预设条件时,运行区块链的公共节点计算机会自动执行智能合约的代码。这一小节将探讨智能合约开发所需的软件。 编程语言支持
开发人员可能会用到如下编程语言:
Solidity 由以太坊开创,是目前使用最广泛的智能合约编程语言。Solidity语法简单,侧重代码的确定性行为,这是区块链共识的关键要求。也就是在运行智能合约代码时,所有的节点必须产生完全相同的结果。Solidity目前是开发者首选的智能合约编程语言。
Lity 是一种新的智能合约编程语言,对Solidity进行了扩展,为其添加了新的语言功能和操作码。Lity针对商业用例优化了Solidity和以太坊虚拟机。例如,通过名为libENI (以太坊本地接口)的机制,Lity允许区块链虚拟机动态添加本机C++扩展,这让虚拟机能够为某些计算任务提供专门的优化以实现高性能。Lity还支持新的语言结构,例如构建基于规则应用的正式规则语言。
Vyper与Python类似,是以太坊虚拟机的编程语言。与Python不同的是,Vyper删除了语言中所有的非确定性功能。相较于Solidity,Vyper设计地更加容易使用,目前仍处于测试阶段。
C / C++是像EOS一样基于WebAssembly的区块链虚拟机选择的编程语言。但是C / C++和WebAssemly并不是为区块链所需的确定性共识而设计的,使用C / C++的修订版本存在着学习曲线。同样,由于WebAssembly通过LLVM IR可以支持多种通用编程语言,所以理论上,基于WebAssembly的区块链虚拟机可以使用几种不同的语言。但实际情况是,要支持除C++以外的任何LLVM语言,社区仍然需要做大量的工作。
Lua 是一种轻量级的脚本语言,通常用于嵌入式硬件应用。由于Lua虚拟机轻巧且易于使用,因此有时会在区块链系统中用作智能合约虚拟机。不过这种情况并不常见。
编译器和部署工具
为了编译和运行智能合约,你需要工具。更准确点,需要组合工具。在这一小节中,我们将重点放在以太坊生态系统中的工具,因为这是使用最广泛的工具。
编译器和区块链节点
编译器将智能合约构建为字节码(bytecode),区块链节点将字节码部署到区块链上以供下一步执行。
Solidity的编译器是solc。运行GETH或Parity的以太坊节点可以上传并部署solc编译过的字节码到以太坊网络上。
Lity的编译器是lityc,它在solc之上提供了合规性和附加安全性检查,并且支持Lity特定的语言功能和增强功能。通过Travis 节点软件,可以将编译后的Lity应用程序部署到CyberMiles区块链。
Remix和MetaMask
Remix是基于web的IDE,用于编辑、编译、测试、部署和运行Solidity智能合约。相应地,Europa则支持用Lity语言编写的智能合约。Remix可以在Chrome浏览器中编译和测试智能合约。
然而,为了让Remix与像以太坊、CyberMiles这样的公链一起工作,其必须与”钱包”应用协同工作。因为很多区块链上的智能合约操作,如部署、创建新的合约,调用合约功能,都需要支付小额gas费。在以太坊上,Remix需要MetaMask钱包才能运行。在CyberMiles上,Europa 需要Venus才能运行。
Remix和MetaMask的组合适用于基于图型界面的重复手动开发。
Truffle和Infura
Truffle和Infura为命令行和自动化开发过程设计。Truffle使开发者从智能合约和DApp模板开始,构建越来越复杂的应用程序。Truffle为在本地以太坊虚拟机上构建和测试智能合约提供了命令行工具。与 Infura等公共以太坊节点服务提供商一起,开发者可以使用Truffle在公链上部署智能合约,并调用智能合约上的功能。
在CyberMiles,通过Lity语言的lityc 编译器,Truffle的性能得到了增强,可用于检查智能合约代码中已知的安全问题和模式。在CyberMiles,Truffle 称为Saturn。公共的CyberMiles主链节点(rpc.cybermiles.io:8545)可以作为RPC服务,与Saturn协同工作。
去中心化的应用程序
一旦我们构建并测试了智能合约,就可以构建DApp UI,让用户与智能合约进行交互。
不同于依赖*服务器的的Web应用,DApp可以在用户自己的机器上存储管理用户数据,并利用包括区块链服务在内的多个后端服务来实现去中心化。
WechatIMG1680
DApp通常作为JavaScript应用程序的客户端在用户的设备中运行。DApp的主要功能是提供用户界面,与核心数据和应用程序逻辑的区块链智能合约进行交互。 DApp还可以与其他公共服务,甚至是本地服务进行交互,以存储和管理链下数据。 例如,DApp可以利用HTML5本地存储API来存储特定于此设备上的用户数据。
你可以用任何JavaScript客户端框架编写DApp,热门的例子包括jQuery和ReactJS。
在Tuffle项目中,你也可以找到好些用JavaScript框架创建的DApp模板。
Web3库
JavaScript应用程序通过名为web3.js的库与区块链服务相连接。目前,web3.js 仅支持以太坊区块链,并且尚未达到1.0版本。然而,web3.js仍然是连接DApp与区块链服务最广泛应用的库。
与以太坊兼容的区块链需要自己定制的web3.js 版本。例如,CyberMiles区块链提供了web3-cmt.js库,与web3.js向后兼容,但支持CyberMiles在其web3.cmt包下的增加的交易类型。
这个web3.js库需要一个私钥来签署发送给区块链的交易与代码。就像我们已经讨论过的那样,区块链账户的私钥由钱包应用程序存储和管理。DApp应该与兼容的钱包应用程序结合使用,如MetaMask,Venus或者CMT Wallet。这样的钱包也被称为web3提供方。DApp JavaScript代码应该检测web3提供的对象的可用性和有效性。
Mateamask是以太坊官方的测试链和主链的web3提供方。它为Chrome浏览器上的所有web应用程序提供web3实例。
Venus是CyberMiles区块链在Chrome浏览器的web3提供方。
CMT Wallet为移动端应用程序提供web3。这些程序以移动网页的形式在CMT Wallet内打开。以太坊也有类似的移动钱包,如Trust Wallet可以运行以太坊DApp。
Venus和CMT Wallet都为DApp提供了web3-cmt对象,以便与CyberMiles测试链和主链进行交互。
在web3.js以外,ethereumJS库可以在没有钱包应用的情况下签署以太坊交易。但是,要执行此操作,JavaScript代码必须能够访问账户私钥。ethereumJS库提供了一个JavaScript库,用于在DApp中实现嵌入式钱包。
注意:Scatter这样的跨链应用程序与钱包相类似,但是用于运行DApp。Sactter提供了JavaScript对象来签署和提交区块链事务。
外部服务
正如我们所描述的那样,DApp在区块链智能合约上只存储核心逻辑和代码。在区块链上存储大量的数据太慢并且过于昂贵。大多数应用还需要媒体文件,数据库和其他链下数据才能运行。
DApp可以利用线上服务来存储和管理数据,下面是一些例子。
IPFS是基于区块链的媒体文件存储和交换服务协议。 DApp可以在IPFS上存储大型用户文件,并使它们易于访问。
Swarm是一个基于以太坊的文件存储和共享解决档案。
Github,Dropbox和Google Drive等传统互联网文件分享服务可以给DApp用户提供链下文件存储和共享服务。
DBaaS (DataBase 即服务) 提供者,如Microsoft Azure SQL, AWS Relational Database Service (RDS), Google BigQuery,MongoDB Atlas,可以为DApp提供数据库服务存储。
一个确保链下数据安全不可更改的常见设计实践是,将链下文件数据的哈希值存储在链上智能合约。