Hợp đồng thông minh như một loại chương trình, khó tránh khỏi việc tồn tại các lỗi và lỗ hổng. Dù đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể có những vấn đề chưa được phát hiện. Một khi lỗ hổng của hợp đồng bị kẻ tấn công lợi dụng, có thể gây ra thiệt hại cho tài sản của người dùng, hậu quả rất nghiêm trọng. Do đó, khả năng nâng cấp của hợp đồng là cực kỳ quan trọng, vừa có thể được sử dụng để sửa chữa lỗ hổng, vừa có thể được sử dụng để thêm chức năng mới. Bài viết này sẽ giới thiệu phương pháp nâng cấp hợp đồng Rust trên nền tảng NEAR.
Phương pháp nâng cấp hợp đồng NEAR
Lấy dự án StatusMessage làm ví dụ, giới thiệu các phương pháp nâng cấp thường dùng của hợp đồng NEAR.
1. Cấu trúc dữ liệu hợp đồng chưa được sửa đổi
Nếu chỉ sửa đổi logic hợp đồng, không liên quan đến việc thay đổi cấu trúc dữ liệu, có thể trực tiếp sử dụng lệnh near deploy để triển khai mã mới. Ví dụ, chúng tôi đã thêm một hàm mới trên cơ sở hợp đồng gốc:
Sau khi biên dịch, chỉ cần sử dụng near deploy để triển khai lại. Dữ liệu trong hợp đồng gốc vẫn có thể được đọc bình thường.
( 2. Cấu trúc dữ liệu hợp đồng đã được chỉnh sửa
Nếu sửa đổi cấu trúc dữ liệu của hợp đồng, việc triển khai lại trực tiếp sẽ dẫn đến lỗi giải mã trạng thái. Ví dụ, chúng tôi đã sửa đổi cấu trúc hợp đồng như sau:
Kiểm soát quyền: Hàm nâng cấp nên được đặt là hàm only owner, đảm bảo chỉ có owner mới có thể gọi.
Khuyên nên đặt owner của hợp đồng là DAO, quản lý hợp đồng thông qua đề xuất và bỏ phiếu.
Thêm #[init)ignore_state)] trước hàm di chuyển, đảm bảo không tải trạng thái trước khi thực hiện.
Sau khi hoàn tất việc di chuyển, hãy xóa hàm di chuyển để đảm bảo nó chỉ được gọi một lần.
Cấu trúc dữ liệu mới được khởi tạo khi di chuyển.
Nâng cấp hợp đồng là một quá trình phức tạp, cần được xử lý cẩn thận. Thông qua thiết kế hợp lý và kiểm tra nghiêm ngặt, có thể thực hiện việc nâng cấp hợp đồng an toàn và đáng tin cậy.
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
Hướng dẫn nâng cấp hợp đồng thông minh Rust: Phân tích chi tiết phương pháp cập nhật bảo mật nền tảng NEAR
Hướng dẫn nâng cấp hợp đồng thông minh Rust
Hợp đồng thông minh như một loại chương trình, khó tránh khỏi việc tồn tại các lỗi và lỗ hổng. Dù đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể có những vấn đề chưa được phát hiện. Một khi lỗ hổng của hợp đồng bị kẻ tấn công lợi dụng, có thể gây ra thiệt hại cho tài sản của người dùng, hậu quả rất nghiêm trọng. Do đó, khả năng nâng cấp của hợp đồng là cực kỳ quan trọng, vừa có thể được sử dụng để sửa chữa lỗ hổng, vừa có thể được sử dụng để thêm chức năng mới. Bài viết này sẽ giới thiệu phương pháp nâng cấp hợp đồng Rust trên nền tảng NEAR.
Phương pháp nâng cấp hợp đồng NEAR
Lấy dự án StatusMessage làm ví dụ, giới thiệu các phương pháp nâng cấp thường dùng của hợp đồng NEAR.
1. Cấu trúc dữ liệu hợp đồng chưa được sửa đổi
Nếu chỉ sửa đổi logic hợp đồng, không liên quan đến việc thay đổi cấu trúc dữ liệu, có thể trực tiếp sử dụng lệnh near deploy để triển khai mã mới. Ví dụ, chúng tôi đã thêm một hàm mới trên cơ sở hợp đồng gốc:
rỉ sét #[near_bindgen] impl StatusMessage { Option { let account_id = env::signer_account_id(); self.records.insert(\u0026account_id, \u0026message); return self.records.get(&account_id); } }
Sau khi biên dịch, chỉ cần sử dụng near deploy để triển khai lại. Dữ liệu trong hợp đồng gốc vẫn có thể được đọc bình thường.
( 2. Cấu trúc dữ liệu hợp đồng đã được chỉnh sửa
Nếu sửa đổi cấu trúc dữ liệu của hợp đồng, việc triển khai lại trực tiếp sẽ dẫn đến lỗi giải mã trạng thái. Ví dụ, chúng tôi đã sửa đổi cấu trúc hợp đồng như sau:
rỉ sét #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
Trong trường hợp này, cần sử dụng phương pháp Migrate để nâng cấp. Thêm phương pháp migrate vào hợp đồng mới:
rỉ sét #( #[init)ignore_state[private]] Self { let old_state: OldStatusMessage = env::state_read().expect("failed"); Tự { taglines: old_state.records, bios: LookupMap::new(b"b".to_vec)(), } }
Sau đó gọi phương thức migrate khi triển khai:
gần triển khai
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "migrate"
--initArgs "{}"
--accountId statusmessage.blocksec_upgrade.testnet
Vậy là có thể nâng cấp hợp đồng thành công và chuyển dữ liệu cũ.
ignore_state)] trước hàm di chuyển, đảm bảo không tải trạng thái trước khi thực hiện.
Sau khi hoàn tất việc di chuyển, hãy xóa hàm di chuyển để đảm bảo nó chỉ được gọi một lần.
Cấu trúc dữ liệu mới được khởi tạo khi di chuyển.
Nâng cấp hợp đồng là một quá trình phức tạp, cần được xử lý cẩn thận. Thông qua thiết kế hợp lý và kiểm tra nghiêm ngặt, có thể thực hiện việc nâng cấp hợp đồng an toàn và đáng tin cậy.