我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
在 亚马逊云科技 上实施以太坊智能合约开发的 CI/CD 管道 — 第 1 部分
持续集成和持续交付 (CI/CD) 是一个自动化软件开发工作流程并部署质量更高的软件以避免错误和代码失败的过程。CI/CD 消除了传统上将代码从开发环境更改到生产服务器所需的手动人工干预。使用 CI/CD 管道,可以自动检测、构建、测试代码更改并将其推送到生产环境。在任何采用现代软件开发技术的组织中,CI/CD 都是 DevOps 的重要组成部分。CI/CD 帮助开发、安全和运营团队尽可能紧密、高效地合作。它减少了繁琐而耗时的手动开发工作和传统的批准流程,使开发运营团队能够在软件开发中更具创新性。许多现代应用程序本质上都非常复杂,在为区块链技术构建去中心化应用程序时确实如此。尽管许多区块链开发团队都了解 CI/CD 的好处,但缺乏指导和可用的工件使许多区块链开发人员无法将 CI/CD 纳入他们的开发工作流程。本博客系列的目的是解决这一缺点,为实现区块链应用程序开发的 CI/CD 管道提供指导和即用型工件。
这是由两部分组成的系列的第一篇文章。在这篇文章中,我们概述了智能合约 CI/CD 管道的架构和工作流程。本系列的第二篇文章将引导您完成 CI/CD 管道的完整 实施
区块链和智能合约
区块链是一种分布式不可变账本技术,可简化分布式参与者之间记录交易和跟踪资产的过程。分布式账本由许多使用共识协议相互同步的计算机节点共享。
尽管以太坊是第一个引入智能合约概念的网络,但大多数区块链现在已经在其网络中纳入了智能合约的概念。就本文而言,重点将放在与以太坊和其他以太坊虚拟机(EVM)兼容网络相关的智能合约的开发上。EVM 是以太坊中智能合约的执行环境,还有其他区块链网络在其内部实现相同的可执行环境。
EVM 的智能合约是用专用语言编写的,其中 Solidity 最受欢迎。尽管本文附带的所有示例代码都使用Solidity作为智能合约开发的语言,但本文中介绍的技术可以应用于其他语言。
智能合约开发
智能合约开发包括使用诸如
- 以太坊主网 — 这是生产以太坊网络,需要真正的以太币(以太坊数字货币)来部署智能合约。在每个区块链网络中,其底层数字货币都用于支付运营区块链网络所需的计算和存储资源。
Amazon Managed Bloc kchain (AMB)是一项完全托管的区块链服务,提供连接以太坊主网的专用节点。 - 以太坊 T estnets — 这些测试网络不需要真正的以太币,但需要测试以太币,可以从各自的水龙头免费获得,以部署智能合约。从测试网络水龙头获得的以太币没有真正的货币价值,但这些以太币的可用性仍然有限。开发人员可以使用Testnets来测试他们的智能合约并将其与其他第三方智能合约集成。Amazon Managed Blockchain 为包括
Goer li在内的许多热门测试网络提供支持。在这篇文章中,我们将讨论在 CI/CD 的背景下部署到 Goerli 网络的问题。 - 开发网络 — 由于测试网和主网网络都需要获取以太币才能部署和写入区块链网络,因此将其用于开发和测试目的是不可行的。因此,通常在单台计算机上运行的开发网络被广泛用于此目的。开发网络可以允许无限数量的测试以太币,没有任何限制,因此,非常适合调试和测试。
Ganache 就是这样一个开发网络。有关如何设置 Ganache 和其他区块链开发工具的完整分步指南,请参阅使用亚马逊托管区块链 开发全栈无服务器 NFT 应用程序——第 1 部分 。
智能合约开发要求开发人员获得新编程语言的技能和知识以及专门为智能合约开发设计的专用工具和IDE扩展。对于开发去中心化应用程序 (DApp) 的大型团队来说,通常会有一组开发人员在开发智能合约,而另一组开发人员在开发应用程序的前端或中间层组件。由于大多数区块链开发网络都运行在本地主机端点上的单台计算机上,因此支持需要将前端应用程序或中间层应用程序连接到运行智能合约的网络的多开发者环境变得具有挑战性。许多多开发者团队面临的另一个挑战是商定用于智能合约开发的单一开发者框架。
解决方案概述
下图显示了许多 亚马逊云科技 服务,它们协同工作以支持智能合约开发的 CI/CD 管道。
在以下部分中,我们将更详细地讨论关键组件。
计算
CI/CD 基础设施中的第一个组件是区块链开发网络,它可以支持许多开发人员连接到该网络进行集成测试。在这个参考架构中,我们使用
在上述解决方案架构中,智能合约中的函数由运行在
存储
就像任何其他区块链网络一样,
开发运营
任何 CI/CD 实现的组成部分都是代码存储库,用于存储许多开发应用程序代码的开发人员提交的所有代码更改。
构建、测试和部署智能合约代码到不同区块链网络的大部分自动化工作都由
每当在区块链网络上部署智能合约时,都会创建一个新的合约地址,该地址用于与已部署的智能合约建立连接。任何需要调用智能合约中函数的代码都需要能够访问智能合约地址以及智能合约的
最后,
安全
定义了多个
向区块链网络部署智能合约始终使用具有足够以太币余额的钱包账户来进行部署。像 Ganache 或 Besu 这样的开发网络会创建一些测试账户,为这些账户提供任意数量的以太币用于测试和调试。无论将智能合约部署到哪个区块链网络,CodeBuild 都需要访问用于部署智能合约的钱包的私钥。在这里,我们使用
CI/CD 流水线工作流程
在本节中,我们将讨论如何实现智能合约 CI/CD 管道的逻辑流程。本系列的第 2 部分将向您介绍实现整个管道的 亚马逊云科技 CDK 代码。
下图显示了完整的 CI/CD 管道。
第 1 步:开发者提交代码
每位开发人员都使用自己选择的 IDE 和开发框架(例如 Truffle 或 Hardhat)来开发自己的开发环境。当他们完成代码的单元测试后,他们会将代码推送到 CodeCommit 上的 Git 存储库。提交给 CodeCommit 的代码将在合约文件夹中包含所有智能合约代码(.sol 文件),而 package.json 将具有智能合约代码的任何依赖关系。如果有测试脚本,也可以将这些脚本添加到测试文件夹。图 1 显示了代码存储库可能是什么样子。
图 1
第 2 步:代码管道触发 CodeBuild 来编译智能合约
为了让 CI/CD 管道启动发布管道流程,代码必须位于主分支/主分支中。如果有任何批准流程可以将代码推送到主分支/主分支,则应将其纳入管道工作流程。CodePipeline 监控 Git 存储库,推送到主分支将触发 CodeBuild 开始编译智能合约。管道工作流程如图 2 所示。
图 2
第 3 步:CodeBuild 编译智能合约并将其部署到 Hyperledger Besu
CodeBuild 编译智能合约,它会生成一个新的智能合约 ABI。如果智能合约编译时没有任何错误,则CodeBuild会将智能合约代码部署到Besu区块链网络。要将代码部署到区块链网络,它会获取用于部署代码的账户的私钥。CodeBuild 根据存储在 Secrets Manager 中的高清钱包助记符来计算这个私钥。当 CodeBuild 将合约部署到 Besu 时,它会获得与已部署的合约关联的合约地址。图 3 显示了此步骤。
图 3
步骤 4:CodeBuild 运行测试脚本
将智能合约部署到 Hyperledger Besu 后,CodeBuild 会运行在智能合约的 git 存储库的测试文件夹中找到的所有测试。本系列第二部分中的示例实现使用
第 5 步:CodeBuild 更新 Lambda 函数
CodeBuild 更新了作为 REST API 层一部分的 Lambda 函数。除了智能合约外,Git 存储库还包含构成 REST API 层的代码。第 2 部分将讨论的 亚马逊云科技 CDK 代码示例包含用于 REST API 层的代码。
如图 4 所示,索引.mjs 文件包含 Lambda 处理程序,而 assetToken.json 文件是合约 ABI 文件,索引.mjs 需要该文件来调用智能合约中的函数。
图 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年的软件开发和架构经验,对开发智能合约和区块链技术的设计模式和最佳实践有着浓厚的兴趣。
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。