在 亚马逊云科技 上实施以太坊智能合约开发的 CI/CD 管道 — 第 1 部分

作者: Rafia Tapia | 202 3 年 8 月

持续集成和持续交付 (CI/CD) 是一个自动化软件开发工作流程并部署质量更高的软件以避免错误和代码失败的过程。CI/CD 消除了传统上将代码从开发环境更改到生产服务器所需的手动人工干预。使用 CI/CD 管道,可以自动检测、构建、测试代码更改并将其推送到生产环境。在任何采用现代软件开发技术的组织中,CI/CD 都是 DevOps 的重要组成部分。CI/CD 帮助开发、安全和运营团队尽可能紧密、高效地合作。它减少了繁琐而耗时的手动开发工作和传统的批准流程,使开发运营团队能够在软件开发中更具创新性。许多现代应用程序本质上都非常复杂,在为区块链技术构建去中心化应用程序时确实如此。尽管许多区块链开发团队都了解 CI/CD 的好处,但缺乏指导和可用的工件使许多区块链开发人员无法将 CI/CD 纳入他们的开发工作流程。本博客系列的目的是解决这一缺点,为实现区块链应用程序开发的 CI/CD 管道提供指导和即用型工件。

这是由两部分组成的系列的第一篇文章。在这篇文章中,我们概述了智能合约 CI/CD 管道的架构和工作流程。本系列的第二篇文章将引导您完成 CI/CD 管道的完整 实施 AW S 云开发套件 (亚马逊云科技 CDK) 。CDK 是一个用于在代码中定义云基础架构的框架。

区块链和智能合约

区块链是一种分布式不可变账本技术,可简化分布式参与者之间记录交易和跟踪资产的过程。分布式账本由许多使用共识协议相互同步的计算机节点共享。

以太坊 是第一个引入 智能合约概念的区块链网络 。智能联系人是一种可执行代码,分布在参与区块链网络的所有计算机节点上。在像以太坊这样的公共区块链网络中,智能合约允许网络中的任何参与者都能看到业务逻辑和工作流程,并在参与者之间建立信任。

尽管以太坊是第一个引入智能合约概念的网络,但大多数区块链现在已经在其网络中纳入了智能合约的概念。就本文而言,重点将放在与以太坊和其他以太坊虚拟机(EVM)兼容网络相关的智能合约的开发上。EVM 是以太坊中智能合约的执行环境,还有其他区块链网络在其内部实现相同的可执行环境。

EVM 的智能合约是用专用语言编写的,其中 Solidity 最受欢迎。尽管本文附带的所有示例代码都使用Solidity作为智能合约开发的语言,但本文中介绍的技术可以应用于其他语言。

智能合约开发

智能合约开发包括使用诸如 Solidity之 类的语言编写代码 ,使用适当的工具进行编译,然后将其部署到区块链网络上进行测试和调试。可以部署智能合约代码的区块链网络主要有三种类型:

  • 以太坊主网 — 这是生产以太坊网络,需要真正的以太币(以太坊数字货币)来部署智能合约。在每个区块链网络中,其底层数字货币都用于支付运营区块链网络所需的计算和存储资源。 Amazon Managed Bloc kchain (AMB)是一项完全托管的区块链服务,提供连接以太坊主网的专用节点。
  • 以太坊 T estnets — 这些测试网络不需要真正的以太币,但需要测试以太币,可以从各自的水龙头免费获得,以部署智能合约。从测试网络水龙头获得的以太币没有真正的货币价值,但这些以太币的可用性仍然有限。开发人员可以使用Testnets来测试他们的智能合约并将其与其他第三方智能合约集成。Amazon Managed Blockchain 为包括 Goer li在内的许多热门测试网络提供支持。在这篇文章中,我们将讨论在 CI/CD 的背景下部署到 Goerli 网络的问题。
  • 开发网络 — 由于测试网和主网网络都需要获取以太币才能部署和写入区块链网络,因此将其用于开发和测试目的是不可行的。因此,通常在单台计算机上运行的开发网络被广泛用于此目的。开发网络可以允许无限数量的测试以太币,没有任何限制,因此,非常适合调试和测试。 Ganache 就是这样一个开发网络。有关如何设置 Ganache 和其他区块链开发工具的完整分步指南,请参阅使用 亚马逊托管区块链 开发全栈无服务器 NFT 应用程序——第 1 部分

智能合约开发要求开发人员获得新编程语言的技能和知识以及专门为智能合约开发设计的专用工具和IDE扩展。对于开发去中心化应用程序 (DApp) 的大型团队来说,通常会有一组开发人员在开发智能合约,而另一组开发人员在开发应用程序的前端或中间层组件。由于大多数区块链开发网络都运行在本地主机端点上的单台计算机上,因此支持需要将前端应用程序或中间层应用程序连接到运行智能合约的网络的多开发者环境变得具有挑战性。许多多开发者团队面临的另一个挑战是商定用于智能合约开发的单一开发者框架。 Truffle Hardhat 是两个非常受欢迎的开发框架,但大多数开发人员会选择其中一个,因此,将他们的工作结合起来进行集成的测试和构建环境变得具有挑战性。为智能合约开发实施 CI/CD 管道可以解决这两个难题。

解决方案概述

下图显示了许多 亚马逊云科技 服务,它们协同工作以支持智能合约开发的 CI/CD 管道。

在以下部分中,我们将更详细地讨论关键组件。

计算

CI/CD 基础设施中的第一个组件是区块链开发网络,它可以支持许多开发人员连接到该网络进行集成测试。在这个参考架构中,我们使用 Hyperledger Besu 作为区块链开发网络。它被配置为在 亚马逊弹性容器服务 (Amazon ECS) 上运行。Hyperledger Besu 是一款以太坊客户端,设计用于公共和私有网络用例,实现了 EVM,便于企业使用。Amazon ECS 是一项完全托管的容器编排服务,可简化容器化应用程序的部署、管理和扩展。Amazon ECS 提供两种产品:一种需要配置 亚马逊弹性计算云 (Amazon EC2) 实例,另一种是 亚马逊云科技 Fargate ,它是一款无服务器产品。

在上述解决方案架构中,智能合约中的函数由运行在 亚马逊云科技 Lambda 中的代码调用。亚马逊云科技 Lambda 是一种无服务器、事件驱动的计算服务,允许您为几乎任何类型的应用程序或后端服务运行代码,而无需预置或管理服务器。CI/CD 管道使用 AMB 连接到以太坊主网和 Goerli 测试网络。

存储

就像任何其他区块链网络一样, Hyperledger Besu 也有底层账本数据库存储空间。在参考实现中, 亚马逊弹性文件系统 (Amazon EFS) 用于存储账本数据库和运行 Hyperledger Besu 的所有配置文件。Amazon EFS 是一个简单、无服务器、弹性、一劳永逸的文件系统,可在您添加和删除文件时自动扩展和缩小,无需管理或配置。您可以将亚马逊 EFS 与亚马逊 EC2、Lambda、亚马逊 ECS、 亚马逊弹性 Kubernetes 服务 (亚马逊 EKS)和其他 亚马逊云科技 计算实例或本地服务器一起使用。运行 Hyperledger Besu 时将计算与存储分开,可提供高水平的可扩展性和可用性。在启动 Besu 网络之前,Hyperledger Besu 的配置文件将从 亚马逊 Simple Storage Servic e (亚马逊 S3)复制到亚马逊 EFS。 亚马逊云科技 Data Sync 将 Besu 配置文件从亚马逊 S3 复制到亚马逊 EFS。DataSync 是一项在线数据移动和发现服务,可简化数据迁移,并帮助您快速、轻松、安全地在 亚马逊云科技 存储服务之间传输文件或对象数据。

开发运营

任何 CI/CD 实现的组成部分都是代码存储库,用于存储许多开发应用程序代码的开发人员提交的所有代码更改。 亚马逊云科技 C odeCommit 是一项版本控制服务,允许您存储和管理 Git 存储库。开发人员在本地完成代码测试后,他们将经过单元测试的代码推送到 CodeCommit,后者将启动 CI/CD 管道。

构建、测试和部署智能合约代码到不同区块链网络的大部分自动化工作都由 亚马逊云科技 Code Build 执行。CodeBuild 是一项完全托管的构建服务,可编译您的源代码、运行测试并生成准备部署的构件。

每当在区块链网络上部署智能合约时,都会创建一个新的合约地址,该地址用于与已部署的智能合约建立连接。任何需要调用智能合约中函数的代码都需要能够访问智能合约地址以及智能合约的 应用程序二进制接口 (ABI) 。ABI 定义了一个二进制程序向另一个二进制程序公开的功能。在智能合约的上下文中,它是智能合约实现的功能,可以由智能合约之外的任何代码调用。在参考实现中,通过 Lambda 实现的 REST API 层调用智能合约,因此需要访问合约地址和 ABI。作为 CI/CD 流程的一部分,当 CodeBuild 将智能合约部署到区块链网络时,它还会使用最新的合约 ABI 和地址更新 Lambda 代码。

最后, 亚马逊云科技 CodePipeline 通过集成 CodeCommit 和 CodeBuild 来实现整个发布管道 的自动化,从而 定义了 CI/CD 自动化工作流程。

安全

定义了多个 亚马逊云科技 身份和访问管理 (IAM) 策略和角色,以授予访问各种 亚马逊云科技 服务的权限,从而在 CI/CD 管道中执行各种任务。本系列的第二部分详细讨论了这些角色和策略及其定义的特定访问权限。

向区块链网络部署智能合约始终使用具有足够以太币余额的钱包账户来进行部署。像 Ganache 或 Besu 这样的开发网络会创建一些测试账户,为这些账户提供任意数量的以太币用于测试和调试。无论将智能合约部署到哪个区块链网络,CodeBuild 都需要访问用于部署智能合约的钱包的私钥。在这里,我们使用 亚马逊云科技 Secrets Manag er 来存储与分层确定性 (HD) 钱包相关的助记符,以检索用于部署智能合约的账户的私钥。Secrets Manager 可帮助管理、检索和轮换数据库凭证、API 密钥和其他密钥。访问助记符意味着可以访问与该助记符相关的所有私钥,因此,应格外注意保护助记符字符串。

CI/CD 流水线工作流程

在本节中,我们将讨论如何实现智能合约 CI/CD 管道的逻辑流程。本系列的第 2 部分将向您介绍实现整个管道的 亚马逊云科技 CDK 代码。

下图显示了完整的 CI/CD 管道。

CI-CD Flow

第 1 步:开发者提交代码

每位开发人员都使用自己选择的 IDE 和开发框架(例如 Truffle 或 Hardhat)来开发自己的开发环境。当他们完成代码的单元测试后,他们会将代码推送到 CodeCommit 上的 Git 存储库。提交给 CodeCommit 的代码将在合约文件夹中包含所有智能合约代码(.sol 文件),而 package.json 将具有智能合约代码的任何依赖关系。如果有测试脚本,也可以将这些脚本添加到测试文件夹。图 1 显示了代码存储库可能是什么样子。

Smart Contract Code
图 1

第 2 步:代码管道触发 CodeBuild 来编译智能合约

为了让 CI/CD 管道启动发布管道流程,代码必须位于主分支/主分支中。如果有任何批准流程可以将代码推送到主分支/主分支,则应将其纳入管道工作流程。CodePipeline 监控 Git 存储库,推送到主分支将触发 CodeBuild 开始编译智能合约。管道工作流程如图 2 所示。

CI/CD Step 1
图 2

第 3 步:CodeBuild 编译智能合约并将其部署到 Hyperledger Besu

CodeBuild 编译智能合约,它会生成一个新的智能合约 ABI。如果智能合约编译时没有任何错误,则CodeBuild会将智能合约代码部署到Besu区块链网络。要将代码部署到区块链网络,它会获取用于部署代码的账户的私钥。CodeBuild 根据存储在 Secrets Manager 中的高清钱包助记符来计算这个私钥。当 CodeBuild 将合约部署到 Besu 时,它会获得与已部署的合约关联的合约地址。图 3 显示了此步骤。

CI/CD Step3
图 3

步骤 4:CodeBuild 运行测试脚本

将智能合约部署到 Hyperledger Besu 后,CodeBuild 会运行在智能合约的 git 存储库的测试文件夹中找到的所有测试。本系列第二部分中的示例实现使用 Chaijs 和 Mochajs 测试框架来定义测试脚本。

第 5 步:CodeBuild 更新 Lambda 函数

CodeBuild 更新了作为 REST API 层一部分的 Lambda 函数。除了智能合约外,Git 存储库还包含构成 REST API 层的代码。第 2 部分将讨论的 亚马逊云科技 CDK 代码示例包含用于 REST API 层的代码。

如图 4 所示,索引.mjs 文件包含 Lambda 处理程序,而 assetToken.json 文件是合约 ABI 文件,索引.mjs 需要该文件来调用智能合约中的函数。

CI/CD Lambda Code
图 4

在此步骤中,CodeBuild 使用存储在 AssetToken.json 中的正确 ABI 更新 Lambda 函数。它还更新了包含智能合约地址的 Lambda 函数的环境变量。

步骤 6:手动批准流程触发管道的下一阶段

该系列第二部分中的示例实施包括从开发阶段转移到Goerli部署阶段的手动批准,但是组织可以选择在没有任何手动批准流程的情况下进行这种过渡。

第 7 步:使用 AMB 将智能合约部署到测试网或主网

Besu 网络为开发阶段的集成测试提供了基础设施。该管道的下一阶段可能是将智能合约部署到像Goerli这样的测试网络或主网。在本系列的第2部分所示的示例实现中,智能合约在手动批准后被部署到Goerli网络。

结论

本系列的第 1 部分到此结束。在这篇文章中,我们概述了为兼容 EVM 的智能合约实施 CI/CD 管道所需的 亚马逊云科技 基础设施。我们还提供了 CI/CD 管道如何运作的分步指南。

在本系列的第 2 部分中,我们展示了这个 CI/CD 管道的端到端实现。我们将演示如何使用 亚马逊云科技 CDK 创建整个基础设施,并详细解释 亚马逊云科技 CDK 代码的每个组成部分。


作者简介

Rafia Tapia 是一位区块链解决方案架构专家。她拥有超过27年的软件开发和架构经验,对开发智能合约和区块链技术的设计模式和最佳实践有着浓厚的兴趣。