7 poin oleh GN⁺ 3 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • libzstd-rs-sys adalah proyek kompresi ketiga dari Trifecta Foundation setelah zlib dan bzip2, serta rilis pertama zstd berbasis Rust
  • Zstd adalah format kompresi yang disesuaikan untuk CPU modern, lebih cepat daripada gzip dan juga memiliki rasio kompresi lebih baik, sehingga diperkirakan akan secara bertahap menggantikan gzip pada lalu lintas web
  • Crate zstd Rust yang sudah ada mengompilasi kode C dari source, sehingga memerlukan toolchain C dan dukungan target; ini dapat membuat konfigurasi Windows dan WebAssembly menjadi sulit
  • Implementasi Rust dapat dikompilasi sebagai library C yang kompatibel secara drop-in, dan saat ini sedang memverifikasi alternatif terhadap implementasi referensi C dengan test suite, fuzz test, dan Miri
  • Dekompresi default beberapa persen lebih lambat daripada C, tetapi sekitar penurunan performa 3% adalah biaya untuk keamanan memori, dan dapat disamakan dengan performa C melalui flag eksperimental

Rilis pertama dan makna implementasi Rust

  • Trifecta Tech Foundation mengumumkan rilis pertama libzstd-rs-sys, yang menangani zstd sebagai proyek kompresi ketiga setelah zlib dan bzip2
  • Zstd adalah format kompresi yang dirancang dengan mempertimbangkan CPU modern, jauh lebih cepat daripada gzip dan mampu menghasilkan rasio kompresi yang lebih baik
  • zstd sudah digunakan secara luas dan diperkirakan akan secara bertahap menggantikan gzip pada lalu lintas web
  • Di Rust, zstd sudah dapat digunakan melalui crate zstd, tetapi crate yang ada mengompilasi kode C dari source sehingga memerlukan toolchain C dan dukungan untuk target
  • Menyiapkan toolchain C untuk Windows atau WebAssembly bisa sulit, sehingga implementasi Rust murni memberikan pengalaman penggunaan dependensi yang lebih baik bagi developer Rust
  • libzstd-rs-sys seperti halnya pekerjaan pada zlib dan bzip2, dapat dikompilasi sebagai library C yang kompatibel secara drop-in, dan menargetkan diri sebagai alternatif dari implementasi referensi C
  • Implementasi referensi C dipelihara oleh Meta dan kontribusinya mengharuskan penandatanganan perjanjian antara Meta dan kontributor, sehingga implementasi yang independen, berkinerja baik, dan kompatibel dapat memperkuat ekosistem open source

Verifikasi, performa, dan pekerjaan yang tersisa

  • Implementasi referensi awal dikonversi dengan c2rust, lalu pekerjaan perapian untuk dekompresi dan dictionary builder telah diselesaikan
  • Kode Rust dikompilasi menjadi library statis C lalu diverifikasi dengan test suite dari implementasi referensi
  • Fuzz test dan Miri juga digunakan untuk memverifikasi kebenaran implementasi
  • Prarilis tersedia di libzstd-rs-sys v0.0.1-prerelease.2
  • Biaya keamanan memori

    • Performa dekompresi default beberapa persen lebih lambat dibanding implementasi referensi C
    • Setiap perubahan yang digabungkan ke main diukur melalui benchmark suite
    • Jika flag fitur unsafe-performance-experimental diaktifkan, performanya menyamai performa C
    • Flag ini menonaktifkan pemeriksaan batas pada empat lokasi tempat data input digunakan untuk pengindeksan struktur data
    • Bagi sebagian besar pengguna, penurunan performa sekitar 3% kemungkinan merupakan biaya yang dapat diterima untuk peningkatan keamanan memori
    • Jika membutuhkan performa hingga titik terakhir, pengguna dapat mengambil risikonya dan mengaktifkan flag tersebut; perilaku di empat lokasi ini akan sesuai dengan C yang tidak melakukan pemeriksaan batas
  • Implementasi kompresi dan integrasi ekosistem

    • Bagian kompresi masih mencari pendanaan
    • Ada kode yang dibagi antara kompresi dan dekompresi sehingga sebagian kode kompresi juga telah ditinjau, tetapi sebagian besar pekerjaan perapian masih tersisa
    • Benchmark telah disiapkan untuk mencegah regresi performa kompresi, dan test suite implementasi referensi sedang digunakan untuk memeriksa apakah hasil yang benar dihasilkan
    • Pekerjaan yang tersisa dirangkum di Milestone 4: Encoder implementation
    • Ada fork zstd yang menggunakan libzstd-rs-sys alih-alih library C, dan diharapkan dapat di-upstream-kan di masa depan
    • Pada API yang paling sering digunakan, integrasinya relatif sederhana
    • Pada fitur experimental, ada ketidaksesuaian karena zstd-safe menggunakan enum, tetapi untuk keamanan FFI harus menggunakan struct
  • Sponsor

1 komentar

 
GN⁺ 3 jam lalu
Pendapat di Lobste.rs
  • Ini benar-benar kabar yang sangat menggembirakan. Beberapa hari lalu, karena satu dependensi, saya harus menarik libc-dev hanya untuk membangun zstd, dan saya penasaran apakah pernah ada yang mencoba mereimplementasikannya dengan serius dalam Rust
    Semoga ini bisa diadopsi luas oleh komunitas

  • Saya sedang membuat proyek berbasis WireGuard dengan Rust, jadi saya memakai berbagai pustaka kriptografi Rust. Keunggulan jelasnya adalah keamanan memori, tetapi tidak semuanya sudah diaudit keamanannya seperti pustaka C lama
    Pada akhirnya yang saya ingin tahu adalah apakah menulis ulang algoritme-algoritme ini dalam Rust memang sepadan dengan biayanya

    • Sangat sepadan. Kripto jauh lebih sering dibobol karena cacat implementasi daripada karena algoritmenya sendiri rusak
      Kode non-kriptografi yang “membosankan” seperti parsing, status protokol, dan pengelolaan buffer harus bekerja dengan benar agar sistem tetap aman. Jika penyerang bisa mengirim paket ajaib yang menghasilkan eksekusi kode arbitrer, mereka tidak akan repot mengejar kriptanalisis tingkat lanjut atau side-channel timing untuk mengurangi pemecahan yang butuh ribuan tahun menjadi puluhan tahun
    • Jika kebutuhan performa proyekmu tidak terlalu ketat dan kamu bisa menerima sedikit FFI, memakai stack kriptografi Go dari Rust juga memungkinkan
      Keduanya sama-sama aman memori, dan kelebihannya adalah kamu hanya perlu batas FFI unsafe yang sempit. Pustaka kriptografi Go saat ini lebih matang daripada yang tersedia di ekosistem Rust, lebih tepatnya crates.io
  • Saya penasaran apakah ada penjelasan terdokumentasi tentang kapan seharusnya memakai sufiks -sys dan -rs-sys. Intuisi saya mengatakan -sys dipakai untuk crate yang membungkus pustaka sistem yang tidak ditulis dalam Rust
    Tapi dalam kerangka itu, sufiks -rs-sys terasa tidak masuk akal, jadi sepertinya intuisi saya salah. Ada yang tahu sumber otoritatif?

    • Nama paket ini dinamai hampir seburuk mungkin secara yang masih bisa dibayangkan. Tiga dari empat bagian penyusun namanya salah atau tidak diinginkan
      *-sys: ini konvensi lama yang dipakai luas, dijelaskan di https://doc.rust-lang.org/cargo/reference/…. Tapi sama sekali tidak cocok untuk crate ini
      lib*: kita sudah tahu ini pustaka, dan di Rust prefiks ini bukan konvensi, bahkan tautan di atas juga setengah secara langsung menyarankan untuk menghindarinya bersama *-sys. Jika namanya libzstd-sys, orang bisa mengira ia akan melakukan link ke liblibzstd. Tambahan lagi, terlepas dari Rust, saya memang pernah melihat nama dengan lib ganda di dunia nyata
      *-rs: seperti dikatakan di https://rust-lang.github.io/api-guidelines/naming.html, “semua crate itu Rust! Tidak perlu terus mengingatkan pengguna akan hal itu”
    • Crate -sys biasanya mengekspos antarmuka bergaya C yang sangat mentah, memiliki banyak kode unsafe di dalamnya, dan umumnya membangun atau me-link pustaka eksternal
      Saya pernah melihat nama -rs-sys dipakai dengan cara yang kurang konsisten. Sepertinya dipakai untuk pustaka yang membangun kode eksternal yang dibungkus ulang di dalam crate Rust, misalnya implementasi Rust yang belum selesai dan masih menyisakan bagian C, atau kode pendukung Rust untuk sys crate
    • Ada logikanya sendiri
      libzstd adalah nama aslinya. Pustaka C cenderung memasukkan lib dalam nama, dan ini dipertahankan apa adanya sebagai rujukan alih-alih diubah agar cocok dengan konvensi Rust/Cargo
      -rs menandakan penulisan ulang dalam Rust untuk membedakannya dari implementasi C buatan Facebook. Ini sufiks umum yang sering dipakai di berbagai proyek Rust, mirip seperti pustaka Python yang dinamai dengan gaya pysomething
      -sys dipakai karena implementasi ini adalah pengganti drop-in yang mengekspos API C unsafe. Dari sudut pandang pengguna Cargo, ini bukan pustaka Rust. Tidak ada antarmuka Rust; pemakaiannya dipanggil seperti kode C dengan fungsi-fungsi C
      Jadi ini bukan -rs-sys, melainkan versi -sys dari libzstd-rs
  • Kenapa harus memilih ini dibanding ruzstd? Bukankah lebih baik berinvestasi pada crate yang sudah ada?

    • ruzstd belum sepenuhnya mengimplementasikan kompresi
      Porting 1:1 memungkinkan kita mendapatkan kecepatan serupa dan kesetaraan fitur lewat transformasi kode yang relatif lurus, alih-alih harus mencari tahu lagi bagaimana membuat kompresor yang sama cepat dan lengkap di atas codebase lain
  • “Implementasi referensi C dikelola oleh Meta, dan untuk berkontribusi Anda harus menandatangani perjanjian kontributor dengan Meta”
    Fakta menarik yang baru saya ketahui baru-baru ini: implementasi referensi zstd yang dikelola Facebook juga sedang dikoding dengan LLM dan merupakan dependensi openssl, jadi saya sepenuhnya mendukung makin banyak alternatif

  • “Pada konfigurasi default, performa dekompresi implementasi kami beberapa persen lebih lambat daripada implementasi referensi C”
    Hanya itu yang perlu diketahui tentang proyek ini

    • Bisa jelaskan sedikit lebih lanjut bagaimana kamu memaknai kalimat itu?
      Sebagai referensi, tepat setelah kalimat yang Anda kutip ada lanjutan berikut
      “Namun, jika flag fitur unsafe-performance-experimental diaktifkan, performanya menyamai performa C, jadi kami menganggap penurunan performa ini bisa dibenarkan. Flag ini menonaktifkan 4 pemeriksaan batas di empat lokasi tempat data input digunakan untuk pengindeksan struktur data. Bagi sebagian besar pengguna, penurunan performa sekitar 3% kemungkinan merupakan biaya yang dapat diterima demi peningkatan keamanan memori. Jika Anda benar-benar membutuhkan performa maksimal, Anda dapat mengaktifkan flag ini dengan risiko Anda sendiri. Perilaku di empat lokasi ini sama seperti C yang tidak melakukan pemeriksaan batas, dan tampaknya telah berjalan tanpa masalah di banyak sistem produksi”