Hướng dẫn nâng cấp hợp đồng thông minh Rust: Thực hành di chuyển an toàn trên 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 lỗi. Dù đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể xảy ra lỗ hổng. Một khi lỗ hổng bị 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 là rất quan trọng, chủ yếu để sửa chữa lỗ hổng và thêm các tính năng mới.

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 thay đổ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, bạn có thể sử dụng lệnh near deploy để triển khai mã mớ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 bị thay đổi

Nếu thay đổ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 cấu trúc dữ liệu mới không khớp với trạng thái cũ, từ đó gây ra lỗi.

3. Sử dụng phương pháp Migrate để nâng cấp

NEAR cung cấp phương thức Migrate để giúp nâng cấp hợp đồng. Thêm phương thức migrate vào hợp đồng mới:

gỉ #[private] #[init(ignore_state)] 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 lại:

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 sẽ cho phép triển khai hợp đồng mới thành công và di chuyển dữ liệu cũ.

![])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. Hàm nâng cấp nên được kiểm soát quyền truy cập, thông thường chỉ có thể được gọi bởi nhà phát triển hoặc DAO.

  2. Đề nghị đặt owner của hợp đồng là DAO, cùng nhau quản lý thông qua đề xuất và bỏ phiếu.

  3. Thêm #[init(ignore_state)] trước hàm chuyển đổi, đảm bảo không tải trạng thái trước khi thực hiện.

  4. Xóa hàm di chuyển sau khi hoàn tất việc di chuyển, đả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.

Cơ chế nâng cấp hợp lý có thể cung cấp sự linh hoạt và khả năng bảo trì cho hợp đồng dưới điều kiện đảm bảo an toàn.

INIT3.84%
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
  • 6
  • Chia sẻ
Bình luận
0/400
SignatureAnxietyvip
· 2giờ trước
tình trạng người chơi gần đây gg đã chết
Xem bản gốcTrả lời0
DAOTruantvip
· 7giờ trước
Có nên di chuyển dữ liệu hay không thì tùy tâm trạng.
Xem bản gốcTrả lời0
0xSherlockvip
· 07-25 08:10
Nhìn là thấy đau đầu, không học nổi nữa.
Xem bản gốcTrả lời0
MEVHunterLuckyvip
· 07-25 08:10
Nói thật là không có mã nào cả, làm sao mà học đây?
Xem bản gốcTrả lời0
blocksnarkvip
· 07-25 08:10
NEAR thầy sẽ đến dạy học
Xem bản gốcTrả lời0
rugpull_survivorvip
· 07-25 08:00
Cứ nghe gần ổn quá
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)