Rust hợp đồng thông minh phát triển series: Phương pháp nâng cấp hợp đồng
Hợp đồng thông minh như một loại mã chương trình, khó tránh khỏi việc tồn tại lỗi và cần cải tiến. Ngay cả sau khi trải qua nhiều thử nghiệm và kiểm toán, hợp đồng vẫn có thể có lỗ hổng. Một khi lỗ hổng bị kẻ tấn công khai thác, có thể gây ra thiệt hại nghiêm trọng cho tài sản của người dùng. Do đó, khả năng nâng cấp của hợp đồng rất quan trọng, vừa có thể được sử dụng để sửa lỗi, vừa có thể được sử dụng để thêm các chức năng mới. Bài viết này sẽ giới thiệu một số cách nâng cấp hợp đồng thông minh Rust.
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.
Trong trường hợp này cần phải sử dụng phương thức Migrate để nâng cấp.
) 3. Sử dụng phương pháp Migrate để nâng cấp
Thêm phương thức migrate vào hợp đồng mới:
gỉ
#(
#[init)ignore_state(]
Self {
let old_state: OldStatusMessage = env::state_read)###.expect###'failed'[private];
Tự {
taglines: old_state.records,
bios: LookupMap::new(b'b'.to_vec)(),
}
}
Gọi phương thức migrate đồng thời 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
Cách này có thể di chuyển thành công dữ liệu cũ sang cấu trúc dữ liệu mới.
Những xem xét an toàn khi nâng cấp hợp đồng
Kiểm soát quyền - Hàm nâng cấp nên chỉ dành riêng cho owner, khuyến nghị đặt owner là DAO
Thêm #[init(ignore_state)] trước hàm di chuyển
Sau khi di chuyển hoàn tất, xóa hàm di chuyển.
Cấu trúc dữ liệu mới hoàn thành việc khởi tạo khi di chuyển
Thông qua việc thiết kế cơ chế nâng cấp hợp lý, có thể đạt được khả năng nâng cấp của hợp đồng trong điều kiện đảm bảo an toàn, đặt nền tảng cho việc bảo trì và tối ưu lâu dài.
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.
Thực hành nâng cấp hợp đồng thông minh Rust: Ba phương pháp và các yếu tố an toàn trong hệ sinh thái NEAR
Rust hợp đồng thông minh phát triển series: Phương pháp nâng cấp hợp đồng
Hợp đồng thông minh như một loại mã chương trình, khó tránh khỏi việc tồn tại lỗi và cần cải tiến. Ngay cả sau khi trải qua nhiều thử nghiệm và kiểm toán, hợp đồng vẫn có thể có lỗ hổng. Một khi lỗ hổng bị kẻ tấn công khai thác, có thể gây ra thiệt hại nghiêm trọng cho tài sản của người dùng. Do đó, khả năng nâng cấp của hợp đồng rất quan trọng, vừa có thể được sử dụng để sửa lỗi, vừa có thể được sử dụng để thêm các chức năng mới. Bài viết này sẽ giới thiệu một số cách nâng cấp hợp đồng thông minh Rust.
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.
StatusMessage hợp đồng thông minh mã ví dụ:
gỉ #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct StatusMessage { records: LookupMap<string, string="">, }
impl Default for StatusMessage { Self { Tự { records: LookupMap::new(b'r'.to_vec)((, } } }
#[near_bindgen] impl StatusMessage { pub fn set_status)&mut self, message: String) { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }
Option { return self.records.get(&account_id); } }
( 1. Cập nhật 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 thay đổi cấu trúc dữ liệu, bạn có thể trực tiếp sử dụng lệnh near deploy để triển khai mã mới.
Ví dụ thêm một hàm mới:
gỉ Option { let account_id = env::signer_account_id)(; self.records.insert)\u0026account_id, \u0026message###; return self.records.get(&account_id); }
Sau khi triển khai lại, dữ liệu gốc vẫn có thể được đọc bình thường.
( 2. Nâng cấp cấu trúc dữ liệu hợp đồng
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 việc giải mã trạng thái thất bại.
Ví dụ sửa đổi cấu trúc dữ liệu:
rust pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">
}
Trong trường hợp này cần phải sử dụng phương thức Migrate để nâng cấp.
) 3. Sử dụng phương pháp Migrate để nâng cấp
Thêm phương thức migrate vào hợp đồng mới:
gỉ #( #[init)ignore_state(] Self { let old_state: OldStatusMessage = env::state_read)###.expect###'failed'[private]; Tự { taglines: old_state.records, bios: LookupMap::new(b'b'.to_vec)(), } }
Gọi phương thức migrate đồng thời 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
Cách này có thể di chuyển thành công dữ liệu cũ sang cấu trúc dữ liệu mới.
Những xem xét an toàn khi nâng cấp hợp đồng
Kiểm soát quyền - Hàm nâng cấp nên chỉ dành riêng cho owner, khuyến nghị đặt owner là DAO
Thêm #[init(ignore_state)] trước hàm di chuyển
Sau khi di chuyển hoàn tất, xóa hàm di chuyển.
Cấu trúc dữ liệu mới hoàn thành việc khởi tạo khi di chuyển
Thông qua việc thiết kế cơ chế nâng cấp hợp lý, có thể đạt được khả năng nâng cấp của hợp đồng trong điều kiện đảm bảo an toàn, đặt nền tảng cho việc bảo trì và tối ưu lâu dài.
![](https://img-cdn.gateio.im/webp-social/moments-af3fe22c1999da5db0e2853b8a271276.webp(</string,></string,></string,>