以太坊升级完成你也做不出爆款应用 就因为你不知道这个
【区块链大本营编者按】据 etherscan.io 数据显示,经历一波又一波「挫折」后,今日凌晨 03:52,以太坊区块高度达到 7280000,君士坦丁堡及圣彼得堡硬分叉完成,以太坊升级成功!对于区块链开发者而言,此次升级意味着什么?主要表现在:
EIP145 和 EIP1052 通过提升智能合约的验证速度,能有效改进某些大型智能合约的运行时间和成本。简而言之,此次升级对开发者是极为友好的。
但俗话说,「打铁还需自身硬,磨刀不误砍柴工」,对以太坊开发者而言,要开发一款可规模落地、用户体验极棒的 DApp,全面了解以太坊 DApp 生态则显得尤为必要。
作者 | Michael Yuan,CyberMiles 首席科学家
责编 | 佩奇
出品 | CSDN、区块链大本营
互联网是一个去中心化的网络。相较于传统客户端/服务器应用,互联网的巨大优势在于其提供了开放、透明、公平的竞争环境。更多的竞争意味着更多的创新,这最终体现在为消费者提供更好的用户体验。其余的都是历史,互联网已经胜利了。
但 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 通过 LLVM IR 可以支持多种通用编程语言,所以理论上,基于 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 在公链上部署智能合约,并调用智能合约上的功能。
去中心化的应用程序
一旦我们构建并测试了智能合约,就可以构建 DApp UI,让用户与智能合约进行交互。
不同于依赖中央服务器的的 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 或者 CMT Wallet。这样的钱包也被称为 Web3 提供方。DApp JavaScript 代码应该检测 Web3 提供的对象的可用性和有效性。
-
MetaMask 是以太坊官方的测试链和主链的 Web3 提供方。它为 Chrome 浏览器上的所有 Web 应用程序提供 Web3 实例。
-
Venus(MetaMaskforCMT) 是 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 对象来签署和提交区块链事务。
2、外部服务
DApp 在区块链智能合约上只存储核心逻辑和代码。在区块链上存储大量的数据太慢并且过于昂贵。大多数应用还需要媒体文件,数据库和其他链下数据才能运行。
DApp 可以利用线上服务来存储和管理数据,下面是一些例子。
-
IPFS 是基于区块链的媒体文件存储和交换服务协议。DApp 可以在 IPFS 上存储大型用户文件,并使它们易于访问。
-
Swarm 是一个基于以太坊的文件存储和共享解决档案。
-
Github、Dropbox 和 GoogleDrive 等传统互联网文件分享服务可以给 DApp 用户提供链下文件存储和共享服务。
-
DBaaS(DataBase即服务) 提供者,如 MicrosoftAzureSQL、AWSRelationalDatabaseService(RDS)、Google BigQuery、MongoDB Atlas,可以为 DApp 提供数据库服务存储。
一个确保链下数据安全不可更改的常见设计实践是:将链下文件数据的哈希值存储在链上智能合约。
总之,DApp 比大多数 Web 应用更复杂。从一开始,你需要设计程序的哪一部分是基于区块链智能合约,哪一部分利用链下服务器端数据,哪一部分是客户端 UI。以上每一个部分都需要一组软件栈来运行,并与应用的其他部分进行交互。
Happy coding!
Michael Yuan 博士,CyberMiles 基金会联合创始人&首席科学家。毕业于美国德克萨斯大学奥斯汀分校,获天体物理学博士学位。
Michael 在开源软件开发方面拥有丰富经验,曾参与火狐浏览器、Fedora 和 JBoss 等项目,也是多项美国政府支持研究项目的负责人。