初识区块链前端开发

Posted by Paian on March 3, 2018

【前言】

近两年,“区块链”成了一个高热度的关键词,受到各行各业的广泛关注,甚至不久前还出现了“三点钟无眠”微信群聚集一拨各色牛人深夜不眠不休在讨论区块链。而与区块链大热形成强烈反差的是,关于区块链技术实战的资料相当匮乏。而有关区块链前端开发的技术资料,则更是少得可怜。笔者去年开始区块链前端开发的实践探索,一直想找到一些有帮助的资料,然而事实上,通过各种搜索,最终所能找到的有所帮助的,也无外乎几份不甚完备的官方文档,几本关于区块链基本原理的书籍,外加几份Github上的源码。关于区块链前端开发实践方面的资料,目前几乎没有。这跟区块链当前所处的发展阶段有关。

随着对区块链关注、投资、应用探索的走热,区块链技术学习和培训的需求正日益旺盛和迫切。区块链作为新生事物,经历曲折在所难免,但笔者相信随着时间的推移,对于区块链前端开发的需求将会迎来一个爆发期。有感于相关学习资源的匮乏,笔者决定把过去一段时间对于以太坊前端开发学习中的一些收获总结出来,在此陆续分享给大家。抛砖引玉,错误之处,还请不吝指正。

一、必须了解的一些基本概念

对一些基本概念有所了解,是进行区块链前端开发绕不开的问题。下面挑选了一些必须了解的概念。

1、区块链

区块链没有一个标准的定义,它本身的内涵也还在不断变化中。就当前的区块链技术而言,它是一种基于现代密码学、分布式一致性协议、点对点网络通信技术和智能合约编程语言等技术的数据交换、处理和存储的技术组合。

以参与方来划分,区块链可以分为:公链(Public Blockchain)、联盟链(Consortium Blockchain)和私链(Private Blockchain)。

区块链由一个个的块(Block)组成,每个块包含区块头和区块体。块按照生成出来的时间前后排列,块的区块头中有上一个块的hash的引用,从而形成一个链式的结构。区块体中承载了若干条交易的信息。

块是通过区块链上的挖矿节点生成出来的。生成这个节点的过程叫做“挖矿”,其实质是打包区块链上的交易信息,并通过反复穷举hash的方式找到符合约定条件的hash值。如果一个节点在众多的节点中最先找到符合要求的hash,并广播出去得到其它节点的确认,该块也会正式成功成为链上的一部分,同时挖矿节点获得奖励的以太币,这就叫挖矿成功了。

2、以太坊(Ethereum)

以太坊项目的最初目标是打造一个智能合约的平台,理想情况下将不存在故障停机、审查、欺诈以及第三方干预等问题。基于以太坊项目,以太坊团队运营了一个公开的区块链平台——以太坊网络。用Solidity等语言,开发者可以开发出智能合约并部署在以太坊网络上。然后通过web3.js等库来实现web页面与以太坊网络上智能合约的交互,从而运用web前端开发技术来开发基于以太坊的去中心化应用(DApp)。

3、智能合约(Smart Contract)

智能合约是基于区块链的、不可被随意篡改的、数字自动化执行的一些预先设定好的规则和条款。本质上来说,它就是一段部署在区块链网络上的代码。这段代码写上你需要执行的任务的相应执行逻辑(合约)。以太坊中,智能合约有一个运行环境,即以太坊虚拟机(EVM)。

4、去中心化应用(DApp)

DApp,即Decentralized App。它的“后端”运行在这样一种点对点(peer to peer)网络上——网络中不存在任何一个能够完全控制该应用的节点。一个DApp由智能合约和客户端代码构成的。在传统Web应用中,后端代码在自己的服务器上运行;在DApp中,后端逻辑代码在区块链上运行。

去中心化应用有如下好处:

它是分布式的,理想情况下,没有单点故障,不会因为某一个或几个节点的错误或异常而导致服务不可用;它没有一个中心机构,所以任何第三方不可能通过向中心机构施加压力来对去中心化应用进行控制。

5、以太坊账户

每个账户由一个唯一地址来标识。比如,A账户要给B账户转一笔以太币,就需要把这笔以太币从A账户的地址发送到B账户的地址。 以太坊的账户有两类,外部账户和合约账户。外部账户被公钥-私钥对控制。合约账户被存储在账户中的代码(智能合约)所控制,当合约账户收到一条消息,合约内部的代码会被激活执行,允许它对内部存储进行读取、写入、发送消息和创建其它合约。 一个账户包含随机数(确定每笔交易只能被处理一次的计数器)、余额、合约代码(只有合约账户有)、账户的存储(默认为空)。

6、交易

交易是一个签名数据包,它由外部账户向另一个外部账户或合约账户发出,用于从一个账户向另一个账户(外部账户或合约账户)转账、调用智能合约(若有)、或部署一个新合约。交易包含接收者、发送者的签名、要转账的金额、gas上限和gas价格。

7、gas

以太坊上的每笔交易都会收取一定量的费用,这种费用以gas为单位进行衡量。每一笔交易都会设置一个所花费gas的上限,叫做gas limit。每一个gas的价格叫做gas price,所以最终的一笔交易的花费最多不能超过gas limit 乘以 gas price(算出来就是多少以太币)。如果交易执行完成,实际的花费比这个设定值小,剩余的会返还给交易发送者。如果执行一笔交易时花费已经达到了所设定的上限,但交易却还未执行完,那么交易失败,但花费也不退回,因为执行的过程中已经消耗掉算力了,而那笔花费是给算力的。算力由谁提供呢?算力由以太坊网络上每一个在挖矿的节点提供。

以太坊为什么要让每笔交易都有花费呢?试想,如果发送交易没有花费的话,那恶意的用户岂不是就可以随便乱发交易(反正也不用付以太币),当这种交易多了,势必造成以太坊网络的拥堵。

8、消息调用

智能合约可以通过消息调用的方式来调用其它合约,或者发送以太币到外部账户。消息调用和交易非常类似,它们都有一个发起者,一个接收者,携带的数据负载,转账金额,gas和返回数据。

9、代码调用

以太坊中有一种特殊类型的消息调用(callcode)。它和消息调用类似,只不过从目标地址加载进来的智能合约代码将会在发起调用的那个智能合约的上下文中运行。也就是说一个智能合约可以在运行时从另外一个合约地址动态加载进来合约代码。这使得Solidity可以实现“库”的概念,从而让智能合约更加强大了!

二、区块链前端开发与传统业务前端开发的区别

区块链前端开发与传统业务的前端开发是有较大的区别,这一点,在你开始进行区块链项目的前端开发之前,最好有个清晰的认识。

1、业务复杂度明显不同,框架运用几成刚需

传统的前端开发一般是每一个小的服务功能请求一个接口,所以整个web应用中会有许多的接口,这样的好处在于,每一个接口中的数据字段都不至于太多,方便理解和使用。而且我们只需要在用到它的路由界面上去调用这个接口,相应的数据通常不需要跨路由传递。

而区块链前端开发通常只有一个http或websocket接口,所有的与区块链的交互服务都通过这一个接口来完成。这大大增加了前端在数据处理上的复杂度——不仅字段非常多,杂糅在一起使得理解和管理更加困难,而且经常需要将数据跨路由共享给其它的路由界面。如果说传统的前端开发,我们依然可以不用前端框架完成好开发的话,那么,对于区块链应用的前端开发,不用React.js、Vue.js、AngularJS已经变得几乎不可能(即便能写出来,可维护性也非常差)。若没有像Redux、Vuex这样的状态管理工具来进行状态管理,处理起来就真的非常困难了。而且其异步事务之多,也明显超出传统应用。得有像redux-saga这样的工具,才能驾驭那么复杂的异步处理。

在框架的选择上,笔者认为目前React.js最为合适。这是因为,React.js在国外更为流行。而有影响力的区块链开源项目,多数还是国外开发者开发的。一些有参考价值的开源项目,都是用React.js完成的。所以,如果你采用React.js,参考开源代码时会更有优势。此外,React.js的生态也相对更为完善。更而且,它在国内也有相当的热度,热度要远大于AngularJS。

另外,区块链开发的业务流程较为复杂,而且在现阶段,产品经理通常也不是很理解区块链背后业务流程细节,所以开发时只有靠你自己去弄清楚,才能继续往下开发。

2、数据字段繁多,需要自己逐一理解其含义

在传统的前端开发项目中,数据接口每个字段的含义通常都会由后端程序员给出,而且字段也不是那么多,理解起来并不难。而区块链接口提供的字段非常之多,这些字段都是区块链一个接口给出的。通常,也没有人给你关于这些字段含义的介绍。你只能自己参考网上的文档一点一点去弄清楚,这是一个非常耗费时间的事情。

3、用到新模块、新语言、新工具,坑比较多

像用到的NPM模块,有一个与区块链交互的web3.js,API够你学段时间的。而且比较坑的一点是,现在正处在web3.js从0.xx版本像1.0版本迁移的过程中,新的版本已经呼之欲出了(已经出到了1.0-beta.30版了),而社区中的一些资料多还是以0.xx版本写成的。由于进行了大量代码重殴,web3.js 1.0版本中的不少API与0.xx版本是不兼容的。在这种情况下,到底采用哪个版本,确实是个令人纠结的问题。笔者的建议是,干脆激进一点,选择1.0 beta版——反正早晚都逃不过一次向1.0版的升级,何不现在就采用1.0版?

如果编写智能合约的话,还得学习Solidity语言。虽然它与JavaScript有几分相似,但考虑到智能合约一旦部署上区块链,就再也无法更改了,必须得学清楚Solidity语言的情况下,你才敢去放心地写智能合约。而且,即便你弄明白了Solidity语言,要写好一个一经部署上链就不能再改的合约,仍然是很有挑战的。其实,即便是区块链界的大牛,也有曾在智能合约上翻船的。The DAO智能合约被攻击事件,即是一例。

还有一个在以太坊智能合约开发中非常流行的工具truffle,其中有一个模块truffle-contract,目前它还不支持web3.js 1.0版本,所以,采用web3.js 1.0 beta版的情况下,truffle也是用不了的,这又是比较坑的一个点。

4、社区还不成熟,能获得的支持少

目前这个阶段,对于区块链的前端开发,大家都还处在探索阶段,都还在摸着石头过河,遇到问题能得到帮助的机会非常少。甚至想找到一份清晰的文档也很难。多数情况下只能靠自己。这与传统业务的前端开发是截然不同的体验。

不过,任何技术其实都是一样的,只有有人在前面趟出一条路来,后面的人才能轻松一点!

你的支持,是对博主最大的鼓励。猛戳这里,右上角给点个Star吧!>>>