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ũ.
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.
18 thích
Phần thưởng
18
6
Chia sẻ
Bình luận
0/400
SignatureAnxiety
· 2giờ trước
tình trạng người chơi gần đây gg đã chết
Xem bản gốcTrả lời0
DAOTruant
· 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
0xSherlock
· 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
MEVHunterLucky
· 07-25 08:10
Nói thật là không có mã nào cả, làm sao mà học đây?
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
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
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.
Đề 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.
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.
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.
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.