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