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 nhược điểm. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể xuất hiện lỗ hổng. Nếu bị kẻ tấn công khai thác, có thể gây ra tổn thất tài sản cho người dùng, hậu quả rất nghiêm trọng. Việc sửa chữa lỗ hổng thường cần phải thực hiện thông qua việc nâng cấp hợp đồng. Ngoài ra, việc thêm tính năng mới cũng cần nâng cấp hợp đồng. Do đó, tính khả năng nâng cấp của hợp đồng là rất cần thiết. Bài viết này sẽ giới thiệu về cách nâng cấp hợp đồng 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.
1. Cấu trúc dữ liệu hợp đồng chưa được sửa đổi
Nếu chỉ thay đổ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ụ, thêm một hàm mới:
Những cân nhắc an toàn trong việc nâng cấp hợp đồng
Kiểm soát quyền: Hàm nâng cấp phải là hàm only owner, đảm bảo chỉ có owner mới có thể gọi.
Khuyến nghị đặt owner của hợp đồng là DAO, quản lý chung 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 thi.
Xóa hàm di chuyển sau khi di chuyển hoàn tất, đả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.
Tuân theo các nguyên tắc trên, có thể nâng cấp và bảo trì hợp đồng thông minh một cách an toàn.
</string,></string,>
Xem bản gốc
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.
8 thích
Phần thưởng
8
5
Đăng lại
Chia sẻ
Bình luận
0/400
GweiWatcher
· 23giờ trước
Người chơi hợp đồng gầm lên: Tăng hay không tùy bạn!
Xem bản gốcTrả lời0
ContractHunter
· 23giờ trước
Ôi ôi ôi, lại gặp phải cái bẫy nâng cấp rust quen thuộc rồi.
Xem bản gốcTrả lời0
NFTRegretter
· 23giờ trước
Chán quá, lại phải nâng cấp, bực bội quá!
Xem bản gốcTrả lời0
TokenVelocity
· 23giờ trước
Nhiều lỗ hổng như vậy ai dám chạm vào chứ.
Xem bản gốcTrả lời0
DuskSurfer
· 23giờ trước
Lỗi hợp đồng xảy ra hàng ngày, thật khiến người ta tức giận.
Hướng dẫn nâng cấp hợp đồng thông minh Rust: Cập nhật bảo mật và di chuyển dữ liệu cho hợp đồ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 nhược điểm. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể xuất hiện lỗ hổng. Nếu bị kẻ tấn công khai thác, có thể gây ra tổn thất tài sản cho người dùng, hậu quả rất nghiêm trọng. Việc sửa chữa lỗ hổng thường cần phải thực hiện thông qua việc nâng cấp hợp đồng. Ngoài ra, việc thêm tính năng mới cũng cần nâng cấp hợp đồng. Do đó, tính khả năng nâng cấp của hợp đồng là rất cần thiết. Bài viết này sẽ giới thiệu về cách nâng cấp hợp đồng 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.
1. Cấu trúc dữ liệu hợp đồng chưa được sửa đổi
Nếu chỉ thay đổ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ụ, thêm một hàm mới:
gỉ #[near_bindgen] impl StatusMessage { Option { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); return self.records.get(&account_id); } }
Sau khi triển khai lại, dữ liệu trong hợp đồng cũ vẫn có thể được đọc thành công.
( 2. Cấu trúc dữ liệu hợp đồng đã được sửa đổi
Nếu sửa đổi cấu trúc dữ liệu gốc, ví dụ:
gỉ #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">
}
Việc triển khai lại trực tiếp sẽ dẫn đến lỗi không thể giải mã trạng thái hợp đồng.
( 3. Sử dụng phương pháp Migrate để nâng cấp
NEAR cung cấp phương pháp Migrate để giúp nâng cấp hợp đồng. Thêm phương pháp migrate vào hợp đồng mới:
gỉ #) #[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)(), } }
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
Điều này cho phép nâng cấp hợp đồng và di chuyển dữ liệu cũ thành công.
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 thi.
Xóa hàm di chuyển sau khi di chuyển hoàn tất, đả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.
Tuân theo các nguyên tắc trên, có thể nâng cấp và bảo trì hợp đồng thông minh một cách an toàn.