Nhật ký phát triển hợp đồng thông minh Rust (9): An toàn hợp đồng trong việc nâng cấp hợp đồng
Hợp đồng thông minh như một dạng mã chương trình, không thể tránh khỏi việc tồn tại các khuyết điểm và lỗ hổng. Ngay cả những hợp đồng đã được thử nghiệm và kiểm toán đầy đủ cũng có thể có những vấn đề chưa được phát hiện. Những vấn đề tiềm ẩn này, một khi bị lợi dụng, 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 hợp đồng là rất quan trọng để sửa chữa lỗ hổng và thêm chức năng mới. Bài viết này sẽ giới thiệu về cách nâng cấp hợp đồng Rust trên nền tảng NEAR.
1. Sự cần thiết của việc nâng cấp hợp đồng
Hợp đồng thông minh về bản chất là mã chương trình, không thể tránh khỏi việc tồn tại các lỗi. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể tồn tại các lỗ hổng. Nếu những lỗ hổng này bị kẻ tấn công khai thác, có thể gây ra hậu quả nghiêm trọng như mất mát tài sản của người dùng. Việc sửa chữa các lỗ hổng thường cần phải thực hiện thông qua việc nâng cấp hợp đồng. Ngoài ra, việc thêm chức năng mới cũng cần 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.
2. Các phương pháp nâng cấp hợp đồng Ethereum phổ biến
Hợp đồng thông minh trên Ethereum có tính không thể thay đổi, một khi được triển khai thì không thể sửa đổi. Để giải quyết vấn đề này, thường sử dụng cách hợp đồng proxy (Proxy Contract):
Hợp đồng đại lý được sử dụng để lưu trữ dữ liệu, và sử dụng deleGatecall để gọi hợp đồng logic.
Hợp đồng logic bao gồm logic kinh doanh cụ thể
Khi nâng cấp, chỉ cần triển khai hợp đồng thông minh mới và cập nhật hợp đồng代理指向
Cách này có thể giữ lại dữ liệu gốc, chỉ cập nhật phần logic.
3. Phương pháp nâng cấp hợp đồng NEAR
Dưới đây là ví dụ về dự án StatusMessage, giới thiệu phương pháp nâng cấp hợp đồng NEAR:
3.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 thay đổi cấu trúc dữ liệu, có thể sử dụng lệnh near deploy để triển khai lại mã nguồn mới. Dữ liệu hiện có sẽ được giữ lại.
3.2 Cấu trúc dữ liệu hợp đồng bị thay đổi
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 sự không tương thích giữa cấu trúc dữ liệu cũ và mới, không thể đọc dữ liệu ban đầu một cách bình thường.
3.3 Sử dụng phương pháp Migrate để nâng cấp
NEAR cung cấp phương thức Migrate để nâng cấp hợp đồng. Thêm hàm 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:
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ể hoàn thành việc di chuyển dữ liệu, cấu trúc dữ liệu của hợp đồng mới và cũ không nhất quán cũng có thể nâng cấp bình thường.
4. Các yếu tố an ninh trong việc nâng cấp hợp đồng
Việc nâng cấp hợp đồng cần xem xét các yếu tố an toàn sau:
Kiểm soát quyền nâng cấp một cách nghiêm ngặt, chỉ cho phép nhà phát triển hoặc DAO nâng cấp
Khuyến nghị thiết lập owner của hợp đồng thông minh là DAO, quản lý thông qua đề xuất và bỏ phiếu.
Thêm #[init)ignore_state)] trước hàm migrate
Xóa hàm migrate sau khi 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
Thông qua những biện pháp này, có thể đảm bảo tính an toàn của việc nâng cấp hợp đồng, giảm thiểu rủi ro trong quá trình nâng cấp.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
10 thích
Phần thưởng
10
5
Chia sẻ
Bình luận
0/400
liquiditea_sipper
· 20giờ trước
Nghe có vẻ mạnh mẽ như vậy nhưng tôi vẫn không dám thử.
Xem bản gốcTrả lời0
NeverVoteOnDAO
· 20giờ trước
Nâng cấp có đáng tin không? Cảm giác như không thể lau sạch.
Xem bản gốcTrả lời0
BrokenDAO
· 20giờ trước
Quyền hạn giống như cửa hậu, nói gì đến an toàn.
Xem bản gốcTrả lời0
LayerZeroHero
· 20giờ trước
Một khi nâng cấp xong, sẽ không có thần tiên nào quản được.
Kỹ thuật nâng cấp hợp đồng thông minh Rust: Thực tiễn tốt nhất từ Ethereum đến NEAR
Nhật ký phát triển hợp đồng thông minh Rust (9): An toàn hợp đồng trong việc nâng cấp hợp đồng
Hợp đồng thông minh như một dạng mã chương trình, không thể tránh khỏi việc tồn tại các khuyết điểm và lỗ hổng. Ngay cả những hợp đồng đã được thử nghiệm và kiểm toán đầy đủ cũng có thể có những vấn đề chưa được phát hiện. Những vấn đề tiềm ẩn này, một khi bị lợi dụng, 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 hợp đồng là rất quan trọng để sửa chữa lỗ hổng và thêm chức năng mới. Bài viết này sẽ giới thiệu về cách nâng cấp hợp đồng Rust trên nền tảng NEAR.
1. Sự cần thiết của việc nâng cấp hợp đồng
Hợp đồng thông minh về bản chất là mã chương trình, không thể tránh khỏi việc tồn tại các lỗi. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể tồn tại các lỗ hổng. Nếu những lỗ hổng này bị kẻ tấn công khai thác, có thể gây ra hậu quả nghiêm trọng như mất mát tài sản của người dùng. Việc sửa chữa các lỗ hổng thường cần phải thực hiện thông qua việc nâng cấp hợp đồng. Ngoài ra, việc thêm chức năng mới cũng cần 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.
2. Các phương pháp nâng cấp hợp đồng Ethereum phổ biến
Hợp đồng thông minh trên Ethereum có tính không thể thay đổi, một khi được triển khai thì không thể sửa đổi. Để giải quyết vấn đề này, thường sử dụng cách hợp đồng proxy (Proxy Contract):
Cách này có thể giữ lại dữ liệu gốc, chỉ cập nhật phần logic.
3. Phương pháp nâng cấp hợp đồng NEAR
Dưới đây là ví dụ về dự án StatusMessage, giới thiệu phương pháp nâng cấp hợp đồng NEAR:
3.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 thay đổi cấu trúc dữ liệu, có thể sử dụng lệnh near deploy để triển khai lại mã nguồn mới. Dữ liệu hiện có sẽ được giữ lại.
3.2 Cấu trúc dữ liệu hợp đồng bị thay đổi
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 sự không tương thích giữa cấu trúc dữ liệu cũ và mới, không thể đọc dữ liệu ban đầu một cách bình thường.
3.3 Sử dụng phương pháp Migrate để nâng cấp
NEAR cung cấp phương thức Migrate để nâng cấp hợp đồng. Thêm hàm 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:
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ể hoàn thành việc di chuyển dữ liệu, cấu trúc dữ liệu của hợp đồng mới và cũ không nhất quán cũng có thể nâng cấp bình thường.
4. Các yếu tố an ninh trong việc nâng cấp hợp đồng
Việc nâng cấp hợp đồng cần xem xét các yếu tố an toàn sau:
Thông qua những biện pháp này, có thể đảm bảo tính an toàn của việc nâng cấp hợp đồng, giảm thiểu rủi ro trong quá trình nâng cấp.