:::info 日期:2019 年 08 月 29 日
作者:Katie Hockman
原文链接:https://go.dev/blog/module-mirror-launch :::

我们很高兴与大家分享我们的模块镜像索引校验和数据库现在已准备好投入生产! go 命令将默认为 Go 1.13 模块用户使用模块镜像和校验和数据库。 有关这些服务的隐私信息,请参阅 proxy.golang.org/privacy,有关配置的详细信息,请参阅 go 命令文档,包括如何禁用这些服务器或使用不同的服务器。 如果您依赖于非公共模块,请参阅配置环境的文档

这篇文章将描述这些服务和使用它们的好处,并总结 Go 模块代理:Gophercon 2019 上的查询的生命周期的一些要点。如果您对完整的谈话感兴趣,请参阅录音

模块镜像

模块是一组版本化的 Go 包,每个版本的内容是不可变的。 这种不变性为缓存和身份验证提供了新的机会。 当 go get 在模块模式下运行时,它必须获取包含请求包的模块,以及该模块引入的任何新依赖项,并根据需要更新 go.mod go.sum 文件。 从版本控制中获取模块在延迟和系统存储方面可能会很昂贵:go 命令可能被迫下拉包含传递依赖项的存储库的完整提交历史记录,即使是未构建的存储库,只是为了 解决它的版本。

解决方案是使用模块代理,它提供更适合 go 命令需求的 API(请参阅 go help goproxy)。 当 go get 在带有代理的模块模式下运行时,它会通过只询问特定的模块元数据或它需要的源代码来更快地工作,而不用担心其余的。 下面是 go 命令如何通过请求版本列表,然后是最新标记版本的信息、mod 和 zip 文件,将代理与 go get 一起使用的示例。
Screen Shot 2021-09-26 at 9.38.42 AM.png
模块镜像是一种特殊的模块代理,它在自己的存储系统中缓存元数据和源代码,允许镜像继续为原始位置不再可用的源代码提供服务。 这可以加快下载速度并保护您免于消失的依赖项。 有关更多信息,请参阅 2019 年的 Go 模块

Go 团队维护了一个模块镜像,在 proxy.golang.org 上提供服务,从 Go 1.13 开始,go 命令将默认为模块用户使用该镜像。 如果您运行的是早期版本的 go 命令,那么您可以通过在本地环境中设置 GOPROXY=https://proxy.golang.org 来使用此服务。

校验和数据库

Modules 引入了 go.sum 文件,它是第一次下载时每个依赖项的源代码和 go.mod 文件的 SHA-256 哈希列表。 go 命令可以使用散列来检测源服务器或代理的不当行为,这些服务器或代理为您提供相同版本的不同代码。

这个 go.sum 文件的局限性在于它在您第一次使用时完全信任。 当你向你的模块添加一个你以前从未见过的依赖版本时(可能是通过升级现有的依赖),go 命令会获取代码并将行添加到 go.sum 文件中。 问题是那些 go.sum 行没有被检查其他人的行:它们可能与 go 命令刚刚为其他人生成的 go.sum 行不同,可能是因为代理故意提供针对您的恶意代码。

Go 的解决方案是 go.sum 行的全局来源,称为校验和数据库,它确保 go 命令始终将相同的行添加到每个人的 go.sum 文件中。 每当 go 命令接收到新的源代码时,它可以根据这个全局数据库验证该代码的哈希值,以确保哈希值匹配,确保每个人都使用相同的代码用于给定版本。

校验和数据库由 sum.golang.org 提供服务,并建立在由 Trillian 支持的哈希透明日志(或“Merkle 树”)之上。 Merkle 树的主要优点是它是防篡改的,并且具有不允许不当行为未被发现的属性,这使得它比简单的数据库更值得信赖。 go 命令使用这个树来检查“包含”证明(日志中存在特定记录)和“一致性”证明(树没有被篡改),然后再将新的 go.sum 行添加到模块的 go 中。 总和文件。 下面是这种树的一个例子。
Screen Shot 2021-09-26 at 9.39.47 AM.png
校验和数据库支持 go 命令使用的一组端点来请求和验证 go.sum 行。 /lookup 端点提供“签名树头”(STH)和请求的 go.sum 行。 /tile 端点提供称为tile 的树块,go 命令可以将其用于证明。 下面是 go 命令如何通过执行模块版本的 /lookup 与校验和数据库交互的示例,然后请求证明所需的图块。
Screen Shot 2021-09-26 at 9.40.28 AM.png
该校验和数据库允许 go 命令安全地使用其他不受信任的代理。 因为上面有一个可审计的安全层,代理或源服务器不能故意、任意或意外地开始向您提供错误的代码而不会被抓住。 即使是模块的作者也无法在没有检测到更改的情况下移动他们的标签或以其他方式更改与特定版本相关联的位从一天到下一天。

如果您使用的是 Go 1.12 或更早版本,您可以使用 gosumcheck 针对校验和数据库手动检查 go.sum 文件:

  1. $ go get golang.org/x/mod/gosumcheck
  2. $ gosumcheck /path/to/go.sum

除了由 go 命令完成的验证之外,第三方审计员还可以通过遍历日志查找错误条目来让校验和数据库负责。 他们可以一起工作,并在树的生长过程中八卦它的状态,以确保它不受损害,我们希望 Go 社区能够运行它们。

模块索引

模块索引由 index.golang.org 提供,是新模块版本的公共提要,可通过 proxy.golang.org 获得。 这对于希望保留自己的 proxy.golang.org 中可用内容的缓存的工具开发人员特别有用,或者了解人们正在使用的一些最新模块的最新信息。

反馈或 bug

我们希望这些服务能改善您使用模块的体验,并鼓励您在遇到问题或有反馈时提出问题