Kami sangat senang memberitahu bahwa modul mirror, indeks, dan basisdata checksum telah diluncurkan! Perintah go akan menggunakan modul mirror dan basisdata checksum secara baku untuk pengguna Go 1.13 modul. Lihat halaman privasi untuk informasi privasi penggunaan layanan tersebut dan dokumentasi perintah go untuk detail konfigurasi, termasuk cara mematikan fitur modul tanpa menggunakan server tersebut atau menggunakan server yang berbeda. Jika Anda bergantung pada modul yang tidak publik, lihat dokumentasi konfigurasi untuk lingkungan Anda.
Artikel ini akan menjelaskan tentang layanan-layanan ini and keuntungan dari menggunakan mereka, dan menyimpulkan beberapa poin dari wicara Go Module Proxy: Life of a Query di Gophercon 2019. Lihat wicara tersebut jika Anda tertarik melihat keseluruhan diskusi.
Modul mirror
Modul
adalah sekumpulan paket-paket Go yang diberi versi, dan isi dari setiap versi
tersebut adalah immutable (kekal).
Sifat kekekalan tersebut membuatnya bisa di-cache dan diautentikasi.
Bila "go get" berjalan dengan mode modul, ia harus mengambil modul yang berisi
paket yang diminta, berikut dengan dependensinya, mengubah berkas
go.mod
dan
go.sum
bila diperlukan.
Mengambil modul langsung lewat version control sangat membutuhkan biaya,
baik secara latensi atau penyimpanan, dalam sistem Anda:
perintah go
dipaksa untuk menarik semua histori commit dari sebuah
repositori yang berisi dependensi transitif, bahkan yang tidak dibutuhkan,
hanya supaya dapat memeriksa versinya.
Solusinya yaitu menggunakan sebuah modul proxy, yang memiliki API yang cocok
dengan kebutuhan perintah go
(lihat "go help goproxy").
Saat "go get" berjalan dalam mode modul dengan sebuah proxy, ia akan
berjalan lebih cepat dengan hanya meminta metadata modul tertentu atau sumber
kode yang ia butuhkan, dan tidak perlu khawatir dengan hal-hal lainnya.
Berikut ini sebuah contoh bagaimana perintah go
menggunakan proxy lewat
"go get" yang meminta daftar versi, kemudian informasi, berkas mod, dan zip
untuk versi yang di tag terakhir kali.
Sebuah modul mirror adalah sebuah modul proxy khusus yang men-cache metadata dan sumber kode di dalam sistem penyimpanannya sendiri, yang membolehkan mirror melayani sumber kode yang tidak ada lagi pada lokasi aslinya. Hal ini bisa mempercepat pengunduhan dan melindungi Anda dari dependensi yang hilang. Lihat Go Modul di 2019 untuk informasi lebih lanjut.
Tim Go menjaga sebuah modul mirror, di
proxy.golang.org,
yang mana akan digunakan oleh perintah go
secara baku untuk pengguna modul
sejak Go 1.13.
Jika Anda menggunakan versi terdahulu dari perintah go
, maka Anda dapat
menggunakan layanan ini dengan menset GOPROXY=https://proxy.golang.org di
dalam lingkungan lokal Anda.
Basisdata checksum
Modul memperkenalkan berkas go.sum
, yang berisi daftar hash SHA-256 dari
sumber kode, dan berkas go.mod
dari setiap dependensi saat ia pertama kali
diunduh.
Perintah go
dapat menggunakan hash tersebut untuk mendeteksi perilaku
jahat dari server asli atau proxy yang memberikan Anda kode yang berbeda
untuk versi yang sama.
Batasan dari berkas go.sum
ini adalah ia bekerja sepenuhnya berdasarkan
kepercayaan Anda pada saat pertama kali digunakan.
Saat Anda menambahkan sebuah versi dari dependensi yang Anda belum pernah
gunakan sebelumnya ke modul Anda (bisa juga lewat memperbarui dependensi yang
sudah ada), perintah go
mengambil kode dan menambahkan baris ke berkas
go.sum
secara langsung.
Permasalahannya adalah baris baru pada go.sum
tersebut tidak diperiksa
dengan yang lainnya: ia bisa saja berbeda dengan baris go.sum
yang perintah
go
hasilkan buat orang lain, mungkin karena sebuah proxy secara sengaja
memberikan kode jahat yang ditargetkan kepada Anda.
Solusi Go yaitu sebuah sumber global dari baris-baris go.sum
, yang disebut
basisdata checksum,
yang memastikan supaya perintah go
selalu menghasilkan baris yang sama untuk
setiap berkas go.sum
.
Setiap kali perintah go
menerima sumber kode baru, ia dapat memverifikasi
hash dari kode tersebut dengan basisdata global untuk memastikan bahwa
hash-nya sama, memastikan bahwa semua orang menggunakan kode yang sama untuk
versi tertentu.
Basisdata checksum dilayani oleh
sum.golang.org,
dan dibangun di atas
Transparent Log
(atau "Merkle tree") dari hash-hash yang didukung oleh
Trillian.
Keuntungan utama dari Merkle tree yaitu tahan rusak dan memiliki properti
yang tidak membolehkan perilaku jahat tidak terdeteksi, yang membuatnya lebih
dipercaya daripada hanya basisdata biasa.
Perintah go
menggunakan tree ini untuk memeriksa bukti "inclusion"
(bahwa sebuah catatan tertentu ada dalam log) dan bukti "konsistensi" (bahwa
tree belum pernah dirusak) sebelum menambahkan baris go.sum yang baru ke
dalam berkas go.sum
modul Anda.
Berikut ini adalah sebuah contoh dari sebuah tree tersebut.
Basisdata chekcsum mendukung
sekumpulan endpoint
yang digunakan oleh perintah go
untuk meminta dan memverifikasi baris-baris
go.sum
.
Endpoint /lookup
menyediakan sebuah "signed tree head" (STH) dan
baris-baris go.sum
yang diminta.
Endpoint /tile
menyediakan bagian dari tree yang disebut tiles yang
mana perintah go
dapat gunakan untuk pembuktian.
Berikut ini adalah sebuah contoh bagaimana perintah go
berinteraksi dengan
basisdata checksum dengan melakukan /lookup
dari sebuah versi modul,
kemudian meminta tiles yang dibutuhkan untuk pembuktian.
Basisdata checksum ini membolehkan perintah go
secara aman menggunakan
proxy yang tidak dipercaya.
Karena ada lapisan keamanan yang teraudit berdiri di atasnya, sebuah proxy
atau server asli tidak akan dapat secara sengaja, atau tidak sengaja,
memberikan Anda kode yang salah tanpa terdeteksi.
Bahkan penulis dari sebuah modul tidak dapat memindahkan tag begitu saja
atau suatu hari mengubah kode pada versi tertentu tanpa terdeteksi.
Jika Anda menggunakan Go 1.12 atau sebelumnya, Anda dapat secara manual memeriksa berkas "go.sum" dengan basisdata checksum dengan gosumcheck:
$ go get golang.org/x/mod/gosumcheck $ gosumcheck /path/to/go.sum
Selain verifikasi yang dilakukan oleh perintah go
, auditor pihak ketiga
dapat memeriksa apakah basisdata checksum dapat dipercaya dengan membaca
log satu per satu untuk mencari catatan yang salah.
Mereka dapat bekerja bersama-sama dan berkomunikasi tentang status dari tree
saat ia terus bertambah untuk memastikan ia tetap aman, dan kami harap
komunitas Go akan menjalankannya.
Modul indeks
Modul indeks dilayani oleh index.golang.org, yang berisi daftar versi modul yang baru yang tersedia dalam proxy.golang.org. Hal ini sangat berguna bagi pengembang perkakas yang ingin menyimpan cache proxy.golang.org buat mereka sendiri, atau untuk selalu tetap mutakhir dengan modul-modul terbaru yang orang gunakan.
Umpan balik atau bug
Kami berharap layanan-layanan ini meningkatkan pengalaman Anda dengan modul, dan mendukung Anda untuk melaporkan isu jika Anda menemukan masalah atau memiliki umpan balik!