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.

![](https://img-cdn.gateio.im/webp-social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec.webp(

Những cân nhắc an toàn trong việc nâng cấp hợp đồng

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.
  • Phần thưởng
  • 5
  • Đăng lại
  • Chia sẻ
Bình luận
0/400
GweiWatchervip
· 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
ContractHuntervip
· 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
NFTRegrettervip
· 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
TokenVelocityvip
· 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
DuskSurfervip
· 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.
Xem bản gốcTrả lời0
  • Ghim
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)