`lnd` 的可复现构建系统

本文介绍了lnd(Lightning Network Daemon)的可复现构建系统,该系统允许开发者在不同机器上构建完全相同的二进制文件,从而验证发布的二进制文件。文章详细说明了如何构建新版本、在macOS和Linux/Windows上进行发布,以及如何验证发布版本和Docker镜像的步骤。同时,也说明了如何对manifest文件进行签名。

lnd 的可复现构建系统

这个包包含了 lnd 项目用来为每个新版本构建二进制文件的构建脚本。从 go1.13 开始,通过一些新的构建标志,二进制文件现在是可复现的,允许开发者在不同的机器上构建二进制文件,并最终得到一个字节对字节完全相同的二进制文件。然而,这在 go1.13 中并没有得到完全解决,因为构建系统仍然包含了二进制文件构建所在的目录本身。因此,我们的脚本利用了一个在 go1.13.2 之前需要的变通方法。

构建新版本

macOS

首要的要求是在本地安装并运行 docker。第二个要求是安装 make。其他的一切(包括 golang)都包含在发布助手镜像中。

要构建一个版本,运行以下命令:

$  git clone https://github.com/lightningnetwork/lnd.git
$  cd lnd
$  git checkout <TAG> # <TAG> 是下一个版本/tag 的名称
$  make docker-release tag=<TAG>

其中 <TAG>lnd 的下一个版本的名称。

Linux/Windows (WSL)

在 Linux 或 macOS 上构建发布二进制文件不需要事先设置。然而,在 Windows 上,目前构建发布二进制文件的唯一方法是使用 Windows Subsystem Linux。可以按照以下步骤构建发布二进制文件:

$  git clone https://github.com/lightningnetwork/lnd.git
$  cd lnd
$  git checkout <TAG> # <TAG> 是下一个版本/tag 的名称
$  make release tag=<TAG>

然后,这将创建一个 lnd-<TAG> 形式的目录,其中包含每个支持的操作系统和架构的发布二进制文件的归档文件,以及一个包含每个归档文件哈希值的 manifest 文件。

验证版本

使用 go1.13,第三方现在可以验证发布二进制文件。在此 go 版本之前,人们必须信任发布管理者来构建正确的二进制文件。有了这个新系统,第三方现在可以独立地运行发布过程,并验证所有发布二进制文件的哈希值与所述第三方生成的发布二进制文件的哈希值完全匹配。

要验证一个版本,必须获得以下工具(其中许多工具在大多数 Unix 系统中默认安装):gpg/gpg2shashumtar/unzip

完成之后,验证者可以按照以下步骤操作:

  1. 获取包含特定操作系统和架构的发布二进制文件的归档文件,以及 manifest 文件及其签名。
  2. 使用 gpg --verify manifest-<TAG>.txt.sig 验证 manifest 文件的签名。这将需要获取签署 manifest 文件的 PGP 密钥,这些密钥包含在发布说明中。
  3. 使用 shasum -a 256 <filename> 重新计算归档文件的 SHA256 哈希值,在 manifest 文件中找到对应的哈希值,并确保它们完全匹配。

此时,如果验证者信任发布管理者的完整性,则可以使用获取的发布二进制文件。否则,可以按照指南验证发布二进制文件是否已正确构建,方法是获取 shasumgo(与发布中使用的版本相同):

  1. 提取归档文件中包含的发布二进制文件,计算它们的哈希值(如上所述),并记录下来。
  2. 确保已安装 go,与发布说明中记录的版本相同。
  3. 使用 git clone https://github.com/lightningnetwork/lnd 获取 lnd 源代码的副本,并使用 git checkout <TAG> 检出发布的源代码。
  4. 继续使用 git verify-tag <TAG> 验证 tag,并使用 make release sys=OS-ARCH tag=<TAG> 从源代码编译用于目标操作系统和架构的二进制文件。
  5. 提取在发布脚本创建的 lnd-<TAG> 目录中找到的归档文件,并使用 shasum -a 256 <filename> 重新计算发布二进制文件(lnd 和 lncli)的 SHA256 哈希值。这些哈希值应与上面记录的哈希值完全匹配。

验证 Docker 镜像

为了验证 官方提供的 docker 镜像 中的 lndlncli 二进制文件是否与已签名、可复现的发布二进制文件一致,镜像中有一个验证脚本可以调用(例如,在启动容器之前):

$  docker run --rm --entrypoint="" lightninglabs/lnd:v0.12.1-beta /verify-install.sh v0.12.1-beta
$  OK=$?
$  if [ "$OK" -ne "0" ]; then echo "Verification failed!"; exit 1; done
$  docker run lightninglabs/lnd [command-line options]

签署现有的 Manifest 文件

如果你是 lnd 的开发者,并且有兴趣将你的签名附加到最终的发布归档文件中,则 manifest 必须以允许我们的验证脚本 scripts/verify-install.sh 验证你的签名的方式进行签名。

假设你已经为所有发布目标完成了本地构建,那么你应该有一个名为 manifest-TAG.txt 的文件,其中 TAG 是被签名的实际发布 tag 描述。发布脚本期望每个包含的签名都有一个特定的文件名,因此我们需要在签名期间修改输出签名的名称。

假设 USERNAME 是你当前作为开发者的昵称,那么以下命令将生成正确的签名:

$  gpg --detach-sig --output manifest-USERNAME-TAG.sig manifest-TAG.txt
  • 原文链接: github.com/lightningnetw...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
lightningnetwork
lightningnetwork
江湖只有他的大名,没有他的介绍。