Hợp đồng thông minh bản chất là chương trình, không thể tránh khỏi việc tồn tại lỗi. Ngay cả khi đã trải qua nhiều kiểm tra và kiểm toán, vẫn có thể có lỗ hổng. Việc lỗ hổng hợp đồng bị tấn công 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 lỗi và thêm tính năng mới đều cần phải nâng cấp hợp đồng. Do đó, 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 phổ biến 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ể sử dụng near deploy để triển khai mã mới. Dữ liệu trong hợp đồng gốc 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 việc không khớp cấu trúc dữ liệu cũ và mới, không thể đọc dữ liệu ban đầu.
3. Sử dụng Migrate nâng cấp hợp đồng
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ỉ
#[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 có thể thành công trong việc di chuyển dữ liệu hợp đồng cũ sang hợp đồng mới.
Hàm nâng cấp nên là hàm chỉ dành cho chủ sở hữu, đảm bảo chỉ có thể được gọi bởi chủ sở hữu.
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
Sau khi di chuyển hoàn tất, xóa hàm di chuyển.
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 phương tiện quan trọng để đảm bảo an toàn cho hợp đồng, các nhà phát triển cần phải thận trọng và đảm bảo tính an toàn trong quá trình nâng cấp.
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.
10 thích
Phần thưởng
10
2
Đăng lại
Chia sẻ
Bình luận
0/400
SandwichVictim
· 08-13 22:24
Lỗ hổng nhiều như vậy, nhìn mà hoảng quá.
Xem bản gốcTrả lời0
BlockImposter
· 08-13 22:24
Nâng cấp hay không cũng không ra khỏi cái lỗ được~
Hướng dẫn toàn diện nâng cấp hợp đồng thông minh Rust: Từ NEAR đến các yếu tố an toàn
Thực hành nâng cấp hợp đồng thông minh Rust
Hợp đồng thông minh bản chất là chương trình, không thể tránh khỏi việc tồn tại lỗi. Ngay cả khi đã trải qua nhiều kiểm tra và kiểm toán, vẫn có thể có lỗ hổng. Việc lỗ hổng hợp đồng bị tấn công 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 lỗi và thêm tính năng mới đều cần phải nâng cấp hợp đồng. Do đó, 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 phổ biến 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ể sử dụng near deploy để triển khai mã mới. Dữ liệu trong hợp đồng gốc 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 việc không khớp cấu trúc dữ liệu cũ và mới, không thể đọc dữ liệu ban đầu.
3. Sử dụng Migrate nâng cấp hợp đồng
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ỉ #[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 có thể thành công trong việc di chuyển dữ liệu hợp đồng cũ sang hợp đồng mới.
![])https://img-cdn.gateio.im/webp-social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec.webp)
Các yếu tố an ninh trong việc nâng cấp hợp đồng
Hàm nâng cấp nên là hàm chỉ dành cho chủ sở hữu, đảm bảo chỉ có thể được gọi bởi chủ sở hữu.
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
Sau khi di chuyển hoàn tất, xóa hàm di chuyển.
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 phương tiện quan trọng để đảm bảo an toàn cho hợp đồng, các nhà phát triển cần phải thận trọng và đảm bảo tính an toàn trong quá trình nâng cấp.