Hợp đồng thông minh bản chất là chương trình, khó tránh khỏi khuyết điểm. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, hợp đồng thông minh vẫn có thể tồn tại lỗ hổng. Một khi lỗ hổng trong hợp đồng bị kẻ tấn công lợi dụng, có thể dẫn đến mất mát tài sản của người dùng, hậu quả nghiêm trọng. Việc sửa lỗ hổng thường cần thực hiện thông qua nâng cấp hợp đồng. Ngoài việc sửa lỗ hổng, việc thêm tính 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 quan trọng. Bài viết này sẽ giới thiệu về cách nâng cấp hợp đồng Rust.
1. Các phương thức nâng cấp hợp đồng Solidity phổ biến
Hợp đồng thông minh Ethereum có tính bất biến, không thể thay đổi sau khi được triển khai. Nếu hợp đồng có lỗ hổng hoặc cần tính năng mới, chỉ có thể triển khai hợp đồng mới lên blockchain.
Thách thức mà phương pháp này phải đối mặt là mỗi khi triển khai hợp đồng sẽ được cấp một địa chỉ mới. Tất cả các DApp sử dụng hợp đồng đó đều cần phải sửa đổi địa chỉ hợp đồng để phù hợp với hợp đồng mới. Ngoài ra, trạng thái trong hợp đồng phiên bản cũ cần được chuyển sang phiên bản mới, công việc di chuyển trạng thái của các hợp đồng phức tạp rất lớn và dễ mắc lỗi.
Do đó, thường áp dụng kiến trúc tách biệt dữ liệu và logic, lưu trữ dữ liệu trong một hợp đồng trạng thái không xử lý logic, tất cả logic được thực hiện trong một hợp đồng logic khác. Như vậy, khi nâng cấp chỉ cần cập nhật hợp đồng logic mà không cần xem xét việc di chuyển trạng thái.
Để giải quyết vấn đề này, có thể sử dụng hợp đồng thông minh (Proxy Contract). Hợp đồng thông minh được sử dụng để lưu trữ dữ liệu và sử dụng deleGatecall để gọi hợp đồng logic A, như vậy dữ liệu được đọc và viết bởi hợp đồng A đều được lưu trữ trong hợp đồng thông minh. Khi nâng cấp, triển khai hợp đồng mới B, sau đó gửi giao dịch để hợp đồng thông minh trỏ đến hợp đồng logic mới B.
2. Phương pháp thường dùng để 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.
2.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 sửa đổ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 trong hợp đồng cũ có thể được đọc thành công.
2.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 sẽ dẫn đến không thể giải mã trạng thái hợp đồng. Điều này là do trạng thái hợp đồng được lưu trữ bền vững dưới dạng dữ liệu đã được tuần tự hóa, sau khi triển khai lại, cấu trúc dữ liệu trong mã đã thay đổi, nhưng trạng thái không thay đổi, cấu trúc dữ liệu mới không thể khớp với trạng thái cũ.
2.3 Nâng cấp hợp đồng thông minh
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 hợp đồng:
triển khai gần \
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
Điều này có thể giúp triển khai hợp đồng mới thành công và di chuyển dữ liệu cũ.
3. Các yếu tố an toàn trong việc nâng cấp hợp đồng
An toàn hợp đồng thông minh nâng cấp trước tiên cần xem xét kiểm soát quyền, hợp đồng thông minh thông thường chỉ có thể được nâng cấp bởi nhà phát triển hoặc DAO. Hàm nâng cấp nên là hàm only owner, đảm bảo chỉ có thể được gọi bởi chủ sở hữu.
Đề xuất đặt owner của hợp đồng là DAO, thông qua đề xuất và bỏ phiếu để cùng quản lý hợp đồng. Tài khoản cá nhân làm owner sẽ dẫn đến việc hợp đồng bị tập trung cao độ, owner có thể tùy ý sửa đổi dữ liệu hợp đồng, và còn có nguy cơ mất khóa riêng.
Ngoài ra, các nhà phát triển khi thực hiện việc di chuyển hợp đồng có thể xem xét các gợi ý sau:
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 hàm di chuyển.
Xóa hàm di chuyển sau khi di chuyển hoàn tất, đảm bảo rằng hàm di chuyển chỉ được gọi một lần.
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
TrustlessMaximalist
· 07-19 20:31
Hợp đồng truyền thống cũ có quá nhiều lỗ hổng.
Xem bản gốcTrả lời0
MetaDreamer
· 07-19 20:29
Quyền không phân tán thì hoàn toàn không an toàn, tôi hiểu điều này.
Xem bản gốcTrả lời0
YieldChaser
· 07-19 20:21
Thông báo quan trọng nên được triển khai theo cấp độ!
Xem bản gốcTrả lời0
MevTears
· 07-19 20:17
Rug Pull thì xóa mã, đơn giản!
Xem bản gốcTrả lời0
PseudoIntellectual
· 07-19 20:12
Cũng tạm thôi, chỉ nắm được chiêu này.
Xem bản gốcTrả lời0
FarmToRiches
· 07-19 20:04
Việc sửa lỗi quan trọng như thế nào có thể hiểu được
Hướng dẫn nâng cấp hợp đồng thông minh Rust: Từ di chuyển dữ liệu đến các yếu tố an toàn
Rust hợp đồng thông minh养成日记(9)合约升级
Hợp đồng thông minh bản chất là chương trình, khó tránh khỏi khuyết điểm. Ngay cả khi đã trải qua nhiều thử nghiệm và kiểm toán, hợp đồng thông minh vẫn có thể tồn tại lỗ hổng. Một khi lỗ hổng trong hợp đồng bị kẻ tấn công lợi dụng, có thể dẫn đến mất mát tài sản của người dùng, hậu quả nghiêm trọng. Việc sửa lỗ hổng thường cần thực hiện thông qua nâng cấp hợp đồng. Ngoài việc sửa lỗ hổng, việc thêm tính 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 quan trọng. Bài viết này sẽ giới thiệu về cách nâng cấp hợp đồng Rust.
1. Các phương thức nâng cấp hợp đồng Solidity phổ biến
Hợp đồng thông minh Ethereum có tính bất biến, không thể thay đổi sau khi được triển khai. Nếu hợp đồng có lỗ hổng hoặc cần tính năng mới, chỉ có thể triển khai hợp đồng mới lên blockchain.
Thách thức mà phương pháp này phải đối mặt là mỗi khi triển khai hợp đồng sẽ được cấp một địa chỉ mới. Tất cả các DApp sử dụng hợp đồng đó đều cần phải sửa đổi địa chỉ hợp đồng để phù hợp với hợp đồng mới. Ngoài ra, trạng thái trong hợp đồng phiên bản cũ cần được chuyển sang phiên bản mới, công việc di chuyển trạng thái của các hợp đồng phức tạp rất lớn và dễ mắc lỗi.
Do đó, thường áp dụng kiến trúc tách biệt dữ liệu và logic, lưu trữ dữ liệu trong một hợp đồng trạng thái không xử lý logic, tất cả logic được thực hiện trong một hợp đồng logic khác. Như vậy, khi nâng cấp chỉ cần cập nhật hợp đồng logic mà không cần xem xét việc di chuyển trạng thái.
Để giải quyết vấn đề này, có thể sử dụng hợp đồng thông minh (Proxy Contract). Hợp đồng thông minh được sử dụng để lưu trữ dữ liệu và sử dụng deleGatecall để gọi hợp đồng logic A, như vậy dữ liệu được đọc và viết bởi hợp đồng A đều được lưu trữ trong hợp đồng thông minh. Khi nâng cấp, triển khai hợp đồng mới B, sau đó gửi giao dịch để hợp đồng thông minh trỏ đến hợp đồng logic mới B.
2. Phương pháp thường dùng để 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.
2.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 sửa đổ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 trong hợp đồng cũ có thể được đọc thành công.
2.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 sẽ dẫn đến không thể giải mã trạng thái hợp đồng. Điều này là do trạng thái hợp đồng được lưu trữ bền vững dưới dạng dữ liệu đã được tuần tự hóa, sau khi triển khai lại, cấu trúc dữ liệu trong mã đã thay đổi, nhưng trạng thái không thay đổi, cấu trúc dữ liệu mới không thể khớp với trạng thái cũ.
2.3 Nâng cấp hợp đồng thông minh
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 hợp đồng:
triển khai gần \ --wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
Điều này có thể giú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)
3. Các yếu tố an toàn trong việc nâng cấp hợp đồng
An toàn hợp đồng thông minh nâng cấp trước tiên cần xem xét kiểm soát quyền, hợp đồng thông minh thông thường chỉ có thể được nâng cấp bởi nhà phát triển hoặc DAO. Hàm nâng cấp nên là hàm only owner, đảm bảo chỉ có thể được gọi bởi chủ sở hữu.
Đề xuất đặt owner của hợp đồng là DAO, thông qua đề xuất và bỏ phiếu để cùng quản lý hợp đồng. Tài khoản cá nhân làm owner sẽ dẫn đến việc hợp đồng bị tập trung cao độ, owner có thể tùy ý sửa đổi dữ liệu hợp đồng, và còn có nguy cơ mất khóa riêng.
Ngoài ra, các nhà phát triển khi thực hiện việc di chuyển hợp đồng có thể xem xét các gợi ý sau: