开发DApp,这些工具你必须了解

学院 慵懒的时光 11927 浏览

互联网是一个去中心化的网络。相较于传统客户端/服务器应用,互联网的巨大优势在于其提供了开放、透明、公平的竞争环境。更多的竞争意味着更多的创新,这最终体现在为消费者提供更好的用户体验。其余的都是历史,互联网已经胜利了。

但是web时代和移动时代的应用再次以效率的名义出现了强大的权力集中。通过在单一平台提供方下聚合所有的数据和服务,互联网应用变得更加好用,并且也易于盈利。然而,正如最近公众对Facebook、Google、Uber等互联网巨头的强烈反弹所表现的那样,互联网应用的中心化已经使得互联网的体验逐步变差,甚至与上一代公司所建立的私有网络一样糟糕。

在中心化的互联网上,用户没有隐私可言,也无法从自己的数据中获益。在没有制衡的情况下,大公司制定、操纵并执行规则来使自己利益最大化,而小商家在这些中心化平台上的利润空间不断萎缩。

去中心化的应用(DApp)是下一代开放式网络应用程序。DApp使用公共区块链来存储关键数据,而不是使用不透明公司的私有数据库。公链的数据是透明的、不可篡改的,并且用户能够通过私钥直接控制自己的数据。

如同web或移动互联网的早期阶段,开发者社区仍在探索构建复杂且高度可用的DApp的最佳方法。今天,DApp架构,开发者工具和部署环境都难以使用甚至难以理解。这对广大开发人员造成了很高的门槛。

在这篇文章,我会介绍当前最新的DApp开发技术基础架构和工具,解释一些术语并为开发人员开发DApp提供实用指南。

总览

与传统的web应用不同,DApp的核心数据和事务逻辑存储在公链上。部署在区块链上的全自动不可更改的软件称为智能合约。在智能合约内部,数据和操作可以精细化到只允许特定的账户持有者访问,从而实现了个人的数据所有权。

DApp的web或移动前端UI是任何人都可以部署的应用程序。它们与区块链智能合约进行交互。前端应用程序可以建立自己的数据库来存储非核心数据。但是由于核心数据和逻辑位于公链上,因此任何人都可以创建和部署前端应用程序,这就是DApp名字的由来。

dapp (2)DApp架构概述



智能合约

智能合约是DApp的核心,是公链上的不可变软件。当满足预设条件时,运行区块链的公共节点计算机会自动执行智能合约的代码。


这一小节将探讨智能合约开发所需的软件。

WechatIMG1681

 

编程语言支持

开发人员可能会用到如下编程语言:

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提供数据库服务存储。

一个确保链下数据安全不可更改的常见设计实践是,将链下文件数据的哈希值存储在链上智能合约。

总结

DApp比大多数web应用更复杂。从一开始,你需要设计程序的哪一部分是基于区块链智能合约,哪一部分利用链下服务器端数据,哪一部分是客户端UI。以上每一个部分都需要一组软件栈来运行,并与应用的其他部分进行交互。本文概述了DApp开发涉及的技术总览。如何开发自己的DApp?请继续关注后续教程。


Happy coding!

 

首发|区块链大本营 作者| CyberMiles 首席科学家 Michael Yuan 博士


声明:本文为文章作者或转发者向区势传媒的投稿,观点绝不代表区势传媒立场,亦不构成任何投资意见或建议。

评论(0)

最新评论