MENU

【代码札记】区块链框架对比

February 22, 2021 • 瞎折腾

今天(2021年2月22日)晚上突然接到消息,要帮别人挑选一个「更快更容易写智能合约、上链调用接口」的区块链框架。反正闲着也是闲着,不如做点事驱散春节假期留下来的懒散,顺便凑出一篇文章发到网站上。

免责声明

本文撰写于2021年2月,并且没有特殊原因的话不会持续更新。因此在一段时间后随着文中提到的各软件更新迭代,描述的部分特性可能会与现实不符。本文具有时效性,并且文中观点并不公正客观,甚至带有十足的偏见。因此请读者自行决定是否要听信,作者(我)不为任何盲目行为带来的后果承担任何责任。

附起因消息记录:

别人:「在不?区块链框架了解不?」

我:「不了解啊」

别人:「抽时间帮我看看这个产品,环境好不好搭建,甲方建议用这个」

我:「好吧」

正文

本文将对比三个我知道的区块链框架,其中两个是别人指定的,第三个是我自己在网络上搜索到的。本文将依次详述每个区块链框架的特性,并最终单独开辟段落进行总结与选择。

FISCO BCOS

FISCO BCOS(Be Credible, Open & Secure)是安全可控、稳定易用、高性能的金融级区块链底层平台,由金链盟开源工作组于2017年推出。开源社区汇聚数千企业及机构、上万开发者参与共建,发展成为最大最活跃的国产开源联盟链生态圈。

—— FISCO BCOS官网

FISCO框架是一个国产的区块链框架,分类为联盟链。金链盟这名字一听就是官方起的土气名字。实际上这个联盟的成员几乎都是金融行业的大产业,诸如各大银行、证券公司,还有一部分是数据处理行业的公司,以及一些技术公司,诸如腾讯、251华为。

如果从阵容上来看,应该是国内最豪华的联盟了,其开发组应当也不是吃软饭的,好歹人家也把代码放到了GitHub上,并配有中英文说明。然而也仅限于中英文说明,之后的文档则全部是中文编写的,虽然不算精致,但从快速入门的角度来讲,这份文档更像是一个便于入门的说明书。当你需要更精进一步,去探寻教程之外、代码之内的API时(由于没有实际使用过,所以尚且不能断定这类API是否存在,但一个良好的文档应当详尽的含盖所有暴露出的API),就会显得十分鸡肋,因为目前为止我还没有找到能够详尽说明所有API的文档。

在部署安装方面,本框架使用C++编写,因此理论上可以在任意支持GCC的平台上生成可执行的二进制文件,例如aarch64平台(也就是常用于树莓派和手机的ARM指令集芯片)。如果是常见的架构,例如PC机和服务器使用的x86_64,FISCO提供预先编译好的二进制文件,可以通过一键安装脚本下载安装,无需经过长时间的编译。对于安装、配置和启动,官方提供了详尽(够用)的文档,在系统没有奇怪错误(通常是由于环境配置等问题导致的,与软件提供者无关)的情况下,应当可以顺利完成部署和安装。当出现问题时,用户可以通过文档中提供的「问题排查」一节有限的排除问题。文档能力之外的问题可以向社区求助,目前该项目的社区主要依赖于微信公众号,而GitHub Issue板块也能提供有限支持。值得一提的是,该一键安装脚本支持使用Docker安装,但与GitHub上的主流软件不同,该框架似乎并不预先提供镜像,而是在本地构建镜像并创建容器(由于官方对于Docker安装并未提供详细说明,我也没有细看安装脚本,所以这一部分为推测,以实际安装为准),与Docker交互的操作全部由安装脚本实现,并会生成对应Docker的启停脚本。

关于合约开发,本框架使用通用语言Solidity ,以太坊同款合约语言。利用官方提供的控制台程序,可以获得几乎与以太坊一模一样的开发部署体验。官方的控制台程序主要由Shell编写,并提供Java SDK进行交互(都什么年头了,现在不都叫Java API了嘛)。值得一提的是Java SDK的使用的Java版本十分激进,使用的Java 14(但最低支持Java 1.8),而目前Java的LTS长期支持版本是11,下一个LTS版本将是Java 17。在生产环境中使用的话,我更倾向于使用LTS版本,尤其在Java委员会变更了Java的更新周期之后:最新的Java将每半年迭代一个大版本号,并在新的版本号出现后停止对旧的版本号进行支持,这意味着Oracle官方已经在2020年9月停止了对Java14的支持,对于安全补丁等需求需要移步其他JDK实现,例如OpenJDK等。

对于控制台,即编程与区块链交互,可以使用框架提供的Java SDK,支持节点状态查询、部署和调用合约等功能,基于Java SDK可开发区块链应用,详细内容可以参考官方文档。同时该框架还提供JSON-RPC,使用Json格式进行远程调用。通过扩展Json-RPC,可以获得诸如Python、Go、C#等语言的支持,实际上Java SDK本身也是基于Json-RPC,并在此之上拓展了更多的支持功能。在不同语言的支持下,该框架能将Solidity语言编写的合约转换成对应语言的合约,并利用各语言的SDK进行部署与调用。

除了基础的安装部署工具外,该框架还提供了多个便于运维和使用的工具,诸如基于Web的管理平台、区块链数据可视化工具、运维部署工具、数据治理中间件等工具,具体可移步文档。

最后,由于是国产框架,该框架支持国密算法用以满足一些法律法规。

总结:

  • 安装部署简单
  • 文档只有教程没有手册
  • 编写智能合约需要使用专用语言Solidity
  • 支持Java、NodeJS、Python、Go和C#语言进行开发,其中Java SDK功能最为强大,所有语言支持基于JSON RPC
  • 附带其他辅助运维和使用的工具
  • 支持国密算法
  • 相关资料多,便于从0入门(大概吧,反正我是没看)
  • 社区较为封闭(我不爱用微信,更不愿意为此关注一个公众号)
  • 在国际化方面,与许多常规软件的习惯不符,但并不是主要缺点

RepChain

RepChain是中科院研发的一款区块链框架,意图在去中心的分布式网络下,应用区块链技术解决对等责任主体(节点)之间的信任问题。该框架使用Scala开发,并利用了JVM平台上的许多成品库。该框架的代码托管在国内Git平台上,压根儿就没打算国际化。

在安装部署方便,该框架并没有太多的指导性文件,需要使用者具备基础的Java开发经验(诸如能够使用一些包管理工具构建发行包,如Maven、sbt等),由于Scala在生产环境中并非主流,因此sbt等工具的使用上具有一定困难,还需要使用者自行摸索。对于构建发行包,根据运行种类的不同,使用者还需要修改构建配置,这对使用者的开发经验有所要求(但实话说Scala入门真不难,我还给sbt工具提过issue呢)。启动后框架自带网页端,可以实现区块链可视化,并且基于网页提供API和文档(要求使用者了解OpenAPI相关知识)。但需要注意的是这个框架在安装部署和配置启动上并没有太多说明,也没有错误排查,因此出现错误时需要使用者根据错误信息进行排错,这通常要求使用者具有丰富的Java及Scala开发经验。

在使用方面,合约编写使用Scala语言,需要继承并实现框架给定的接口或类。但合约测试可以利用Scala测试工具进行完备的测试,而不必像上一个工具一样必须部署到一个开发链上进行测试。与上一个框架不同的是,该框架使用ProtoBuf协议实现RPC,目前官方提供Java、Python和JavaScript语言的支持,但理论上只有支持ProtoBuf的语言才能够与该框架交互,而上一个框架则只要能够实现HTTP协议并能够操作JSON即可。SDK可以部署、调用并查询合约。

由于官方文档缺乏组织,因此我只能获得如上信息,篇幅上远远小于上一个框架。

总结:

  • 安装使用都需要对Java和Scala有开发经验,否则需要良好的运气
  • 编写合约使用Scala语言
  • 文档组织杂乱,让人十分不想看
  • SDK语言支持有限,基本上就是ProtoBuf(gRPC)的实现与封装
  • 对于生产环境使用没有良好的描述
  • 似乎也支持国密

良好的文档或教程是入门一个框架的最宝贵的资源,如果全靠代码摸索,这各框架用起来会非常痛苦。在我看来这个框架更像是科研使用,而不宜用于工商业生产使用。

Corda

这个框架是我自己在网络上搜索来的,我个人比较偏好Java和JVM相关的框架,而这个框架刚好也支持Java和Kotlin语言。

Corda is an open source blockchain project, designed for business from the start. Only Corda allows you to build interoperable blockchain networks that transact in strict privacy. Corda's smart contract technology allows businesses to transact directly, with value.

—— GitHub Corda Repo

该框架目前支持Java8,根据GitHub Issue来看,适配更高版本的JDK正在推进当中(仅支持Java8意味着在Java8下程序是有保证的,而其他版本下也不是不能用,但程序可能出现意料之外的行为或错误)。

由于该框架为国外开发,因此文档全部为英文,没有任何本地化,这对我来说没有任何问题,但对于不常使用国际化工具开发的程序员来说,英语可能是阻碍他使用本框架的最大阻碍。抛开语言的阻碍,文档本身十分详尽,由于是Kotlin开发的,得益于其完善的文档系统,可以在编写代码的时候查询方法的注释便可理解其行为(如果开发者没忘记写的话)。

对于入门,该框架提供以Java和Kotlin编写的样例程序,并在文档中有详细的运行调试教程,由于使用Kotlin开发,因此整体而言开发者更偏好于使用Gradle。该框架的安装部署模式倾向于开发去中心化的APP,因为该框架作为一个依赖库嵌入到程序内部,并由该框架实现节点间的通信、区块链的维护,而不是如同前述两个框架作为一个中心化的服务。我个人更喜欢这种模式。

在程序交互方面,由于该框架作为依赖库的一部分嵌入程序中,因此任何运行在JVM上的语言都能够在代码级别调用框架的功能,而不必由官方实现其它语言的SDK,通过JSON或Protobuf进行远程调用。同时该框架在每个节点运行一个HTTP API,可以借助该API与区块链交互。同时该框架还提供命令行下的交互式控制台。

编写智能合约,可以使用Java或其他任意运行在JVM上的语言编写(这不比以太坊那个强多了)。对于这部分教程,文档中有详细的说明,文档遵循Talk is cheap, show me the code的原则,吊打前述两个框架的文档。

由于国密还没有像AES那样潮流,因此该框架并不支持国密算法,在国内进行商业使用时可能会有合规问题。

总结:

  • 完备的文档,依赖库形式嵌入程序
  • 使用任意能够编译为字节码的语言编写智能合约
  • 支持JVM上的所有开发语言
  • GitHub上社区较为活跃,框架本身也在积极开发中
  • 该框架有开源版本和企业级版本两种,本文讨论开源版本
  • 不支持国密

总结

从「更快更容易写智能合约、上链调用接口」的角度出发,并考虑项目需要在国内落地运营,因此我更推荐使用FISCO BCOS框架进行开发。该框架安装部署简单,编写智能合约需要单独学习一门语言,但该语言专为智能合约而生,入门难度大大低于Scala及其他任何JVM语言,使得其编写智能合约出错几率小,更加安全。同时该框架在完备程度及语言支持,和文档丰富度上吊打另一个国产框架(中科院真丢人)。

但如果不是国内商业使用(法律法规要求必须使用国密算法),只是出于兴趣做个人项目,或者开源项目,我更偏好于使用Corda进行开发,该框架使用Kotlin,更贴近于我个人的语言偏好,同时Gradle等工具链也贴合我的个人习惯,开发起来语言不会是阻碍。并且在开发模式上,该框架作为程序的一个依赖库嵌入到程序中,而不必单独部署一个服务器,并使用相关SDK与之交互。该框架在文档方面也很详细,有充分的入门教程。但Java的支持版本确实有些问题,我目前开发的主力版本是Java 11,降级回Java 8需要一些心理建设。

-全文完-


知识共享许可协议
【代码札记】区块链框架对比天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code