欲戴王冠,必承其重(Uneasy lies the head that wears a crown)。
超级账本(Hyperledger)项目是全球最大的开源企业级分布式账本平台。
在 Linux 基金会的支持下,超级账本项目吸引了包括 IBM、Intel、Cisco、DAH、摩根大通、R3、甲骨文、百度、腾讯等在内的众多科技和金融巨头的参与贡献,以及在银行、供应链等领域的应用实践。成立两年多时间以来,超级账本得到了广泛的关注和飞速的发展,目前囊括十大顶级项目,拥有近三百家企业会员。超级账本的开源代码和技术,也成为分布式账本领域的首选。
本章将介绍超级账本项目的发展历史和社区组织,以及旗下的多个顶级开源项目的情况,还将展示开源社区提供的多个高效开发工具。最后介绍如何参与到超级账本项目中,进行代码贡献。
超级账本项目简介
图 1.11.1.1 - 超级账本项目
2015 年 12 月,开源世界的旗舰组织 —— Linux 基金会 牵头,联合 30 家初始企业成员(包括 IBM、Accenture、Intel、J.P.Morgan、R3、DAH、DTCC、FUJITSU、HITACHI、SWIFT、Cisco 等),共同 宣布了超级账本(Hyperledger)联合项目的成立。超级账本项目致力为透明、公开、去中心化的企业级分布式账本技术提供开源参考实现,并推动区块链和分布式账本相关协议、规范和标准的发展。项目官方网站为 hyperledger.org。
成立之初,项目就收到了众多开源技术贡献。IBM 贡献了 4 万多行已有的 Open Blockchain 代码,Digital Asset 贡献了企业和开发者相关资源,R3 贡献了新的金融交易架构,Intel 贡献了分布式账本相关的代码。
作为一个联合项目(Collaborative Project),超级账本由面向不同目的和场景的子项目构成。目前包括 Fabric、SawToothLake、Iroha、Blockchain Explorer、Cello、Indy、Composer、Burrow、Quilt、Caliper、Ursa、Grid 等 12 大顶级项目,所有项目都遵守 Apache v2 许可,并约定共同遵守如下的 基本原则:
- 重视模块化设计:包括交易、合同、一致性、身份、存储等技术场景;
- 重视代码可读性:保障新功能和模块都可以很容易添加和扩展;
- 可持续的演化路线:随着需求的深入和更多的应用场景,不断增加和演化新的项目。
超级账本项目的企业会员和技术项目发展都十分迅速,如下图所示。
图 1.11.1.2 - Hyperledger 项目快速成长
社区目前拥有近 300 家全球知名企业和机构(大部分均为各自行业的领导者)会员,其中包括 60 多家来自中国本土的企业,最早期包括艾亿数融科技公司(2016.05.19)、Onchain(2016.06.22)、比邻共赢(Belink)信息技术有限公司(2016.06.22)、BitSE(2016.06.22)等,另外还包括华为(2016.10.24)、百度(2017.10.17)、腾讯(2018.01.25)等行业领军企业。此外,还有大量机构和高校成为超级账本联合会员,如英格兰银行、MIT 连接科学研究院、UCLA 区块链实验室、伊利诺伊区块链联盟、北京大学、浙江大学等。
如果说比特币为代表的加密货币提供了区块链技术应用的原型,以太坊为代表的智能合约平台延伸了区块链技术的适用场景,那么面向企业场景的超级账本项目则开拓了区块链技术的全新阶段。它首次将区块链技术引入到了联盟账本的应用场景,引入权限控制和安全保障,这就为基于区块链技术的未来全球商业网络打下了坚实的基础。
超级账本项目的出现,实际上证实区块链技术已经不局限在单一应用场景中,也不限于完全开放匿名的公有链模式下,而是有更多的可能性,也说明区块链技术已经被主流企业市场正式认可和实践。同时,超级账本项目中提出和实现了许多创新的设计和理念,包括权限和审查管理、多通道、细粒度隐私保护、背书-共识-提交模型,以及可拔插、可扩展的实现框架,对于区块链相关技术和产业的发展都将产生十分深远的影响。
注:Apache v2 许可协议是商业友好的知名开源协议,鼓励代码共享,尊重原作者的著作权,允许对代码进行修改和再发布(作为开源或商业软件)。因其便于商业公司使用而得到业界的拥护。
社区组织结构
每个成功的开源项目,都离不开一个健康开发、不断繁荣的社区生态。
超级账本社区自成立之日起就借鉴了众多开源社区组织的经验,形成了技术开发为主体、积极结合应用的体系结构。
超级账本社区的项目开发工作由技术委员会(Technical Steering Committee,TSC)指导,首任主席由来自 IBM 开源技术部门的 CTO Chris Ferris 担任;管理委员会主席则由来自 Digital Asset Holdings 的 CEO Blythe Masters 担任。另外,自 2016 年 5 月起,Apache 基金会创始人 Brian Behlendorf 担任超级账本项目的执行总监(Executive Director)。
社区十分重视大中华地区的应用落地和开发情况,2016 年 12 月,中国技术工作组 正式成立,负责推动社区组织建设和开源技术的发展和应用。
基本结构
图 1.11.2.1 - Hyperledger 社区组织结构
社区目前主要是三驾马车领导的结构:
- Technical Steering Committee (技术委员会):负责领导社区技术,指导各个开源项目的发展方向,下设多个技术工作组(Architecture、Identity、Learning Materials Development、Performance and Scale、Smart Contracts)和兴趣小组(Healthcare、Public Sector、Social Impact、Telecom、Trade Finance)。每年由社区开发者进行换届选举;
- Governing Board (管理董事会):负责整体社区的组织决策,从超级账本会员中推选出代表座位成员;
- Linux Foundation(Linux 基金会):负责基金管理和大型活动组织,协助社区在 Linux 基金会的支持下健康发展。
大中华区技术工作组
随着开源精神和开源文化在中国的普及,越来越多的企业和组织开始意识到共建一个健康的生态系统的重要性,也愿意为开源事业做出一定贡献。
Linux 基金会和超级账本社区十分重视项目在大中华区的应用和落地情况,并希望能为开发者们贡献开源社区提供便利。在此背景下,超级账本首任执行董事 Brian Behlendorf 于 2016 年 12 月 1 日 提议 成立 大中华区技术工作组(TWG-China),并得到了 TSC 成员们的一致支持和通过。笔者也有幸参与了工作组的创建,并担任联席主席。
技术工作组的 主要职责 包括:
- 带领和引导大中华区的技术开发相关活动,包括贡献代码、文档、项目提案等。
- 推动技术相关的交流,促进会员企业之间的合作和实践案例的落地;
- 通过邮件列表、RocketChat、论坛等方式促进社区开发者们的技术交流;
- 协助举办社区活动,包括 Meetup、黑客松、Hackfest、技术分享、培训等。
目前,工作组由来自各个成员企业的数十名技术专家组成,并得到了来自社区的众多志愿者的支持。工作组每两周举行在线例会,每个月定期在各大城市举办技术交流沙龙,各项会议和活动内容都是开放的,可以在 Wiki 首页(https://wiki.hyperledger.org/display/TWGC)上找到相关参与方式。
顶级项目介绍
Hyperledger 所有项目代码托管在 Gerrit 和 Github上。
目前,主要包括如下顶级项目(按时间顺序)。
- Fabric:包括 Fabric、Fabric CA、Fabric SDK(包括 Node.Js、Java、Python 和 Go 语言)等,目标是区块链的基础核心平台,支持 PBFT 等新的共识机制,支持权限管理,最早由 IBM 和 DAH 于 2015 年底发起;
- Sawtooth:包括 arcade、core、dev-tools、validator、mktplace 等。是 Intel 主要发起和贡献的区块链平台,支持全新的基于硬件芯片的共识机制 Proof of Elapsed Time(PoET)。 2016 年 4 月贡献到社区。
- Blockchain Explorer:提供 Web 操作界面,通过界面快速查看查询绑定区块链的状态(区块个数、交易历史)信息等,由 DTCC、IBM、Intel 等开发支持。2016 年 8 月贡献到社区。
- Iroha:账本平台项目,基于 C++ 实现,带有不少面向 Web 和 Mobile 的特性,主要由 Soramitsu 于 2016 年 10 月发起和贡献。
- Cello:提供区块链平台的部署和运行时管理功能。使用 Cello,管理员可以轻松部署和管理多条区块链;应用开发者可以无需关心如何搭建和维护区块链,由 IBM 团队于 2017 年 1 月贡献到社区。
- Indy:提供基于分布式账本技术的数字身份管理机制,由 Sovrin 基金会发起,2017 年 3 月底正式贡献到社区。
- Composer:提供面向链码开发的高级语言支持,自动生成链码代码等,由 IBM 团队发起并维护,2017 年 3 月底贡献到社区。
- Burrow:提供以太坊虚拟机的支持,实现支持高效交易的带权限的区块链平台,由 Monax 公司发起支持,2017 年 4 月贡献到社区。
- Quilt:对 W3C 支持的跨账本协议 Interledger 的 Java 实现。2017 年 10 月正式贡献到社区。
- Caliper:提供对区块链平台性能的测试工具,由华为 公司发起支持。2018 年 3 月正式贡献到社区。
- Ursa:提供一套密码学相关组件,初始贡献者包括来自 Fujitsu、Sovrin、Intel、DFINITY、State Street、IBM、Bitwise IO 等企业的开发者。2018 年 11 月正式被接收到社区。
- Grid:提供帮助快速构建供应链应用的框架,由 Cargill、Intel 和 Bitwise IO 公司发起支持。2018 年 12 月正式贡献到社区。
这些顶级项目相互协作,构成了完善的生态系统,如下图所示。
图 1.11.3.1 - Hyperledger 顶级项目
所有项目一般都需要经历提案(Proposal)、孵化(Incubation)、活跃(Active)、退出(Deprecated)、终结(End of Life)等 5 个生命周期。
任何希望加入到 Hyperledger 社区中的项目,必须首先由发起人编写提案。描述项目的目的、范围、参与者和开发计划等重要信息,并由全球技术委员会来进行评审投票,评审通过则可以进入到社区内进行孵化。项目成熟后可以申请进入到活跃状态,发布正式的版本。项目不在活跃后可以进入维护阶段,最终结束生命周期。
Fabric 项目
图 1.11.3.2 - Hyperledger Fabric 项目
作为最早加入到超级账本项目中的顶级项目,Fabric 由 IBM、DAH 等企业于 2015 年底联合贡献到社区。项目在 Github 上地址为 https://github.com/hyperledger/fabric。
该项目的定位是面向企业的分布式账本平台,其创新地引入了权限管理支持,设计上支持可插拔、可扩展,是首个面向联盟链场景的开源项目。
Fabric 项目基于 Go 语言实现,贡献者超过 160 人,总提交次数已经超过 15000 次,核心代码数超过 15 万行。
Fabric 项目目前处于活跃状态,已发布 2.0.0 版本,同时包括 Fabric CA、Fabric SDK 等多个相关的子项目。
项目的邮件列表地址为 fabric@lists.hyperledger.org。
Sawtooth 项目
图 1.11.3.3 - Hyperledger Sawtooth 项目
Sawtooth 项目由 Intel 等企业于 2016 年 4 月提交到社区,包括 sawtooth-core、sawtooth-supply-chain、sawtooth-marketplace、sawtooth-seth、sawtooth-next-directory、sawtooth-explorer 等数十个子项目。核心代码在 Github 上地址为 https://github.com/hyperledger/sawtooth-core。
该项目的定位也是分布式账本平台,基于 Python 语言实现,目前核心项目的贡献者超过 70 人,提交次数已经超过 8000 次。
Sawtooth 项目利用 Intel 芯片的专属功能,实现了低功耗的 Proof of Elapsed Time(PoET)共识机制,并支持交易族(Transaction Family),方便用户使用它来快速开发应用。
项目的邮件列表地址为 sawtooth@lists.hyperledger.org。
Iroha 项目
图 1.11.3.4 - Hyperledger Iroha 项目
Iroha 项目由 Soramitsu 等企业于 2016 年 10 月提交到社区,包括 iroha、iroha-android、iroha-ios、iroha-python、iroha-javascript 等子项目。核心代码在 Github 上地址为 https://github.com/hyperledger/iroha。
该项目的定位是分布式账本平台框架,基于 C++ 语言实现,目前贡献者超过 50 人,提交次数已经超过 7000 次。
Iroha 项目在设计上类似 Fabric,同时提供了基于 C++ 的区块链开发环境,并考虑了移动端和 Web 端的一些需求。
项目的邮件列表地址为 iroha@lists.hyperledger.org。
Explorer 项目
图 1.11.3.5 - Hyperledger Explorer 项目
Explorer 项目由 Intel、DTCC、IBM 等企业于 2016 年 8 月提交到社区。核心代码在 Github 上地址为 https://github.com/hyperledger/blockchain-explorer,目前贡献者超过 40 人,提交次数超过 350 次。
该项目的定位是区块链平台的浏览器,基于 Node.js 语言实现,提供 Web 操作界面。用户可以使用它来快速查看底层区块链平台的运行信息,如区块个数、交易情况、网络状况等。
项目的邮件列表地址为 explorer@lists.hyperledger.org。
Cello 项目
图 1.11.3.6 - Hyperledger Cello 项目
Cello 项目由笔者领导的技术团队于 2017 年 1 月贡献到社区。Github 上仓库地址为 https://github.com/hyperledger/cello(核心代码)和 https://github.com/hyperledger/cello-analytics(侧重数据分析)。
该项目的定位为区块链网络的操作系统,实现区块链网络自动化部署,以及对区块链网络的运行时管理。使用 Cello,可以让区块链应用人员专注到应用开发,而无需关心底层平台的管理和维护。已有一些企业基于 Cello 项目代码构建了区块链即服务(Blockchain-as-a-Service)平台。
Cello 的主要开发语言为 Python 和 JavaScript 等,底层支持包括裸机、虚拟机、容器云(包括 Swarm、Kubernetes)等多种基础架构。目前贡献者超过 40 人,提交次数超过 1000 次。
项目的邮件列表地址为 cello@lists.hyperledger.org。
Indy 项目
图 1.11.3.7 - Hyperledger Indy 项目
Indy 项目由 Sovrin 基金会牵头进行开发,致力于打造一个基于区块链和分布式账本技术的数字身份管理平台。该平台支持去中心化,支持跨区块链和跨应用的操作,实现全球化的身份管理。Indy 项目于 2017 年 3 月底正式加入到超级账本项目。目前包括 indy-node、indy-sdk、indy-plenum、indy-hipe、indy-crypto、indy-agent 等项目。
该项目主要由 Python 语言开发,包括服务节点、客户端和通用库等,目前贡献者超过 60人,已有超过 5000 次提交。
项目的邮件列表地址为 indy@lists.hyperledger.org。
Composer 项目
图 1.11.3.8 - Hyperledger Composer 项目
Composer 项目由 IBM 团队于 2017 年 3 月底贡献到社区,试图提供一个 Hyperledger Fabric 的开发辅助框架。使用 Composer,开发人员可以使用 Javascript 语言定义应用逻辑,再加上资源、参与者、交易等模型和访问规则,生成 Hyperledger Fabric 支持的链码。
该项目主要由 Node.Js 语言开发,目前贡献者超过 80人,已有超过 5000 次提交。
项目的邮件列表地址为 composer@lists.hyperledger.org。
Burrow 项目
图 1.11.3.9 - Hyperledger Burrow 项目
Burrow 项目由 Monax、Intel 等企业于 2017 年 4 月提交到社区。核心代码在 Github 上地址为 https://github.com/hyperledger/burrow。
该项目的前身为 eris-db,基于 Go 语言实现的以太坊虚拟机,目前贡献者超过 20人,提交次数已经超过 2000 次。
Burrow 项目提供了支持以太坊虚拟机的智能合约区块链平台,并支持 Proof-of-Stake 共识机制(Tendermint)和权限管理,可以提供快速的区块链交易。
项目的邮件列表地址为 burrow@lists.hyperledger.org。
Quilt 项目
图 1.11.3.10 - Hyperledger Quilt 项目
Quilt 项目由 NTT、Ripple 等企业于 2017 年 10 月提交到社区。核心代码在 Github 上地址为 https://github.com/hyperledger/quilt。
Quilt 项目前身为 W3C 支持的 Interledger 协议的 Java 实现,主要试图为转账服务提供跨多个区块链平台的支持。目前贡献者超过 10人,提交次数已经超过 100 次。
项目的邮件列表地址为 quilt@lists.hyperledger.org。
Caliper 项目
图 1.11.3.11 - Hyperledger Caliper 项目
Caliper 项目由华为于 2018 年 3 月提交到社区。核心代码在 Github 上地址为 https://github.com/hyperledger/caliper。
Caliper 项目希望能为评测区块链的性能(包括吞吐、延迟、资源使用率等)提供统一的工具套装,主要基于 Node.js 语言实现,目前贡献者超过 20人,提交次数超过 300 次。
项目的邮件列表地址为 caliper@lists.hyperledger.org。
Ursa 项目
图 1.11.3.12 - Hyperledger Ursa 项目
Ursa 项目前身为加密实现库项目,由 Fujitsu、Sovrin、Intel、DFINITY、State Street、IBM、Bitwise IO 等企业的开发者于 2018 年 11 月正式贡献到社区。核心代码在 Github 上地址为 https://github.com/hyperledger/ursa。
Ursa 项目希望提供一套方便、安全的密码学软件库(包括加解密、零知识证明等),为实现区块链平台实现提供便利。主要基于 Rust 语言实现,目前包括两个子组件(基础密码实现库 Base Crypto 和零知识证明库 Z-Mix)。参与贡献者超过 10人,提交次数超过 400 次。
项目的邮件列表地址为 ursa@lists.hyperledger.org。
Grid 项目
Grid 项目由 Cargill、Intel 和 Bitwise IO 公司于 2018 年 12 月提交到社区。核心代码在 Github 上地址为 https://github.com/hyperledger/grid。
Grid 项目为开发基于区块链的供应链场景应用提供框架支持和参考实现,包括智能合约、数据模型、领域模型、样例应用等。 ,主要基于 Python 语言实现,并使用 Sabre(基于 WebAssembly/WASM 的智能合约引擎)来运行智能合约,目前贡献者超过 40人,提交次数超过 5000 次。
项目的邮件列表地址为 grid@lists.hyperledger.org。
开发必备工具
工欲善其事,必先利其器。开源社区提供了大量易用的开发协作工具。掌握好这些工具,对于高效的开发来说十分重要。
Linux Foundation ID
超级账本项目受到 Linux 基金会的支持,采用 Linux Foundation ID(LF ID)作为社区唯一的 ID。
个人申请 ID 是完全免费的。可以到 https://identity.linuxfoundation.org/ 进行注册。
用户使用该 ID 即可访问到包括 Jira、Gerrit、RocketChat 等社区的开发工具。
Jira - 任务和进度管理
图 1.11.4.1 - Jira 任务管理
Jira 是 Atlassian 公司开发的一套任务管理和事项跟踪的追踪平台,提供 Web 操作界面,使用十分方面。
社区采用 jira.hyperledger.org 作为所有项目开发计划和任务追踪的入口,使用 LF ID 即可登录。
登录之后,可以通过最上面的 Project 菜单来查看某个项目相关的事项,还可以通过 Create 按钮来快速创建事项(常见的包括 task、bug、improvement 等)。
用户打开事项后可以通过 assign 按钮分配给自己来领取该事项。
一般情况下,事项分为 TODO(待处理)、In Process(处理中)、In Review(补丁已提交、待审查)、Done(事项已完成)等多个状态,由事项所有者来进行维护。
Gerrit - 代码仓库和 Review 管理
图 1.11.4.2 - Gerrit 代码仓库管理
Gerrit 是一个负责代码协同的开源项目,很多企业和团队都使用它负责代码仓库管理和代码的审阅工作。Gerrit 使用十分方便,提供了基于 Web 的操作界面。
社区的 Fabric、Cello、Explorer 等项目都采用 gerrit.hyperledger.org 作为官方的代码仓库,并实时同步代码到 github.com/hyperledger 作为只读的镜像。
用户使用自己的 LF ID 登录之后,可以查看所有项目信息,也可以查看自己提交的补丁等信息。每个补丁的页面上会自动追踪修改历史,审阅人可以通过页面进行审阅操作,赞同提交则可以加分,发现问题则注明问题并进行减分。
RocketChat - 在线沟通
图 1.11.4.3 - RocketChat 在线沟通
除了邮件列表外,社区也为开发者们提供了在线沟通的渠道—— RocketChat。
RocketChat 是一款功能十分强大的在线沟通软件,支持多媒体消息、附件、提醒、搜索等功能,虽然是开源软件,但在体验上可以跟商业软件 Slack 媲美。支持包括网页、桌面端、移动端等多种客户端。
社区采用 chat.hyperledger.org 作为服务器。最简单的,用户直接使用自己的 LF ID 登录该网站,即可访问。之后可以自行添加感兴趣项目的频道。
用户也可以下载 RocketChat 客户端,添加 chat.hyperledger.org 作为服务器即可访问社区内的频道,跟广大开发者进行在线交流。
一般地,每个项目都有一个同名的频道作为主频道,例如 #Fabric
,#Cello
等。同时各个工作组也往往有自己的频道,例如大中华区技术工作组的频道为 #twg-china
。
邮件列表 - 常见渠道
最后,各个项目和工作组都建立了专门的邮件列表,作为常见的交流渠道。当发现问题不知道往哪里报告时,可以先发到邮件列表进行询问,一般都能获得及时的回答。
例如大中华区技术工作组的频道为 twg-china@lists.hyperledger.org
。
用户在 https://lists.hyperledger.org/g/main/subgroups 看到社区已有的邮件列表并选择加入。
提问的智慧
为什么我在社区提出的问题会过了很长时间也无人回应?
开源社区是松散自组织形式,大部分开发者都是利用业余时间进行开发和参与社区工作。因此,在社区提出问题时就必须要注意问题的质量和提问的方式。碰到上述情况,首先要先从自身找原因。
如果能做到下面几点,会让你所提出的问题得到更多的关注。
- 正确的渠道:这点十分重要。不同项目和领域有各自的渠道,一定要在相关的渠道进行提问而不要问跟列表主题不相关的话题,例如每个项目相关问题应该发送到对应的邮件列表。
- 问题的新颖性:在提问之前,应该利用包括搜索引擎、技术文档、邮件列表等常见方式进行查询,确保提出的问题是新颖的,有价值的,而不是已经被回答过多遍的常识性问题。
- 适当的上下文:不少提问者的问题中只包括一条很简单的错误信息,这样会让社区的开发者有心帮忙也无力回答。良好的上下文包括完整的环境信息、所使用的软件版本、所进行操作的详细步骤、问题相关的日志、以及自己对问题的思考等。这些都可以帮助他人快速重现问题并帮忙回答。
- 注意礼仪:虽然技术社区里大家沟通方式会更为直接一些,但懂得礼仪毫无疑问是会受到欢迎的。要牢记,别人的帮助并非是义务的,要对任何来自他人的帮助心存感恩。
贡献代码
超级账本的各个子项目,都提供了十分丰富的开发和提交代码的指南和文档,一般可以在代码的 docs
目录下找到。部分项目(如 Fabric、Cello 和 Explorer)使用了社区自建的 Gerrit 代码管理和评审方案,其他项目多数直接使用 Github 来管理流程。
这里以 Gerrit 方式为例讲解如何贡献代码到 Fabric 项目。
安装环境
推荐在 Linux(如 Ubuntu 18.04+)或 MacOS 环境中开发 Hyperledger 项目代码。
不同项目会依赖不同的环境,可以从项目文档中找到。以 Fabric 项目为例,开发需要安装如下依赖。
- Git:用来从 Gerrit 仓库获取代码并进行版本管理。
- Golang 1.10+:访问 golang.org 进行安装,之后需要配置
$GOPATH
环境变量。注意不同项目可能需要不同语言环境。 - Docker 1.18+:用来支持容器环境,MacOS 下推荐使用 Docker for Mac。
获取代码
首先注册 Linux Foundation ID(LF ID),如果没有可以到 https://identity.linuxfoundation.org/ 进行免费注册。
使用 LF ID 登陆 https://gerrit.hyperledger.org/,在配置页面(https://gerrit.hyperledger.org/r/#/settings/ssh-keys),添加个人 ssh Pub key,否则每次访问仓库需要手动输入用户名和密码。
查看项目列表,找到对应项目,采用 Clone with commit-msg hook
的方式来获取源码。
以 Fabric 项目为例,按照 Go 语言推荐代码结构,执行如下命令拉取代码,放到 $GOPATH/src/github.com/hyperledger/
路径下,其中 LF_ID
替换为用户个人的 Linux Foundation ID。
$ mkdir $GOPATH/src/github.com/hyperledger/
$ cd $GOPATH/src/github.com/hyperledger/
$ git clone ssh://LF_ID@gerrit.hyperledger.org:29418/fabric && scp -p -P 29418 LF_ID@gerrit.hyperledger.org:hooks/commit-msg fabric/.git/hooks/
如果没有添加个人 ssh pubkey,则可以通过 http 方式 clone,此时需要手动输入用户名和密码信息。
$ git clone http://LF_ID@gerrit.hyperledger.org/r/fabric && (cd fabric && curl -kLo `git rev-parse --git-dir`/hooks/commit-msg http://LF_ID@gerrit.hyperledger.org/r/tools/hooks/commit-msg; chmod +x `git rev-parse --git-dir`/hooks/commit-msg)
如果是首次使用 Git,可能还会提示配置默认的用户名和 Email 地址等信息。通过如下命令进行简单配置即可。
$ git config user.name "your name"
$ git config user.email "your email"
编译和测试
大部分编译和安装过程都可以利用 Makefile 来执行,具体以项目代码为准。以 Fabric 项目为例,包括如下常见操作。
安装 go tools
执行如下命令。
$ make gotools
语法格式检查
执行如下命令。
$ make linter
编译 peer
执行如下命令。
$ make peer
会自动编译生成 Docker 镜像,并生成本地 peer 可执行文件。
注意:有时候会因为获取安装包不稳定而报错,需要执行 make clean
,然后再次执行。
生成 Docker 镜像
执行如下命令。
$ make images
执行所有的检查和测试
执行如下命令。
$ make checks
执行单元测试
执行如下命令。
$ make unit-test
如果要运行某个特定单元测试,则可以通过类似如下格式。
$ go test -v -run=TestGetFoo
执行 BDD 测试
需先生成本地 Docker 镜像。
执行如下命令。
$ make behave
提交代码
仍然使用 LF ID 登录 jira.hyperledger.org,查看有没有未分配(unassigned)的任务,如果对某个任务感兴趣,可以添加自己为任务的 assignee。任何人都可以自行创建新的任务。
初始创建的任务处于 TODO
状态;开始工作后可以标记为 In Progress
状态;提交对应补丁后需要更新为 In Review
状态;任务完成后更新为 Done
状态。
如果希望完成某个任务(如 FAB-XXX),则对于前面 Clone 下来的代码,本地创建新的分支 FAB-XXX。
$ git checkout -b FAB-XXX
实现任务代码,完成后,执行语法格式检查和测试等,确保所有检查和测试都通过。
提交代码到本地仓库。
$ git commit -a -s
会自动打开一个编辑器窗口,需要填写 commit 信息,格式一般要求为:
[FAB-XXX] Quick brief on the change
This pathset fixes a duplication msg bug in gossip protocol.
A more detailed description can be here, with several paragraphs and
sentences, including issue to fix, why to fix, what is done in the
patchset and potential remaining issues...
提交消息中要写清楚所解决的问题、为何进行修改、主要改动内容、遗留问题等,并且首行宽不超过 50 个字符,详情段落行宽不要超过 72 个字符。
如果是首次往官方仓库提交代码,需要先配置 git review
,根据提示输入所需要的用户名密码等。
$ git review -s
验证通过后可以使用 git review 命令推送到远端仓库,推送成功后会得到补丁的编号和访问地址。
$ git review
例如:
$ git review
remote: Processing changes: new: 1, refs: 1, done
remote:
remote: New Changes:
remote: http://gerrit.hyperledger.org/r/YYY [FAB-XXX] Fix some problem
remote:
To ssh://gerrit.hyperledger.org:29418/fabric.git
* [new branch] HEAD -> refs/publish/master/FAB-XXX
评审代码
提交成功后,可以打开 gerrit.hyperledger.org/r/,查看自己最新提交的 patchset 信息。新提交的 patchset 会自动触发 CI 的测试任务,测试都通过后可邀请项目的维护者(maintainer)们进行评审。为了引起关注,可将链接添加到对应的 Jira 任务,并在 RocketChat 上的项目频道贴出。
注:手动触发某个 CI 测试任务可以通过 Run 命令,例如重新运行单元测试可以使用 Run UnitTest。
如果评审通过,则会被合并到主分支。否则还需要针对审阅意见进一步的修正。修正过程跟提交代码过程类似,唯一不同是提交的时候添加 -a --amend
参数。
$ git commit -a --amend
表示这个提交是对旧提交的一次修订。
一般情况下,为了方便评审,尽量保证每个 patchset 完成的改动不要太多(最好不要超过 200 行),并且实现功能要明确,集中在对应 Jira 任务定义的范围内。
完整流程
图 1.11.5.1 - 代码提交流程
总结下,完整的流程如上图所示,开发者用 git 进行代码的版本管理,用 gerrit 进行代码的评审合作。
如果需要修复某个提交补丁的问题,则通过 git commit -a --amend
进行修复,并作为补丁的新版本再次提交审阅。每次通过 git review
提交时,应当通过 git log
查看确保本地只有一条提交记录。
本章小结
超级账本项目是 Linux 基金会重点支持的面向企业的分布式账本平台。它同时也是开源界和工业界颇有历史意义的合作成果,将为分布式账本技术提供了在代码实现、协议和规范标准上的技术参考。
成立两年多时间以来,超级账本社区已经吸引了国内外各行业的大量关注,并获得了飞速发展。社区的开源项目、工作组和会员企业,共同构造了完善的企业级区块链生态。同时,超级账本项目中提出的许多创新技术和设计,也得到了来自业界和开源界的认可。
超级账本社区也十分重视应用落地。目前基于超级账本相关技术,已经出现了大量的企业应用案例,这为更多企业使用区块链技术提供了很好的应用参考。