这本关于 Forge 上手的小册子,之前由 ArcBlock 区块基石软件工程师 孙博山 手写放出(见 15 页手写指南 包你看懂 Forge 框架 | ArcBlock 课堂 ),现在由 ArcBlock 实习生 傅禹翰(其实习感受,见今日微信推送第二条)整理成印刷版,以飨读者。
作者: 孙博山(ArcBlock 软件工程师)
整理: 傅禹翰(ArcBlock 实习生)
什么是 Forge?
犹如 Ruby on Rails 是一套构建 Web 应⽤的框架,Forge 是一套构建区块链 dApps 的框架。区块链可以简单地理解成数据库,公开可验证的去中心化数据库。
一个传统的应用把数据储存在数据库里,一个 dApp 去中心化应用把数据放在区块链之中。
构建⼀个 dapp 比较于传统的应⽤要复杂许多,P2P,共识算法,网络协议等⼀系列底层的架构要先搭好,然后才写用户逻辑来实现业务需求。Forge 作为⼀个构建基于区块链的 dApp 框架,将大量的工作已经做好,并且提供了一套接口供应⽤程序调用。所以对于一名应用程序的开发者,只需关心自己业务逻辑,Forge 会将数据保存在区块链中供应⽤程序使⽤。
区块链是什么?
Forge 中有一些概念是源于区块链的,而很多开发者对于区块链并不是很熟悉,这里简单介绍一下一些最基本的概念,以助于之后开发的理解,
区块链就是一条由区块组成的链,它其实是一种数据结构。⻓的样子有点像 Linked List 链表。用链表可以存些简单的数据如 1、2、3,那区块链中存储的数据是什么呢?答案是 Transaction
Transaction 是什么?
transaction 交易,简称为 tx,是存储在每个区块中的数据。
一个区块由区块头和内容组成,头中保存了块高、上个块的哈希等信息,而内容则是一个个的 tx。为什么区块中的数据叫做 transaction 交易呢?因为世界上第一个区块链项目比特币中,每一区块中存的就是一笔笔的比特币交易记录,所以后续的各种区块链项目都用交易即 transaction 来作为区块链中的数据。
Forge 中的概念
当我们要做一个有用的应用程序时,通常会涉及到用户,用户会创建一些资产,并且将这些资产进行交易等行为。Forge 将这些行为抽象为两个基本的概念:
•account 账号•asset 资产
Account
Account 就是传统应用中账户的概念,只不过在传统应用中,一个用户账号是用用户名和密码来创建的;而在区块链的世界中,用户账号是由链包地址和私钥来创建的。
为什么不用用户名/密码来创建用户账户呢?因为在区块链的世界中,其实是没有一个用户登陆的概念的。我们知道,在传统的应用中,用户登陆成功后可以进行一些操作。比如说转账,发微博等。在比特币中,用户之间是如何在不登陆账户的情况下进行转账的呢?答案是通过数字签名,即将转账交易用比特钱包的私钥进行签名后发到区块链上;之后这个签名的交易经由别人验证后就算是有效的了,这样一笔转账的交易就算是完成了。所以钱包的概念也是比特币引进的。
Asset
Asset 资产则用来表示任何东西,可以是一篇文章,一张图片,一张地图或是一个证书。资产可以由某个用户创建,或者应用程序来创建,一旦创建后,可以用来进行交易、使用等行为。具体是做什么取决于应用程序。
Forge 中的 Transaction
前面说到,比特币中有且仅有的一种 Transaction 就是转账,Forge 作为一个全功能框架,原生支持十几种 Transaction,包括创建账号、创建资产、转账、交换等。每一次事件的发生,都等价成一个个的 Transaction 发布到链上。
所以说若开发者想在区块链上做开发,归根结底就是通过 Forge 在区块链上发布一个个的 Transaction。
我们知道,当 Forge 启动之后,便是一个单独的操作系统进程,开发者开发的应用程序如何与 Forge 交互来告之其应当发什么 Transaction 呢?Forge 提供了两种方式,GraphQL 和 gRPC。
如何与 Forge 交互?
Forge 本身提供了两种与其交互的形式:
•GraphQL•gRPC
这可能与我们平时调用某个服务器提供的 API 不太一样。我们平日接触的 API 调用大都是通过 JSON 发送一些 HTTP 请求访问某个 API 来获取一些资源,为什么 Forge 没有用 JSON API 呢?
原因很简单,效率。关于 GraphQL 和 gRPC 的优点,这里不再展开,不过会简单介绍一下这二种技术。
GraphQL 怎么用?
GraphQL 是 Facebook 开源的一项技术,皆在帮助用户更高效快捷地从服务器获取资源,
GraphQL 在网络的应用层面用的是 HTTP/1.1 或 HTTP/2 协议的 POST 请求,服务器接收从客户端发来的 Query 请求,经过处理后返回一个 JSON 的结果。
客户端能发送的请求分三类:
•Query:用来读取资源•Mutation