Giải thích chi tiết về kế hoạch nâng cấp hợp đồng thông minh Rust
Hợp đồng thông minh về bản chất là chương trình, không tránh khỏi việc có lỗi. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể xuất hiện lỗ hổng. Một khi bị kẻ tấn công khai thác, có thể gây ra thiệt hại cho tài sản của người dùng, hậu quả rất nghiêm trọng. Do đó, khả năng nâng cấp của hợp đồng là rất cần thiết, chủ yếu được sử dụng để sửa lỗi và thêm tính năng mới. Bài viết này sẽ giới thiệu các phương thức nâng cấp phổ biến của hợp đồng Rust.
Giải pháp nâng cấp hợp đồng Ethereum
Hợp đồng thông minh Ethereum có tính không thể thay đổi, không thể sửa đổi sau khi được triển khai. Để khắc phục lỗ hổng hoặc thêm tính năng mới, cách làm phổ biến là triển khai hợp đồng mới. Tuy nhiên, điều này sẽ dẫn đến việc thay đổi địa chỉ hợp đồng, cần phải sửa đổi tất cả các DApp đang sử dụng hợp đồng đó. Thêm vào đó, còn cần phải di chuyển dữ liệu trạng thái từ hợp đồng cũ, khối lượng công việc lớn và dễ xảy ra lỗi.
Để làm điều này, thường sử dụng kiến trúc tách biệt dữ liệu và logic: lưu trữ dữ liệu trong hợp đồng trạng thái, tất cả logic được thực hiện trong một hợp đồng logic khác. Khi nâng cấp, chỉ cần cập nhật hợp đồng logic, không cần di chuyển dữ liệu trạng thái.
Cụ thể, có thể sử dụng hợp đồng thông minh (Proxy Contract). Hợp đồng thông minh lưu trữ dữ liệu, thông qua deleGatecall gọi hợp đồng logic A. Khi nâng cấp, chỉ cần triển khai hợp đồng logic mới B, sau đó để hợp đồng thông minh chỉ đến B.
NEAR hợp đồng thông minh nâng cấp
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.
Cấu trúc dữ liệu hợp đồng chưa được chỉnh sửa
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ể trực tiếp sử dụng near deploy để triển khai mã mới. Dữ liệu ban đầu vẫn có thể truy cập bình thường.
Cấu trúc dữ liệu hợp đồng đã được sửa đổ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 một cách trực tiếp sẽ dẫn đến sự không khớp giữa cấu trúc dữ liệu mới và cũ, không thể truy cập dữ liệu một cách bình thường.
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:
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ẽ giúp chuyển dữ liệu hợp đồng cũ sang cấu trúc mới thành công.
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.
20 thích
Phần thưởng
20
7
Chia sẻ
Bình luận
0/400
NFTArtisanHQ
· 07-24 20:20
quan điểm thú vị... nhưng mẫu proxy không hoàn toàn giống như ready-made của duchamp ở dạng mã đâu.
Xem bản gốcTrả lời0
rugdoc.eth
· 07-24 10:17
Rester vẫn có chút vấn đề.
Xem bản gốcTrả lời0
Hash_Bandit
· 07-23 14:51
đã ở đó khi btc được khai thác trên laptop... khả năng nâng cấp là quan trọng nhưng thật sự rủi ro af
Xem bản gốcTrả lời0
AllTalkLongTrader
· 07-21 20:52
Lại đang nói về việc nâng cấp, theo tôi cách an toàn nhất vẫn là ngừng hoạt động tạm thời và khởi động lại.
Xem bản gốcTrả lời0
TestnetFreeloader
· 07-21 20:51
Lỗ hổng đến thì hãy tận dụng sớm! Có thể thu hoạch một đợt.
Xem bản gốcTrả lời0
ApeEscapeArtist
· 07-21 20:50
Lỗ hổng sửa mãi cũng không xong, tốt hơn hết là đừng hy vọng quá nhiều.
Xem bản gốcTrả lời0
GasWhisperer
· 07-21 20:24
thật lòng mà nói, hợp đồng thông minh chỉ là những lỗi chờ xảy ra... việc khớp mẫu sẽ không cứu bạn khỏi các lỗ hổng đâu, haha
Chiến lược nâng cấp hợp đồng thông minh Rust: đảm bảo an toàn và khả năng bảo trì
Giải thích chi tiết về kế hoạch nâng cấp hợp đồng thông minh Rust
Hợp đồng thông minh về bản chất là chương trình, không tránh khỏi việc có lỗi. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, vẫn có thể xuất hiện lỗ hổng. Một khi bị kẻ tấn công khai thác, có thể gây ra thiệt hại cho tài sản của người dùng, hậu quả rất nghiêm trọng. Do đó, khả năng nâng cấp của hợp đồng là rất cần thiết, chủ yếu được sử dụng để sửa lỗi và thêm tính năng mới. Bài viết này sẽ giới thiệu các phương thức nâng cấp phổ biến của hợp đồng Rust.
Giải pháp nâng cấp hợp đồng Ethereum
Hợp đồng thông minh Ethereum có tính không thể thay đổi, không thể sửa đổi sau khi được triển khai. Để khắc phục lỗ hổng hoặc thêm tính năng mới, cách làm phổ biến là triển khai hợp đồng mới. Tuy nhiên, điều này sẽ dẫn đến việc thay đổi địa chỉ hợp đồng, cần phải sửa đổi tất cả các DApp đang sử dụng hợp đồng đó. Thêm vào đó, còn cần phải di chuyển dữ liệu trạng thái từ hợp đồng cũ, khối lượng công việc lớn và dễ xảy ra lỗi.
Để làm điều này, thường sử dụng kiến trúc tách biệt dữ liệu và logic: lưu trữ dữ liệu trong hợp đồng trạng thái, tất cả logic được thực hiện trong một hợp đồng logic khác. Khi nâng cấp, chỉ cần cập nhật hợp đồng logic, không cần di chuyển dữ liệu trạng thái.
Cụ thể, có thể sử dụng hợp đồng thông minh (Proxy Contract). Hợp đồng thông minh lưu trữ dữ liệu, thông qua deleGatecall gọi hợp đồng logic A. Khi nâng cấp, chỉ cần triển khai hợp đồng logic mới B, sau đó để hợp đồng thông minh chỉ đến B.
NEAR hợp đồng thông minh nâng cấp
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.
Cấu trúc dữ liệu hợp đồng chưa được chỉnh sửa
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ể trực tiếp sử dụng near deploy để triển khai mã mới. Dữ liệu ban đầu vẫn có thể truy cập bình thường.
Cấu trúc dữ liệu hợp đồng đã được sửa đổ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 một cách trực tiếp sẽ dẫn đến sự không khớp giữa cấu trúc dữ liệu mới và cũ, không thể truy cập dữ liệu một cách bình thường.
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:
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ẽ giúp chuyển dữ liệu hợp đồng cũ sang cấu trúc mới thành công.
![])https://img-cdn.gateio.im/webp-social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec.webp)
Các cân nhắc an toàn trong việc nâng cấp hợp đồng
Kiểm soát quyền: Hàm nâng cấp nên là hàm only owner, chỉ có thể được gọi bởi owner.
Khuyến nghị đặt owner thành DAO, quản lý hợp đồng thông qua đề xuất và bỏ phiếu.
Thêm #[init(ignore_state)] trước hàm di chuyển, đảm bảo không tải trạng thái trước khi thực thi.
Sau khi hoàn tất việc di chuyển, xóa hàm di chuyển, đảm bảo chỉ được gọi một lần.
Cấu trúc dữ liệu mới hoàn thành khởi tạo trong quá trình di chuyển.
Việc sử dụng hợp lý những kế hoạch nâng cấp này có thể linh hoạt nâng cấp và bảo trì hợp đồng thông minh trong khi vẫn đảm bảo tính an toàn.