

tiêu đề phụ
1. Sự cần thiết phải nâng cấp hợp đồng
tiêu đề phụ
2. Các phương thức nâng cấp phổ biến cho hợp đồng Solidity
Trong Ethereum, hợp đồng thông minh là bất biến, một khi được triển khai trên chuỗi, không ai có thể thay đổi nó.
Vậy nếu hợp đồng có kẽ hở hoặc hợp đồng cần bổ sung chức năng mới thì sửa đổi mã của hợp đồng như thế nào? Giải pháp là triển khai các hợp đồng mới cho chuỗi khối.
Thách thức của phương pháp này là mỗi khi Solidity triển khai hợp đồng, hợp đồng sẽ được chỉ định một địa chỉ duy nhất. Do đó, tất cả các DApp sử dụng hợp đồng này cần sửa đổi địa chỉ hợp đồng để thích ứng với hợp đồng mới. Ngoài ra, trạng thái trong phiên bản cũ của hợp đồng cần được di chuyển sang phiên bản mới của hợp đồng. Việc di chuyển các hợp đồng có trạng thái phức tạp hơn đòi hỏi nhiều công việc, dễ xảy ra lỗi và chi phí sao chép dữ liệu cao.
Do đó, chúng tôi thường áp dụng một kiến trúc trong đó dữ liệu và logic được tách biệt và dữ liệu được lưu trữ trong một hợp đồng (hợp đồng trạng thái) không xử lý bất kỳ logic nào và tất cả logic được triển khai trong một hợp đồng khác (hợp đồng logic). Thông thường nâng cấp hợp đồng sẽ sửa đổi logic, sử dụng kiến trúc này chỉ cần nâng cấp hợp đồng logic mà không cần lo lắng về việc di chuyển trạng thái.
Để giải quyết vấn đề này có thể sử dụng hợp đồng ủy quyền (Proxy Contract), cấu trúc cụ thể như hình bên dưới.
Hợp đồng proxy được sử dụng để lưu trữ dữ liệu và cuộc gọi ủy quyền được sử dụng để gọi hợp đồng logic A, để dữ liệu được đọc và ghi bởi hợp đồng A được lưu trữ trong hợp đồng proxy. Nếu bạn cần nâng cấp hợp đồng logic, hãy triển khai hợp đồng B mới, sau đó gửi giao dịch đến hợp đồng proxy để hợp đồng proxy trỏ đến hợp đồng logic mới B.
3. Các phương pháp phổ biến để nâng cấp hợp đồng NEAR
Tiếp theo, chúng tôi sẽ lấy dự án StatusMessage làm ví dụ để giới thiệu các phương thức nâng cấp phổ biến của hợp đồng NEAR. Mã hợp đồng của StatusMessage như sau
Trước tiên, chúng tôi triển khai hợp đồng đã biên dịch trên mạng thử nghiệm.
Giao dịch như sau
Sau đó, chúng tôi gọi phương thức set_status để lưu trữ dữ liệu trong hợp đồng
Giao dịch như sau
Tiếp theo, chúng tôi thảo luận chi tiết về hai kịch bản nâng cấp hợp đồng khác nhau
3.1 Cấu trúc dữ liệu hợp đồng chưa sửa đổi
Ví dụ: chúng tôi thêm một chức năng:
Sau khi biên dịch, sử dụng triển khai để triển khai lại:
Sau khi biên dịch, sử dụng triển khai để triển khai lại:
Sau đó, chúng tôi gọi phương thức get_status để đọc dữ liệu đã ghi trước đó
Dữ liệu trong hợp đồng ban đầu có thể được đọc thành công:
Điều này là do hợp đồng NEAR có thể được triển khai nhiều lần. Nếu một tài khoản (địa chỉ) đã triển khai hợp đồng, việc gọi lại lệnh triển khai gần có thể triển khai mã hợp đồng mới cho tài khoản. Nếu chúng tôi chỉ sửa đổi hợp đồng logic mà không sửa đổi cấu trúc dữ liệu, chúng tôi có thể trực tiếp sử dụng gần triển khai để triển khai mã mới.
3.2 Cấu trúc dữ liệu hợp đồng được sửa đổi
Chúng tôi đã nâng cấp hợp đồng, sửa đổi cấu trúc dữ liệu gốc, xóa bản ghi, thêm dòng giới thiệu và tiểu sử
Chúng tôi cố gắng triển khai lại một lần nữa:
Hợp đồng vẫn được triển khai thành công:
Nhưng chúng tôi gọi phương thức get_tagline để đọc dữ liệu được lưu trữ:
Bạn sẽ thấy rằng đã xảy ra lỗi và thông báo lỗi như sau:
Cannot deserialize the contract state.
Xem giao dịch cụ thể:
https://explorer.testnet.near.org/transactions/4hQQ1zAwU5bsbfb6tA6DQDqjmFcHsBwaBctdHaPiCKHu
Điều này là do trạng thái của hợp đồng được lưu trữ liên tục dưới dạng dữ liệu được tuần tự hóa. Sau khi hợp đồng được triển khai lại, cấu trúc dữ liệu trong mã thay đổi nhưng trạng thái không thay đổi. Nếu cấu trúc dữ liệu mới không khớp với trạng thái cũ, một lỗi xảy ra.
3.3 Di chuyển nâng cấp hợp đồng thông minh
NEAR cung cấp phương thức Di chuyển để giúp chúng tôi nâng cấp hợp đồng. Đối với các lỗi trong 3.2, chúng tôi thêm phương thức di chuyển vào hợp đồng mới:
#[init(ignore_state)] trong mã có nghĩa là không tải trạng thái trước khi chức năng di chuyển được thực thi. Tiếp theo, chúng tôi triển khai lại hợp đồng, nhưng gọi phương thức di chuyển trong khi triển khai
Như hình bên dưới, hợp đồng được triển khai thành công:
Chúng tôi cố gắng gọi phương thức mới get_tagline của hợp đồng để lấy các dòng giới thiệu dữ liệu mới
Có thể thấy rằng phương thức được gọi thành công và dữ liệu hợp đồng cũ cũng được chuyển sang hợp đồng mới
4. Cân nhắc bảo mật để nâng cấp hợp đồng
Việc nâng cấp bảo mật hợp đồng trước tiên phải xem xét đến việc kiểm soát quyền hạn. Nói chung, các hợp đồng chỉ có thể được nâng cấp bởi các nhà phát triển hoặc DAO. học kỳ cuốiNhật ký xây dựng hợp đồng thông minh Rust (8) Quyền kiểm soát bảo mật hợp đồngGiới thiệu kiểm soát truy cập của các chức năng đặc quyền Chức năng nâng cấp của hợp đồng chung là chức năng của chủ sở hữu duy nhất, đảm bảo rằng chỉ chủ sở hữu mới có thể gọi nó.
Chúng tôi khuyên bạn nên đặt chủ sở hữu của hợp đồng là DAO càng nhiều càng tốt và cùng quản lý hợp đồng thông qua các đề xuất và bỏ phiếu. Do chủ sở hữu được đặt làm tài khoản cá nhân nên hợp đồng có tính tập trung cao, chủ sở hữu có thể tùy ý sửa đổi dữ liệu hợp đồng và cũng có nguy cơ mất khóa riêng của chủ sở hữu.
Ngoài ra, các nhà phát triển cũng có thể xem xét các đề xuất sau khi thực hiện chuyển đổi hợp đồng
Thêm #[init(ignore_state)] trước chức năng di chuyển để đảm bảo rằng trạng thái không được tải trước khi chức năng di chuyển được thực thi.
Sau khi quá trình di chuyển hoàn tất, hãy xóa chức năng di chuyển càng nhiều càng tốt để đảm bảo rằng chức năng di chuyển chỉ được gọi một lần.
Cấu trúc dữ liệu mới được thêm vào được khởi tạo trong quá trình di chuyển.
