Thực hành nâng cấp hợp đồng thông minh Rust: Ba phương pháp và các yếu tố an toàn trong hệ sinh thái NEAR

Rust hợp đồng thông minh phát triển series: Phương pháp nâng cấp hợp đồng

Hợp đồng thông minh như một loại mã chương trình, khó tránh khỏi việc tồn tại lỗi và cần cải tiến. Ngay cả sau khi trải qua nhiều thử nghiệm và kiểm toán, hợp đồng vẫn có thể có lỗ hổng. Một khi lỗ hổng bị kẻ tấn công 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 rất quan trọng, vừa có thể được sử dụng để sửa lỗi, vừa có thể được sử dụng để thêm các chức năng mới. Bài viết này sẽ giới thiệu một số cách nâng cấp hợp đồng thông minh 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.

StatusMessage hợp đồng thông minh mã ví dụ:

gỉ #[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); } }

( 1. Cập nhật 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 thay đổi cấu trúc dữ liệu, bạn 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ỉ Option { let account_id = env::signer_account_id)(; self.records.insert)\u0026account_id, \u0026message###; return self.records.get(&account_id); }

Sau khi triển khai lại, dữ liệu gốc vẫn có thể được đọc bình thường.

( 2. Nâng cấp cấu trúc dữ liệu hợp đồng

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 việc giải mã trạng thái thất bại.

Ví dụ sửa đổi cấu trúc dữ liệu:

rust pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">

}

Trong trường hợp này cần phải sử dụng phương thức Migrate để nâng cấp.

) 3. Sử dụng phương pháp Migrate để 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)###.expect###'failed'[private]; Tự { taglines: old_state.records, bios: LookupMap::new(b'b'.to_vec)(), } }

Gọi phương thức migrate đồng thời 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

Cách này có thể di chuyển thành công dữ liệu cũ sang cấu trúc dữ liệu mới.

Những xem xét an toàn khi nâng cấp hợp đồng

  1. Kiểm soát quyền - Hàm nâng cấp nên chỉ dành riêng cho owner, khuyến nghị đặt owner là DAO

  2. Thêm #[init(ignore_state)] trước hàm di chuyển

  3. Sau khi di chuyển hoàn tất, xóa hàm di chuyển.

  4. Cấu trúc dữ liệu mới hoàn thành việc khởi tạo khi di chuyển

Thông qua việc thiết kế cơ chế nâng cấp hợp lý, có thể đạt được khả năng nâng cấp của hợp đồng trong điều kiện đảm bảo an toàn, đặt nền tảng cho việc bảo trì và tối ưu lâu dài.

![](https://img-cdn.gateio.im/webp-social/moments-af3fe22c1999da5db0e2853b8a271276.webp(</string,></string,></string,>

GET9.69%
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
  • 4
  • Chia sẻ
Bình luận
0/400
PretendingToReadDocsvip
· 07-23 12:26
Hợp đồng ủy quyền an toàn hơn một chút
Xem bản gốcTrả lời0
ArbitrageBotvip
· 07-23 12:19
Nâng cấp sợ bị chơi đùa với mọi người
Xem bản gốcTrả lời0
LiquidityNinjavip
· 07-23 12:10
Nâng cấp hợp đồng có khó khăn.
Xem bản gốcTrả lời0
EthMaximalistvip
· 07-23 12:04
Nâng cấp cũng có thể có lỗ hổng
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)