Newton Protocol yeniləməsinin təlimatını oxumağa bir az vaxt sərf etdim və daim bir tətbiq detalına qayıdırdım: Yeni storage (saxlama) dəyişənləri mövcud storage layoutuna həmişə əlavə edilir; ona daxil edilmir.
Bu, demək olar ki, elə trivial (çox sadə) səslənir
Məncə elə deyil
Storage layout-u kiminsə səhv qiymətləndirməsi nəticəsində təkmilləşdirilə bilən kontraktlar sıradan çıxa bilər. Proxy yeniləməsi testlərdən uğurla keçir, hər şey yaxşı görünür, sonra isə həftələr sonra kimsə aşkar edir ki, storage sırası dəyişdiyi üçün bir dəyişən üzərinə yazılıb. Bu, qarışıqlıqdır. Kontrakt mütləq dərhal sıradan çıxmaya bilər. Bəzən sadəcə fərqli davranmağa başlayır ki, bu da diaqnoz qoymağı xeyli çətinləşdirir.
Newton Protocol storage layout-u yenidən düzənlənəcək bir şey kimi deyil, qorunmalı bir şey kimi qəbul etməklə bu tələ-dən qaçır. Mən bu yanaşmanı sevirəm, çünki upgradeable proxy-lərin nə qədər kövrək ola biləcəyini nəzərə alır.
Diqqətimi çəkən başqa bir detal newtonPolicyClientInitialized flag-i oldu. Onun məqsədi sadədir: post-upgrade initialization yalnız bir dəfə baş verə bilər. Newton Protocol həmçinin fork üzərində upgrade-lərin test edilməsini və initialization tranzaksiyasını icra edərkən timelock və ya multisig-dən istifadə etməyi tövsiyə edir. Bu, mənə “sadəcə boilerplate məsləhət” kimi gəlmədi. Mən bunu upgrade yenisi deploy ediləndə hələ də işin bitmədiyini qəbul edən bir etiraf kimi hiss etdim.
Initialization upgrade-in bir hissəsidir.
Bu addım tamamlanana qədər səlahiyyət (authorization) məntiqi kontraktın içində artıq mövcud ola bilər, amma policy client hələ də düzgün TaskManager-ə bağlı deyil və ya nəzərdə tutulmuş policy-client owner-a təyin edilməyib. Əgər bu dəyərlərdən biri səhvdirsə, deployun özü uğurlu görünsə belə, authorization qat (layer) uğursuz ola bilər.
Məhz buna görə də düşünürəm ki, bir dəfəlik initialization flag-i önəmlidir.
Bu, kimsənin initialization-u yenidən işə salmasının qarşısını alır, amma birinci icranın səhv olmasından qorumaq deyil. İlkin konfiqurasiyada səhvlər varsa, onu bir dəfəlik flag arxasında “kilidləmək” onları magik şəkildə düzəltmir. Sadəcə birinci icranı deployment boyunca ən həssas anlardan birinə çevirir.
Mən həm də gördüm ki, Newton Protocol initialization-dan sonra hər bir konfigurasiya parametrlərini daimi olaraq dondurmur. Policy client owner sonradan yenə də policy settings-i yeniləyə, policy kontrakt ünvanını dəyişə və sonradan ownership-i ötürə bilər. Mən həqiqətən buna, sistemlərin heç vaxt inkişaf etməyə ehtiyac duymadığını iddia etməkdən daha çox üstünlük verirəm. İnfrastruktur dəyişiklikləri. İdarəetmə (Governance) dəyişiklikləri. Tələblər dəyişir. Çətin olan budur ki, bu səlahiyyətlərin zamanla yaxşı idarə olunduğundan əmin olmaq. Storage uyğunluğu (compatibility) tamam başqa risk kateqoriyası yaradır.
Newton Protocol haqqında qiymətləndirdiyim bir şey budur ki, komandalar policy enforcement-i öz tətbiqlərini sıfırdan yenidən qurmağa məcbur etmədən tətbiq edə bilərlər. Bu, praktik dizayn seçimidir. Amma proxy upgrade yenə də storage compatibility-ni mükəmməl şəkildə qorumağı tələb edir. Səhv mövqeyə bir dəyişən əlavə et, və authorization qat tamamilə sağlam görünə bilər, halbuki əlaqəsiz tətbiq vəziyyəti (application state) aşağıda səssizcə korlanır.
Upgradeable sistemlərə kifayət qədər baxmışam ki, bunun hipotez olmadığına əminəm.
Diqqətəlayiq başqa bir detal da var: icra axını. Yeni “Newton protected” funksiya əlavə etmək avtomatik olaraq eyni əməliyyatı icra edən köhnə funksiyanı qorumağa zəmanət vermir. Authorization-u tətbiq etməli olan hər bir yol protected biznes məntiqi işə düşməzdən əvvəl mütləq validateAttestation və ya validateAttestationDirect çağırmalıdır. Bir icra yolunu qaçırsan, fərqinə varmadan qeyri-bərabər (inkonsistent) təhlükəsizlik zəmanətləri yaratmış olursan.
Çox güman ki, Newton Protocol haqqında ən maraqlı tapdığım şey budur.
Arxitektura NewtonPolicyClient-i ayırır.
tətbiqin biznes məntiqinin içindən yanaşaraq, hər şeyi yeni bir framework ətrafında yenidən dizayn etməyə məcbur etmədən. Mən adətən belə modul yanaşmanı daha çox sevirəm, çünki böyük sistemlər nadir hallarda sıfırdan yenidən yazılır. Onlar bir-bir upgrade ilə inkişaf edir.
Eyni zamanda düşünürəm: risk həqiqətən də yox olurmu?
Yoxsa sadəcə yerini dəyişir?
Newton Protocol səlahiyyətlərin (authorization) inteqrasiyasını mövcud upgradeable kontraktlara daha asan edir. Bu, məncə dəyərlidir. Amma bu o deməkdir ki, proxy upgrade, storage migration və ilk başlanğıc (very first initialization) çağırışı əməliyyat riskinin böyük hissəsinin cəmləşdiyi məqamlara çevrilir.
Mən bunu dizaynın zəif cəhəti kimi görmürəm.
Mən bunu yaxşı arxitekturanın çətin qəridləri aradan qaldırmadığına dair bir xatırlatma kimi görürəm. Adətən sadəcə onları müəyyən etməyi asanlaşdırır.
Hər upgrade kodu dəyişir, amma hər upgrade təhlükəsizliyi gücləndirmir. Mənim üçün Newton Protocol göstərir ki, ən kiçik implementasiya detallarının belə, resilient (dayanıqlı) smart kontraktların qurulmasında böyük təsiri olur.
