Hợp đồng thông minh như một loại mã chương trình, không thể tránh khỏi sự tồn tại của các khuyết điểm và lỗ hổng. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể xuất hiện vấn đề an ninh. Một khi lỗ hổng hợp đồng bị kẻ tấn công khai thác, có thể gây ra tổn thất tài sản của người dùng và nhiều hậu quả nghiêm trọng khác. Do đó, việc nâng cấp hợp đồng là rất quan trọng để khắc phục lỗ hổng và thêm các tính 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 thông minh Rust.
Phương pháp nâng cấp hợp đồng NEAR thường dùng
Lấy dự án StatusMessage làm ví dụ, giới thiệu các phương pháp nâng cấp hợp đồng NEAR phổ biến:
Nếu chỉ thêm chức năng mới, không liên quan đến việc sửa đổi cấu trúc dữ liệu, bạn có thể sử dụng lệnh near deploy để triển khai mã mới. Dữ liệu gốc có thể được đọc bình thường.
) Cấu trúc dữ liệu hợp đồng đã được sửa đổi
Nếu đã thay đổi cấu trúc dữ liệu, việc triển khai lại trực tiếp sẽ dẫn đến sự không tương thích giữa cấu trúc dữ liệu cũ và mới, không thể đọc dữ liệu một cách bình thường. Lúc này cần sử dụng phương thức Migrate để thực hiện 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###[private].expect('failed');
Tự {
taglines: old_state.records,
bios: LookupMap::new(b'b'.to_vec)(),
}
}
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.example.testnet
Điều này có thể di chuyển dữ liệu cũ sang cấu trúc dữ liệu mới.
An toàn trong việc nâng cấp hợp đồng
Thực hiện kiểm soát quyền, chỉ cho phép nhà phát triển hoặc DAO nâng cấp hợp đồng.
Khuyến nghị đặt owner của hợp đồng thông minh thành DAO, quản lý chung thông qua đề xuất và bỏ phiếu.
Thêm #[init(ignore_state(] trước hàm migrate.
Sau khi di chuyển hoàn tất, xóa hàm migrate, đảm bảo 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.
Bằng cách trên, có thể hoàn thành việc nâng cấp hợp đồng thông minh Rust một cách an toàn và hiệu quả.
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.
12 thích
Phần thưởng
12
8
Chia sẻ
Bình luận
0/400
GamefiEscapeArtist
· 46phút trước
Lại là vấn đề cũ của việc nâng cấp hợp đồng, những ai hiểu thì sẽ hiểu.
Xem bản gốcTrả lời0
CryptoNomics
· 08-01 19:25
*thở dài* để tôi giải thích bằng cách sử dụng ma trận xác suất ngẫu nhiên tại sao khả năng nâng cấp != bảo mật
Xem bản gốcTrả lời0
HodlBeliever
· 08-01 07:16
Hệ số rủi ro hợp đồng dù thấp đến đâu cũng không thể đánh cược.
Xem bản gốcTrả lời0
SnapshotLaborer
· 08-01 07:16
Lại đang cuốn hợp đồng thông minh rồi, lén nhìn một cái vào Ví tiền.
Xem bản gốcTrả lời0
MEV_Whisperer
· 08-01 07:11
Nâng cấp hợp đồng cũng chỉ như vậy thôi, có gì to tát.
Kỹ thuật nâng cấp hợp đồng thông minh Rust: Phương pháp cập nhật an toàn cho hợp đồng NEAR
Kỹ thuật nâng cấp hợp đồng thông minh Rust
Hợp đồng thông minh như một loại mã chương trình, không thể tránh khỏi sự tồn tại của các khuyết điểm và lỗ hổng. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể xuất hiện vấn đề an ninh. Một khi lỗ hổng hợp đồng bị kẻ tấn công khai thác, có thể gây ra tổn thất tài sản của người dùng và nhiều hậu quả nghiêm trọng khác. Do đó, việc nâng cấp hợp đồng là rất quan trọng để khắc phục lỗ hổng và thêm các tính 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 thông minh Rust.
Phương pháp nâng cấp hợp đồng NEAR thường dùng
Lấy dự án StatusMessage làm ví dụ, giới thiệu các phương pháp nâng cấp hợp đồng NEAR phổ biến:
rỉ sét #[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); } }
( Cấu trúc dữ liệu hợp đồng chưa được sửa đổi
Nếu chỉ thêm chức năng mới, không liên quan đến việc sửa đổi cấu trúc dữ liệu, bạn có thể sử dụng lệnh near deploy để triển khai mã mới. Dữ liệu gốc có thể được đọc bình thường.
) Cấu trúc dữ liệu hợp đồng đã được sửa đổi
Nếu đã thay đổi cấu trúc dữ liệu, việc triển khai lại trực tiếp sẽ dẫn đến sự không tương thích giữa cấu trúc dữ liệu cũ và mới, không thể đọc dữ liệu một cách bình thường. Lúc này cần sử dụng phương thức Migrate để thực hiện nâng cấp:
gỉ #( #[init)ignore_state###] Self { let old_state: OldStatusMessage = env::state_read###[private].expect('failed'); Tự { taglines: old_state.records, bios: LookupMap::new(b'b'.to_vec)(), } }
gần triển khai
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}' \ --accountId statusmessage.example.testnet
Điều này có thể di chuyển dữ liệu cũ sang cấu trúc dữ liệu mới.
An toàn trong việc nâng cấp hợp đồng
Thực hiện kiểm soát quyền, chỉ cho phép nhà phát triển hoặc DAO nâng cấp hợp đồng.
Khuyến nghị đặt owner của hợp đồng thông minh thành DAO, quản lý chung thông qua đề xuất và bỏ phiếu.
Thêm #[init(ignore_state(] trước hàm migrate.
Sau khi di chuyển hoàn tất, xóa hàm migrate, đảm bảo 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.
Bằng cách trên, có thể hoàn thành việc nâng cấp hợp đồng thông minh Rust một cách an toàn và hiệu quả.
![])https://img-cdn.gateio.im/webp-social/moments-af3fe22c1999da5db0e2853b8a271276.webp)</string,>