Tôi đã dành một khoảng thời gian để đọc qua hướng dẫn nâng cấp của Newton Protocol và cứ quay lại một chi tiết triển khai: các biến lưu trữ mới luôn được thêm vào phần bố cục lưu trữ hiện có, thay vì được chèn vào trong đó
Nghe có vẻ gần như tầm thường
Tôi không nghĩ vậy
Tôi đã thấy các hợp đồng có thể nâng cấp bị hỏng vì ai đó đã đánh giá thấp bố cục lưu trữ. Việc nâng cấp proxy vẫn vượt qua các bài kiểm tra trông có vẻ ổn và rồi vài tuần sau đó người ta mới phát hiện một biến đã bị ghi đè vì thứ tự lưu trữ đã thay đổi. Thật lộn xộn. Hợp đồng không nhất thiết phải thất bại ngay lập tức. Đôi khi nó chỉ bắt đầu hoạt động khác đi, và điều đó khó chẩn đoán hơn rất nhiều.
Giao thức Newton tránh cái bẫy đó bằng cách coi bố cục storage như một thứ cần được bảo toàn thay vì sắp xếp lại. Tôi thích cách tiếp cận này vì nó tôn trọng việc các proxy có thể nâng cấp có thể mong manh như thế nào
Một chi tiết khác nổi bật là cờ newtonPolicyClientInitialized. Mục đích của nó rất đơn giản: khởi tạo hậu-nâng cấp chỉ có thể xảy ra một lần. Giao thức Newton cũng khuyến nghị kiểm thử các bản nâng cấp trên một fork và sử dụng timelock hoặc multisig khi thực thi giao dịch khởi tạo. Điều đó không giống như lời khuyên sáo rỗng đối với tôi. Nó giống như một sự thừa nhận rằng việc nâng cấp vẫn chưa hoàn tất ngay khi triển khai phiên bản mới
Phần khởi tạo nằm trong bản nâng cấp
Cho đến khi bước đó được hoàn tất, logic cấp quyền có thể đã tồn tại bên trong hợp đồng nhưng client chính sách vẫn chưa được kết nối với đúng TaskManager hoặc chưa được gán cho đúng chủ sở hữu (owner) của policy-client Nếu một trong hai giá trị đó sai, lớp cấp quyền có thể thất bại dù bản triển khai chính nó trông có vẻ thành công
Đó là lý do tôi nghĩ cờ khởi tạo chỉ chạy một lần là quan trọng
Nó ngăn ai đó chạy lại việc khởi tạo, nhưng không bảo vệ chống lại việc thực thi lần đầu bị sai. Nếu cấu hình ban đầu có sai sót thì việc khóa nó sau một cờ chỉ chạy một lần không tự động sửa chúng. Nó chỉ khiến lần thực thi đầu tiên trở thành một trong những khoảnh khắc nhạy cảm nhất của toàn bộ quá trình triển khai
Tôi cũng nhận thấy rằng Giao thức Newton không đóng băng vĩnh viễn mọi cấu hình sau khi khởi tạo. Owner của policy client vẫn có thể cập nhật cài đặt chính sách, thay đổi địa chỉ của hợp đồng chính sách, và chuyển quyền sở hữu sau đó. Thực sự tôi thích điều này hơn là giả vờ rằng các hệ thống sẽ không bao giờ cần thay đổi. Thay đổi về hạ tầng. Thay đổi về quản trị. Thay đổi về yêu cầu. Thách thức là đảm bảo các quyền đó vẫn được kiểm soát tốt theo thời gian. Tính tương thích với storage tạo ra một hạng mục rủi ro hoàn toàn khác
Một điều tôi đánh giá cao ở Giao thức Newton là nó cho phép các nhóm đưa việc thực thi chính sách vào mà không cần xây dựng lại ứng dụng từ đầu. Đó là một lựa chọn thiết kế thực tế. Nhưng việc nâng cấp proxy vẫn phải bảo toàn khả năng tương thích storage một cách hoàn hảo. Chèn một biến vào vị trí sai và lớp cấp quyền có thể vẫn trông hoàn toàn khỏe mạnh trong khi trạng thái ứng dụng không liên quan ở phía dưới bị hỏng âm thầm
Tôi đã thấy đủ nhiều hệ thống có thể nâng cấp để biết rằng đó không phải là mối lo mang tính giả thuyết
Một chi tiết khác mà tôi nghĩ không nên bỏ qua là luồng thực thi. Việc thêm một hàm Newton được bảo vệ không tự động giúp một hàm cũ hơn thực hiện cùng một hành động được an toàn. Mọi nhánh đường mà cần thực thi việc cấp quyền vẫn phải gọi validateAttestation hoặc validateAttestationDirect trước khi logic nghiệp vụ được bảo vệ chạy. Chỉ cần bỏ sót một nhánh và bạn sẽ tạo ra các đảm bảo an ninh không nhất quán mà không nhận ra
Có lẽ đó là điều tôi thấy thú vị nhất về Giao thức Newton
Kiến trúc tách NewtonPolicyClient
từ logic nghiệp vụ của ứng dụng, thay vì ép các nhà phát triển phải thiết kế lại mọi thứ xoay quanh một framework mới. Thông thường tôi thích kiểu tiếp cận mô-đun như vậy vì các hệ thống lớn hiếm khi được viết lại hoàn toàn từ đầu. Chúng phát triển từng bản nâng cấp một
Tuy nhiên, đồng thời. Tôi vẫn cứ tự hỏi liệu rủi ro đó thực sự biến mất không
Hay nó chỉ đơn giản là di chuyển
Giao thức Newton giúp việc tích hợp cấp quyền dễ dàng hơn vào các hợp đồng có thể nâng cấp hiện có Tôi thấy điều đó là giá trị. Nhưng điều đó cũng có nghĩa là việc nâng cấp proxy, di chuyển storage và lời gọi khởi tạo ban đầu nhất đều trở thành nơi tập trung hầu như toàn bộ rủi ro vận hành
Tôi không xem đó là điểm yếu của thiết kế
Tôi xem đó như một lời nhắc rằng kiến trúc tốt không loại bỏ những quyết định khó khăn. Nó thường chỉ giúp bạn nhận ra chúng dễ hơn
Mọi lần nâng cấp đều thay đổi code, nhưng không phải mọi lần nâng cấp đều tăng cường an ninh. Với tôi, Giao thức Newton cho thấy những chi tiết triển khai nhỏ nhất thường lại có tác động lớn nhất trong việc xây dựng các hợp đồng thông minh vững bền
