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

robot
Đang tạo bản tóm tắt

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

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

Các yếu tố 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 nên được đặt là hàm only owner, đảm bảo chỉ có owner mới có thể gọi.

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

  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 hiện.

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

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

</string,></string,>

NEAR-0.37%
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
  • 2
  • Chia sẻ
Bình luận
0/400
WalletDetectivevip
· 07-20 23:00
Cọ vẫn khá cứng cáp nhỉ
Xem bản gốcTrả lời0
MetaverseVagrantvip
· 07-20 22:55
Lại đang lăn lộn với hợp đồng thông minh rồi.
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)