Saya meluangkan waktu untuk membaca panduan upgrade Newton Protocol dan saya terus kembali ke satu detail implementasi. Variabel penyimpanan baru selalu ditambahkan ke tata letak penyimpanan yang sudah ada, bukan disisipkan ke dalamnya.
Itu terdengar hampir sepele.
Saya rasa itu bukan begitu.
Saya pernah melihat kontrak yang bisa diupgrade rusak karena seseorang meremehkan tata letak penyimpanan. Upgrade proxy berhasil, pengujian terlihat baik, lalu berminggu-minggu kemudian seseorang menemukan bahwa sebuah variabel telah ditimpa karena urutan penyimpanan berubah. Ini berantakan. Kontraknya tidak selalu langsung gagal. Kadang-kadang kontrak hanya mulai berperilaku berbeda, yang jauh lebih sulit didiagnosis.
Protokol Newton menghindari jebakan itu dengan memperlakukan tata letak storage sebagai sesuatu yang harus dipertahankan, bukan diatur ulang. Saya suka pendekatan itu karena menghormati betapa rapuhnya proxy yang dapat diupgrade
Detail lain yang menonjol adalah bendera newtonPolicyClientInitialized. Tujuannya sederhana: inisialisasi pasca-upgrade hanya bisa terjadi sekali. Protokol Newton juga merekomendasikan untuk menguji upgrade pada sebuah fork dan menggunakan timelock atau multisig saat mengeksekusi transaksi inisialisasi. Itu tidak terasa seperti saran basa-basi bagi saya. Itu terasa seperti pengakuan bahwa upgrade belum selesai ketika implementasi baru dideploy
Inisialisasi adalah bagian dari upgrade
Sampai langkah itu selesai, logika otorisasi mungkin sudah ada di dalam kontrak, tetapi klien policy masih belum terhubung ke TaskManager yang benar atau ditetapkan ke pemilik klien-policy yang dimaksud. Jika salah satu nilainya keliru, lapisan otorisasi bisa gagal meskipun deployment itu sendiri tampak berhasil
Itulah sebabnya saya pikir bendera inisialisasi satu kali itu penting
Ini mencegah seseorang menjalankan inisialisasi lagi, tetapi tidak melindungi dari kesalahan pada eksekusi pertama. Jika konfigurasi awal mengandung kekeliruan, mengunci semuanya di balik bendera satu kali tidak serta-merta memperbaikinya. Itu hanya membuat eksekusi pertama menjadi salah satu momen paling sensitif dalam seluruh deployment
Saya juga memperhatikan bahwa Protokol Newton tidak membekukan setiap konfigurasi secara permanen setelah inisialisasi. Pemilik klien policy masih bisa memperbarui pengaturan kebijakan, mengubah alamat kontrak policy, dan mentransfer kepemilikan nanti. Saya sebenarnya lebih menyukainya dibanding berpura-pura sistem tidak pernah perlu berevolusi. Perubahan infrastruktur. Perubahan tata kelola. Perubahan kebutuhan. Tantangannya adalah memastikan izin tersebut tetap terkontrol dengan baik dari waktu ke waktu. Kompatibilitas storage menciptakan kategori risiko yang berbeda sama sekali
Satu hal yang saya hargai tentang Protokol Newton adalah ia memungkinkan tim untuk memperkenalkan penegakan policy tanpa membangun ulang aplikasi mereka dari nol. Itu pilihan desain yang praktis. Namun upgrade proxy tetap harus mempertahankan kompatibilitas storage secara sempurna. Masukkan satu variabel di posisi yang salah dan lapisan otorisasi mungkin terlihat benar-benar sehat, sementara status aplikasi yang tidak terkait diam-diam menjadi rusak di bawahnya
Saya sudah melihat cukup banyak sistem yang bisa diupgrade untuk tahu bahwa itu bukan kekhawatiran hipotetis
Detail lain yang menurut saya tidak boleh diabaikan adalah alur eksekusi. Menambahkan fungsi protected baru di Newton tidak otomatis mengamankan fungsi lama yang melakukan tindakan yang sama. Setiap jalur yang seharusnya menerapkan otorisasi tetap harus memanggil validateAttestation atau validateAttestationDirect sebelum logika bisnis protected dijalankan. Jika Anda melewatkan satu jalur eksekusi, Anda akan menciptakan jaminan keamanan yang tidak konsisten tanpa disadari.
Itu mungkin yang paling menarik yang saya temukan tentang Protokol Newton
Arsitekturnya memisahkan NewtonPolicyClient
dari logika bisnis aplikasi, bukan memaksa developer untuk mendesain ulang semuanya di sekitar framework baru. Saya umumnya lebih menyukai pendekatan modular seperti itu karena sistem besar jarang ditulis ulang dari nol. Sistem itu berevolusi satu upgrade pada satu waktu
Namun pada saat yang sama, saya terus bertanya-tanya apakah risikonya benar-benar hilang
Atau apakah itu sekadar memindahkan
Protokol Newton membuat otorisasi lebih mudah diintegrasikan ke dalam kontrak yang dapat diupgrade yang sudah ada. Saya pikir itu berharga. Namun ini juga berarti bahwa upgrade proxy, migrasi storage, dan pemanggilan inisialisasi pertama benar-benar menjadi titik di mana hampir seluruh risiko operasional terkonsentrasi
Saya tidak melihat itu sebagai kelemahan dari desainnya
Saya melihatnya sebagai pengingat bahwa arsitektur yang baik tidak menghilangkan keputusan-keputusan sulit. Biasanya arsitektur itu membuat keputusan tersebut lebih mudah untuk dikenali
Setiap upgrade mengubah kode, tetapi tidak setiap upgrade memperkuat keamanan. Bagi saya, Protokol Newton menunjukkan bahwa detail implementasi yang paling kecil sering kali berdampak paling besar dalam membangun smart contract yang tahan banting
