Go 部落格
模組映象和校驗和資料庫已上線
我們很高興地宣佈,我們的模組 映象、索引 和 校驗和資料庫 現已正式上線!go
命令將預設使用模組映象和校驗和資料庫,適用於 Go 1.13 模組使用者。有關這些服務的隱私資訊,請參閱 proxy.golang.org/privacy,有關配置詳情(包括如何停用這些伺服器的使用或使用其他伺服器)請參閱 go 命令文件。如果您依賴非公開模組,請參閱 關於配置非公開模組環境的文件。
本文將介紹這些服務及其使用優勢,並總結 Gophercon 2019 大會上的 Go 模組代理:查詢的生命週期 演講中的一些要點。如果您對完整演講感興趣,請觀看 錄影。
模組映象
模組 是版本化的 Go 包集合,每個版本的內容都是不可變的。這種不可變性為快取和身份驗證提供了新的機會。當 go get
以模組模式執行時,它必須獲取包含請求包的模組,以及該模組引入的任何新依賴項,並在需要時更新您的 go.mod 和 go.sum 檔案。從版本控制系統獲取模組可能會因為延遲和系統儲存而產生高昂的成本:go
命令可能被迫下載包含傳遞依賴項的儲存庫的完整提交歷史記錄,即使該依賴項未被構建,僅僅是為了解析其版本。
解決方案是使用模組代理,它使用更適合 go
命令需求的 API(請參閱 go help goproxy
)。當 go get
以模組模式並結合代理執行時,它將透過僅請求其所需的特定模組元資料或原始碼來更快地工作,而無需擔心其他部分。下面是一個 go
命令在 go get
中使用代理的示例,透過請求版本列表,然後獲取最新標記版本的詳細資訊、mod 檔案和 zip 檔案。

模組映象是特殊的模組代理,它將其元資料和原始碼快取在自己的儲存系統中,從而允許映象繼續提供已不再可從原始位置獲取的原始碼。這可以加快下載速度,並保護您免受依賴項消失的影響。有關更多資訊,請參閱 2019 年的 Go 模組。
Go 團隊維護著一個模組映象,託管在 proxy.golang.org,從 Go 1.13 開始,go
命令將預設使用它來為模組使用者服務。如果您使用的是早期版本的 go
命令,您可以透過在本地環境中設定 GOPROXY=https://proxy.golang.org
來使用此服務。
校驗和資料庫
模組引入了 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.sum
行之前,檢查“包含性”證明(證明特定記錄存在於日誌中)和“一致性”證明(證明樹未被篡改)。下面是這樣一個樹的示例。

校驗和資料庫支援 go
命令用於請求和驗證 go.sum
行的 一組端點。`/lookup` 端點提供一個“簽名樹頭”(STH)和請求的 go.sum
行。`/tile` 端點提供樹的塊,稱為 *tiles*,go
命令可以使用它們來生成證明。下面是 go
命令透過執行模組版本的 `/lookup`,然後請求證明所需的 tiles 來與校驗和資料庫互動的示例。

這個校驗和資料庫允許 go
命令安全地使用一個通常不值得信任的代理。因為在其之上有一個可審計的安全層,代理或源伺服器無法有意、隨意或意外地向您提供錯誤的程式碼而不被發現。即使是模組的作者,也無法在一夜之間移動其標籤或更改與特定版本相關的程式碼,而不會被檢測到。
如果您使用的是 Go 1.12 或更早版本,您可以使用 gosumcheck 手動將 go.sum
檔案與校驗和資料庫進行比對。
$ go get golang.org/x/mod/gosumcheck
$ gosumcheck /path/to/go.sum
除了 go
命令進行的驗證外,第三方審計員可以透過迭代日誌查詢錯誤條目來使校驗和資料庫負責。他們可以合作並交流樹的狀態,以確保其不被破壞,我們希望 Go 社群能夠參與其中。
模組索引
模組索引由 index.golang.org 提供服務,它是一個公共的模組版本新發布資訊流,這些資訊透過 proxy.golang.org 可用。這對於工具開發者來說尤其有用,他們希望維護自己關於 proxy.golang.org 上可用內容的快取,或者及時瞭解人們正在使用的一些最新模組。
反饋或 bug
我們希望這些服務能改善您使用模組的體驗,如果您遇到問題或有任何反饋,請 提交 issue!
下一篇文章:Go 1.13 釋出
上一篇文章:遷移到 Go 模組
部落格索引