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
指令如何透過請求版本清單、最新已標記版本,然後取得其資訊、模組和 zip 檔案,來使用代理與 go get
合作。

模組鏡像是模組代理的一種特殊形式,它將元資料和原始碼快取在自己的儲存系統中,讓鏡像可以繼續提供不再能從原始位置取得的原始碼。這可以加快下載速度,並保護您免於依賴關係消失的威脅。請參閱 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
檔案的限制在於,它完全仰賴您第一次使用時的信任。當您將之前未曾使用過 versions 的依賴關係加入您的模組(可能是透過升級現有的依賴關係),go
指令就會擷取程式碼,並動態將程式碼行加入 go.sum
檔案中。問題在於,這些 go.sum
行不會與他人檢查驗證:它們可能與 go
指令剛剛為其他人產生 go.sum
行不同,也許是因為代理蓄意提供惡意程式碼並鎖定您。
Go 的解決方案是一個名為 checksum 資料庫,其為 go.sum
行的全球來源,可確保 go
命令始終將相同的行新增到每個使用者的 go.sum
檔案。每當 go
命令收到新的原始碼時,它可以根據這個全球資料庫驗証該代碼的雜湊值,以確保雜湊值相符,進而確保所有人使用相同版本的相同代碼。
checksum 資料庫由 sum.golang.org 提供,並建構於 透明記錄器(或「梅克爾樹」)上,此記錄器是由 Trillian 支援的雜湊歷程記錄。梅克爾樹的主要優勢是它具有防篡改功能,並且具備無法讓不當行為不被發現的特性,這使得它比一般資料庫更值得信賴。go
命令會使用這個樹來檢查「包含」證明(特定記錄存在於記錄器中)和「一致性」證明(樹狀結構並未被篡改)後,才會將新的 go.sum
行新增到模組的 go.sum
檔案。以下為這種樹狀結構的範例。

checksum 資料庫支援 一套端點,這些端點會由 go
命令用來請求並驗証 go.sum
行。/lookup
端點會提供「已簽署的樹狀結構主節點」 (STH) 和請求的 go.sum
行。/tile
端點會提供稱為「磁磚」的樹狀結構區塊,go
命令可以使用它進行證明。以下為 go
命令如何透過執行模組版本的 /lookup
,然後請求證明所需的磁磚,與 checksum 資料庫互動的範例。

這個 checksum 資料庫讓 go
命令可以安全地使用原本不可信的代理伺服器。由於在它上方有一個可稽核的安全層,因此代理伺服器或來源伺服器無法故意、任意或意外地開始提供錯誤的代碼給您而不會被發現。即使是模組的作者,也不能變更標籤內容,或在不讓變更被檢測出來的情況下,變更與特定版本相關聯的位元。
如果你使用的是 Go 1.12 或更早版本,則可以使用 gosumcheck 手動根據 checksum 資料庫核對 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 中可用內容的快取或是與人使用的部分最新模組保持同步的工具開發人員特別有用。
回饋或錯誤
我們希望這些服務可以改善您使用模組的體驗,並且鼓勵您在遇到問題或有任何回饋時,提交問題!
下一篇文章:發布 Go 1.13
前一篇文章:移轉到 Go 模組
網誌索引