Bài viết
Chia sẻ kiến thức của bạn.
Vai trò của upgrade_cap trong các gói Sui là gì?
Tôi đang cố gắng hiểu khía cạnh này của Mạng Sui bởi vì tôi đang xây dựng, gỡ lỗi hoặc triển khai thứ gì đó chạm vào khu vực này. Tôi muốn giải thích chi tiết về cách cơ chế hoặc tính năng này hoạt động, cùng với cách sử dụng CLI có liên quan, cấu trúc mã di chuyển hoặc các khái niệm kiến trúc. Mục tiêu của tôi là đạt được đủ sự rõ ràng để áp dụng kiến thức này vào một dự án thực tế — cho dù đó là hợp đồng thông minh tùy chỉnh, hệ thống NFT, tích hợp ví hay công cụ DeFi. Mạng Sui có những tính năng độc đáo so với chuỗi EVM, vì vậy tôi đặc biệt quan tâm đến điều gì khiến nó khác biệt và điều đó ảnh hưởng như thế nào đến các thực tiễn phát triển tốt nhất. Sẽ rất hữu ích nếu có mã mẫu, ví dụ dòng lệnh hoặc các lỗi điển hình để theo dõi, đặc biệt là khi sử dụng Sui CLI, SDK hoặc triển khai trên localnet/testnet. Cuối cùng, tôi muốn tránh những sai lầm phổ biến, tuân theo các nguyên tắc bảo mật tốt nhất và đảm bảo rằng chức năng tôi đang làm việc hoạt động như mong đợi trong các điều kiện thực tế.
- Sui
- Transaction Processing
- Move
Câu trả lời
12Upgrade_cap trong gói Sui là một đối tượng đặc biệt kiểm soát quyền nâng cấp gói Move đã xuất bản. Khi bạn xuất bản một gói trên Sui, hệ thống sẽ tạo một đối tượng upgrade_cap được liên kết với gói đó. Đối tượng này được nắm giữ bởi nhà xuất bản hoặc cơ quan được chỉ định và được yêu cầu thực hiện bất kỳ nâng cấp hoặc sửa đổi nào trong tương lai đối với mã gói. Nếu không có upgrade_cap, gói sẽ trở nên bất biến, nghĩa là bạn không thể thay đổi hoặc thay thế các mô-đun của nó. Thiết kế này thực thi các nâng cấp an toàn, có kiểm soát và ngăn chặn các thay đổi trái phép, điều này rất quan trọng để duy trì sự tin tưởng và ổn định trong các hợp đồng thông minh được triển khai.
Từ góc độ CLI, khi bạn xuất bản một gói bằng sui client publish, bạn sẽ nhận được ID gói và ID đối tượng upgrade_cap. Để nâng cấp, bạn phải ký một giao dịch tham chiếu đến upgrade_cap hiện tại, sau đó hệ thống phát hành phiên bản mới của gói cùng với một đối tượng upgrade_cap mới. Trong Move code, bạn không trực tiếp thao tác với upgrade_cap, nhưng các tập lệnh triển khai hoặc logic off-chain của bạn phải xử lý nó một cách an toàn.
Về mặt kiến trúc, upgrade_cap thể hiện quyền sở hữu và kiểm soát quyền quản lý vòng đời gói, phân biệt mô hình gói của Sui với các hợp đồng hoặc proxy bất biến của Ethereum. Thực hành tốt nhất là lưu trữ upgrade_cap an toàn ngoại tuyến hoặc trong ví multisig để ngăn chặn sự xâm phạm. Ngoài ra, cần quản lý và thử nghiệm phiên bản cẩn thận trước khi nâng cấp vì nó ảnh hưởng đến tất cả người dùng tùy thuộc vào gói.
Các lỗi điển hình bao gồm mất upgrade_cap, khóa bạn khỏi nâng cấp hoặc quản lý sai quyền dẫn đến rủi ro bảo mật. Sử dụng Sui CLI, bạn có thể truy vấn upgrade_cap hiện tại cho một gói hoặc gửi các giao dịch nâng cấp tiêu thụ và phát hành lại gói đó.
Tóm lại, upgrade_cap là khóa mật mã để phát triển gói trên Sui, cho phép nâng cấp được kiểm soát, cho phép trong khi vẫn duy trì sự phân cấp và bảo mật. Quản lý nó đúng cách là điều cần thiết cho quy trình phát triển và triển khai hợp đồng thông minh Sui sẵn sàng sản xuất.
Trong Sui, upgrade_cap
được sử dụng để quản lý khả năng nâng cấp của hợp đồng thông minh, cho phép các nhà phát triển cập nhật hợp đồng mà không làm mất dữ liệu. Nó cấp phép thực hiện nâng cấp hợp đồng và thường thuộc sở hữu của một địa chỉ đáng tin cậy.
Điểm chính:
*** Nâng cấp kiểm soát**: upgrade_cap
đảm bảo chỉ các địa chỉ được ủy quyền mới có thể kích hoạt nâng cấp.
*** Move Code**: Được sử dụng trong các mô-đun Di chuyển để xử lý các nâng cấp.
*Ví dụ CLI:
sui client publish --upgrade --package <package-id> --capability <upgrade-cap-id>
Thực hành tốt nhất:
- Kiểm tra nâng cấp trên localnet/testnet.
- Bảo mật
upgrade_cap
để ngăn chặn truy cập trái phép.
Vai trò của upgrade_cap
trong Sui Network
Mục đích: Kiểm soát ai có thể nâng cấp hợp đồng hoặc mô-đun thông minh.
*** Nó làm gì**: Cấp quyền nâng cấp cho các địa chỉ cụ thể (thường là quản trị viên). Nó đảm bảo chỉ các thực thể được ủy quyền mới có thể sửa đổi các hợp đồng đã triển khai.
Các khái niệm chính:
*** Ngôn ngữ di chuyển**: upgrade_cap
được triển khai trong Move để quản lý hợp đồng an toàn.
*Triển dụng: Được chỉ định trong quá trình triển khai hợp đồng để cho phép nâng cấp trong tương lai chỉ bằng các địa chỉ được ủy quyền.
Ví dụ về CLI:
sui client publish --gas-budget 10000 --upgrade-cap <upgrade-cap-id>
Ví dụ di chuyển mã:
public fun grant_upgrade_cap() {
let upgrade_cap = UpgradeCap::new();
// Assign cap to authorized address
}
Các vấn đề thường gặp:
*** Lỗi cho quyền**: Địa chỉ trái phép đang cố gắng nâng cấp.
*Thiếu khả năng: Đảm bảo được thiết lập chính xác trong quá trình triển upgrade_cap
khai.
Thực hành tốt nhất:
Hạn chế upgrade_cap
: Giới hạn quyền truy cập vào các địa chỉ đáng tin cậy.
*** Kiểm tra trong Localnet/Testnet*: Đảm bảo hành vi thích hợp trước khi triển khai lên mainnet.
**upgrade_cap
**trong Sui đóng vai trò như một cơ chế ủy quyền cho việc nâng cấp gói, hoạt động như một đối tượng khả năng duy nhất cấp quyền nâng cấp cho chủ sở hữu của nó. Không giống như chuỗi EVM nơi các hợp đồng là bất biến, hệ thống nâng cấp của Sui yêu cầu đối tượng này sửa đổi các gói đã xuất bản, cung cấp khả năng thay đổi có kiểm soát trong khi vẫn duy trì bảo mật. upgrade_cap
Chủ sở hữu sui client upgrade
có thể ủy quyền nâng cấp thông qua package::authorize_upgrade
lệnh CLI hoặc lập trình thông qua chức năng Move. Các phương pháp hay nhất liên quan đến việc lưu trữ an toàn upgrade_cap
(thường là trong một Versioned
hoặc bao AdminCap
bọc) và thực hiện các kiểm soát quyền sở hữu thích hợp, vì mất nó sẽ khóa vĩnh viễn khả năng nâng cấp trong khi lộ ra nó có nguy cơ sửa đổi trái phép.
Trong mạng Sui, nó upgrade_cap
đóng một vai trò quan trọng trong việc cho phép nâng cấp an toàn và có kiểm soát cho các gói Move sau khi triển khai ban đầu. Khi bạn xuất bản một gói trên Sui, một đối tượng thuộc loại UpgradeCap
được tạo và trả về. Đối tượng này làthẩm quyền duy nhấtcho phép nâng cấp trong tương lai cho gói, hoạt động hiệu quả như một khóa cấp quyền thay đổi mã của nó.
Bạn phải giữ quyền sở hữu gói này upgrade_cap
nếu bạn có ý định nâng cấp gói của mình sau này. Nếu bạn chuyển nó sang một địa chỉ khác hoặc ghi nó (ví dụ: bằng cách gửi nó đến0x0
), thì không thể nâng cấp thêm. Thiết kế này thực thi tính bất biến trừ khi người tạo gói chọn tham gia một cách rõ ràng.
Tại sao UpgradeCap lại quan trọng
Mô hình tập trung đối tượng của Sui giới thiệu khái niệm này để phân biệt giữa các gói bất biến và các gói có thể nâng cấp. Các gói không có quyền truy cập vào chúng upgrade_cap
được coi là bất biến vĩnh viễn. Điều này trái ngược với các chuỗi EVM trong đó các hợp đồng chỉ có thể thay đổi nếu delegatecall
proxy hoặc các mẫu có thể nâng cấp được xây dựng thủ công.
Ví dụ về quy trình làm việc nâng cấp
Khi bạn xuất bản một gói:
sui client publish --path . --gas-budget 100000000
Đầu ra bao gồm:
- ID gói
- ID đối tượng UpgradeCap
Để nâng cấp sau:
sui client upgrade \
--package <original_package_id> \
--module-upgrade-path <new_module_path> \
--upgrade-cap <upgrade_cap_id> \
--gas-budget 100000000
Sử dụng UpgradeCap trong Move
Trong các mô-đun Move của bạn, bạn có thể bảo vệ các nâng cấp hoặc chuyển tiếp nhạy cảm bằng cách sử dụng đối tượng khả năng:
public entry fun secure_upgrade(upgrade_cap: &UpgradeCap, ctx: &mut TxContext) {
// logic that uses upgrade_cap as proof of authority
}
Hoặc phá hủy nó nếu bạn muốn hoàn thiện gói:
transfer::public_transfer(upgrade_cap, @0x0);
Điều này sẽ thu hồi vĩnh viễn khả năng cập nhật gói của bạn.
Thực tiễn tốt nhất
*** Lưu trữ upgrade_cap
trong ví an toàn hoặc mô-đun quản trị**nếu bạn có kế hoạch nâng cấp trong tương lai.
*** Đốt upgrade_cap
nếu bạn muốn gói của mình không thể thay đổi, điều này phổ biến đối với các hợp đồng tài chính hoặc NFT để xây dựng lòng tin của người dùng.
*** Gói logic nâng cấp trong quản lý, để DAO hoặc multisig chấp thuận nâng cấp thay vì một khóa riêng duy nhất.
*Tránh làm rò rỉ upgrade_cap
ID, vì quyền sở hữu tương đương với quyền hạn ở Tùy.
Lỗi thường gặp
*** Thiếu upgrade_cap
trong quá trình nâng cấp→ Kết quả là lỗi “quyền bị từ chối”.
*Vô tình chuyển sang null→ Gói hàng của bạn bị khóa vĩnh viễn.
*** Cố gắng gọi nâng cấp trên các gói bất đổi→ Hệ thống sẽ từ chối giao dịch.
Tìm hiểu thêm
- Tài liệu: https://docs.sui.io/concepts/packages
- Ví dụ nâng cấp: https://docs.sui.io/build/upgrade
- Tham chiếu CLI: https://docs.sui.io/reference/cli/client
Cuối cùng, upgrade_cap
đại diện cho cam kết của Sui về thẩm quyền rõ ràng và kiểm soát chi tiết đối với sự phát triển của nhà nước và mã. Hiểu cách sử dụng, lưu trữ và thu hồi nó là chìa khóa để xây dựng các hợp đồng thông minh an toàn và có thể bảo trì trong hệ sinh thái Sui.
Vai trò của upgrade_cap
trong các gói Sui
Đây upgrade_cap
là mộtđối tượng khả năngkiểm soát quyền nâng cấp gói trong hệ thống nâng cấp lấy đối tượng làm trung tâm của Sui. Không giống như chuỗi EVM sử dụng các mẫu proxy, Sui xử lý các nâng cấp ở cấp gói thông qua đối tượng khả năng chuyên dụng này.
Cơ học cốt lõi
Khi xuất bản một gói:
sui client publish --gas-budget 100000000 --path ./move_package
Giao dịch trả lại:
- ID gói (định danh bất biến)
upgrade_cap
đối tượng (0x2: :package: :UpgradeCap)
Đối tượng khả năng này:
- Làđối tượng Sui hạng nhấtcó thể được sở hữu, chuyển nhượng hoặc chia sẻ
- Phải được bao gồm như một đầu vào trong bất kỳ giao dịch nâng cấp nào
- Chứa ID gói mà nó cho phép nâng cấp
Chi tiết kỹ thuật chính
1.** Mô hình bảo mật**:
- Chỉ chủ sở hữu mới
upgrade_cap
có thể nâng cấp gói - Tuân theo mô hình sở hữu đối tượng của Sui (không có ủy quyền dựa trên chữ ký)
- Có thể được quản lý trong hợp đồng multisig hoặc timelocks
2.** Quy trình nâng cấp**:
sui client upgrade --package [PACKAGE_ID] \
--upgrade-cap [UPGRADE_CAP_ID] \
--gas-budget 200000000 \
--path ./updated_package
3.** Các mẫu di chuyển quan trọng**:
// Storing upgrade_cap in a publisher struct
struct Publisher has key {
id: UID,
upgrade_cap: package::UpgradeCap,
}
// Upgrading (must use &mut reference)
public entry fun upgrade(
publisher: &mut Publisher,
new_package: vector<u8>,
new_modules: vector<vector<u8>>,
ctx: &mut TxContext
) {
package::upgrade_package(
&mut publisher.upgrade_cap,
new_package,
new_modules,
ctx
)
}
Ưu điểm cụ thể của Sui so với EVM
-** Không cần mẫu proxy**: Nâng cấp xảy ra ở cấp gói, không phải cấp hợp đồng
-** Khả năng tương thích lại**: Các đối tượng hiện có vẫn còn hiệu lực sau khi nâng cấp
-Bảo mật dựa trên khả năng: Sử dụng mô hình sở hữu đối tượng của Sui thay vì vai trò quản trị viên
-** Quản trị minh bạch**: Có upgrade_cap
thể được đưa vào kho bạc multisigs hoặc DAO
Lỗi và giải pháp phổ biến
| Lỗi | Nguyên nhân | Khắc phục |
| --------------| -----|
| UpgradeCap not found
| Thiếu đối tượng khả năng | Xác minh bạn đang sử dụng ID upgrade_cap chính xác |
| Package ID mismatch
| Sử dụng sai upgrade_cap | Kiểm tra gói: :id (&cap) khớp với gói mục tiêu |
| Insufficient gas
| Nâng cấp cần nhiều gas hơn | Tăng ngân sách gas (chi phí nâng cấp 2-3x tx thông thường) |
| Module compatibility error
| Thay đổi thay đổi trong phiên bản mới | Đảm bảo bố cục cấu trúc vẫn tương thích |
Thực hành tốt nhất
- Để sản xuất: Chuyển
upgrade_cap
sang ví multisig - Đối với các hợp đồng bất biến: Ghi khả năng sau khi xuất bản
- Luôn xác thực quyền sở hữu khả năng:
object::is_owner(&cap, tx_context::sender(ctx))
- Phát ra các sự kiện khi nâng cấp:
event::emit(UpgradeEvent { package_id, version })
Nó upgrade_cap
thể hiện mô hình bảo mật hướng đối tượng của Sui - quyền nâng cấp được coi là tài sản có thể chuyển nhượng thay vì vai trò quản trị được mã hóa cứng, cung cấp các tùy chọn quản trị linh hoạt trong khi vẫn duy trì bảo mật.
Upgrade_cap trong Sui là một đối tượng đặc biệt đại diện cho quyền nâng cấp gói Move đã xuất bản. Khi bạn xuất bản một gói bằng cách sử dụng Sui CLI, hệ thống sẽ tự động tạo một đối tượng upgrade_cap được liên kết với gói đó. Đối tượng này kiểm soát khả năng nâng cấp hoặc sửa đổi gói sau khi triển khai ban đầu. Nếu không giữ upgrade_cap, không ai có thể nâng cấp gói, làm cho nó bất biến được.
Ví dụ: khi xuất bản một gói:
riêng khách hàng xuất bản --gas-budget 10000 --path. /gói của tôi
Đầu ra bao gồm ID đối tượng upgrade_cap. Đối tượng này phải được bao gồm trong các giao dịch nâng cấp để chứng minh thẩm quyền. Để nâng cấp gói, bạn gọi:
<upgrade_cap_object_id>nâng cấp máy khách riêng - gói - nâng cấp-giới hạn <new_package_path>- ngân sách gas 10000
Giao dịch này tiêu thụ upgrade_cap cũ và phát hành một giao dịch mới cho gói nâng cấp. Upgrade_cap thực thi kiểm soát quyền hạn chế nghiêm ngặt đối với vòng đời gói, đảm bảo chỉ các bên được ủy quyền mới có thể sửa đổi mã hợp đồng.
Từ góc độ Move, bản thân mã gói không trực tiếp thao tác với upgrade_cap vì nó được xử lý ở cấp giao thức. Tuy nhiên, các nhà phát triển cần quản lý đối tượng này một cách an toàn ngoài chuỗi, thường lưu trữ nó trong ví bảo mật hoặc thiết lập multisig để ngăn chặn các nâng cấp trái phép.
Một upgrade_cap bị mất có nghĩa là bạn không thể nâng cấp gói lại, khóa mã vĩnh viễn một cách hiệu quả. Điều này nhấn mạnh tầm quan trọng của các thực hành quản lý khóa an toàn. Hơn nữa, việc nâng cấp một gói ảnh hưởng đến tất cả người dùng dựa vào nó, vì vậy các nâng cấp nên được kiểm tra kỹ lưỡng trên testnet hoặc localnet trước khi triển khai.
Bởi vì các gói Sui được phiên bản hóa, upgrade_cap là chìa khóa để di chuyển giữa các phiên bản. Hệ thống đảm bảo nâng cấp nguyên tử bằng cách gắn phiên bản gói với khả năng này.
Bạn có thể truy vấn upgrade_cap được liên kết với gói bằng cách sử dụng Sui CLI hoặc SDK:
gói nhận gói khách hàng sui <package_id>
trả về chi tiết gói bao gồm upgrade_cap hiện tại. Xử lý upgrade_cap một cách an toàn là một phần của các phương pháp hay nhất trong quy trình phát triển Sui để tránh các thay đổi mã vô tình hoặc độc hại.
Trái ngược với các hợp đồng bất biến hoặc mô hình nâng cấp proxy của Ethereum, upgrade_cap của Sui là một đối tượng khả năng trên chuỗi rõ ràng kiểm soát các nâng cấp. Thiết kế này tăng cường tính minh bạch và bảo mật bằng cách làm cho quyền nâng cấp trở thành một đối tượng rõ ràng trong hệ thống.
Các nhà phát triển phải kết hợp quản lý upgrade_cap vào các đường ống triển khai của họ, thường lập kịch bản quá trình nâng cấp để bao gồm đối tượng upgrade_cap và đảm bảo nó được ký bởi các khóa chính xác.
Các upgrade_cap
gói in Sui là một đối tượng đặc biệt cho phép chủ sở hữu của nó độc quyền nâng cấp gói Move đã xuất bản. Khi bạn triển khai một gói trên mạng Sui, Sui tạo ra một UpgradeCap
đối tượng gắn với tài khoản của bạn. Khả năng này hoạt động như một khóa truy cập an toàn — nếu không có nó, không ai (kể cả bạn) có thể nâng cấp mã của gói đó trong tương lai.
Bạn sử dụng upgrade_cap
khi gọi upgrade
chức năng được cung cấp bởi mô-đun hệ thống của Sui. CLI cho phép bạn thực hiện các nâng cấp như thế này:
sui client upgrade \
--package-path /path/to/your/package \
--upgrade-capability <upgrade_cap_object_id> \
--gas-budget 100000000
Bạn phải chuyển ID của UpgradeCap
đối tượng để ủy quyền giao dịch nâng cấp. Nếu bạn mất UpgradeCap
hoặc chuyển nó đến một địa chỉ không thể truy cập (chẳng hạn như0x0
), gói sẽ trở nên bất biến vì không ai có thể bắt đầu nâng cấp.
Nếu bạn muốn cố tình vô hiệu hóa các nâng cấp trong tương lai, bạn có thể bao gồm một chức năng trong gói của mình như:
public entry fun burn_cap(cap: UpgradeCap) {
sui::package::delete_upgrade_cap(cap);
}
Việc gọi hàm này sẽ xóa khả năng và khóa mã vĩnh viễn. Điều này được khuyến nghị cho các gói phải không đáng tin cậy hoặc được quản lý bên ngoài.
Thực hành tốt nhất: Luôn bảo mật của bạn UpgradeCap
và cân nhắc chuyển nó sang DAO hoặc multisig nếu bạn đang làm việc trên cơ sở hạ tầng cộng tác hoặc công cộng.
###Vai trò của upgrade_cap
trong Gói Sui
Đây upgrade_cap
là mộtđối tượng khả năngcấp quyền nâng cấp gói Move trên Sui. Đó là một tính năng Sui độc đáo cho phéptính đột biến có kiểm soátcho các gói đã xuất bản, không giống như các hợp đồng bất biến trên chuỗi EVM.
###Khái niệm chính 1.** Nó làm gì**:
- Giữ
Publisher
vàUpgradePolicy
(ví dụ,immutable
,compatible
,arbitrary
). - Bắt buộc để ủy quyền nâng cấp gói (ví dụ: sửa lỗi, tính năng mới).
2.** Tại sao Sui lại độc đác**:
upgrade_cap
- Hợp đồng EVM làbất đổisau khi triển khai; Sui cho phép nâng cấpvới quản lý(thông qua).
- Các nâng cấp là** tiết kiệm khí**(chỉ các mô-đun sửa đổi mới được xuất bản lại).
3.** Ý nghĩa bảo mật**:
- Ai cầm
upgrade_cap
có thể thay đổi logic của gói. - Thực hành tốt nhất:** Chuyển nó sang multisig hoặc DAO**sau khi triển khai.
###Di chuyển cấu trúc mã
####1. Định upgrade_cap
nghĩa trong init
module my_pkg::my_module {
use sui::package;
use sui::transfer;
// Called once during package publish
fun init(otw: &mut TxContext) {
let (upgrade_cap, publisher) = package::claim(otw);
transfer::transfer(upgrade_cap, tx_context::sender(otw)); // Give cap to deployer
}
}
####2. Nâng cấp một gói cửa
module my_pkg::upgrader {
use sui::package;
// Requires the UpgradeCap
public entry fun upgrade(
upgrade_cap: &mut UpgradeCap,
new_package: vector<u8>,
otw: &mut TxContext
) {
package::upgrade(upgrade_cap, new_package, otw);
}
}
upgrade_cap
trong Sui là mộtđối tượng chínhkiểm soát nâng cấp gói.
###Điểm chính:
1.Quyền quản trị— Chỉ chủ sở hữu mới upgrade_cap
có thể nâng cấp gói.
2.** Bảo mật**— Ngăn chặn các thay đổi trái phép (không giống như các hợp đồng bất biến của Ethereum).
3. sui client upgrade
Cách sử dụng CLI- Bắt buộc cho.
###Ví dụ di chuyển:
struct UpgradeCap has key, store { id: UID }
###Thực hành tốt nhất:
✔ Lưu trữ an toàn (ví dụ: multisig).
✔ Kiểm tra nâng cấp localnet
trước.
Tại sao độc đáo: Sui cho phép nâng cấp (so với tính bất biến của EVM).
- (Mất
upgrade_cap
= không còn nâng cấp nữa!) *
###1. Khái niệm cốt lử
Đây upgrade_cap
là mộtđối tượng đặc phínhkiểm soát việc nâng cấp gói trong Sui. Không giống như các chuỗi EVM nơi các hợp đồng không thể thay đổi, Sui cho phép khả năng thay đổi có kiểm soát thông qua hệ thống dựa trên khả năng này.
###2. Thuộc tính chính
Bất động sản | Mô tả |
---|---|
Chủ sở hữu | Chỉ chủ sở hữu mới có thể ủy quyền nâng cấp |
Có thể chuyển nhận | Có thể gửi đến các địa chỉ khác |
Có thể đốt nói | Tùy chọn bất biến vĩnh viễn |
###2. Triển khai di chuyển ####Cấu trúc cơ bản
module my_pkg::admin {
use sui::package;
use sui::transfer;
use sui::tx_context;
// Generated during initial publish
struct UpgradeCap has key, store {
id: UID
}
// Initialize and transfer cap
public fun init(ctx: &mut tx_context::TxContext) {
let (upgrade_cap, publisher) = package::claim_upgrade_cap(ctx);
transfer::transfer(upgrade_cap, tx_context::sender(ctx));
}
}
####Quy trình nâng cấp
module my_pkg::upgrader {
use sui::package;
use sui::upgrade_cap;
public entry fun upgrade(
cap: &mut upgrade_cap::UpgradeCap,
policy: u8,
digest: vector<u8>,
ctx: &mut tx_context::TxContext
) {
package::authorize_upgrade(cap, policy, digest);
let new_pkg = package::make_upgrade_ticket(cap, policy, digest);
// ... complete upgrade
}
}
###3. Quy trình làm việc CLI ####Xuất bản ban đầu
sui client publish --gas-budget 1000000000
# Output includes UpgradeCap object ID
####Cho phép nâng cấp
sui client call \
--package <UPGRADE_CAP_PKG> \
--module admin \
--function authorize_upgrade \
--args <UPGRADE_CAP_ID> 1 0x<COMPILED_PACKAGE_DIGEST> \
--gas-budget 1000000000
####Thực hiện nâng cấp
sui client upgrade --upgrade-capability <UPGRADE_CAP_ID> \
--gas-budget 1000000000
###4. Các mẫu bảo mật ####Khả năng làm nướng
struct AdminCap has key {
id: UID,
upgrade_cap: UpgradeCap // Delegatable
}
####** Nâng cấp bị khóa theo thời gian**
module my_pkg::timelock {
struct TimedUpgradeCap has key {
cap: UpgradeCap,
unlock_epoch: u64
}
public fun upgrade_when_ready(
cap: &mut TimedUpgradeCap,
ctx: &mut TxContext
) {
assert!(tx_context::epoch(ctx) >= cap.unlock_epoch, ELOCKED);
package::authorize_upgrade(&mut cap.cap, ...);
}
}
###5. Cạm bẫy phổ biến
Lỗi | Giải pháp |
---|---|
MissingUpgradeCap | Lưu ID giới hạn trong tài liệu triển khai của bạn |
UnauthorizedUpgrade | Sử dụng transfer::freeze_object để khóa nắp |
DigestMismatch | Biên dịch lại với các phụ thuộc giống hệt nhau |
###6. Chính sách nâng cấp
// Bitflags determining upgrade flexibility
const POLICY_COMPATIBLE: u8 = 0x1; // Backwards-compatible
const POLICY_ADDITIVE: u8 = 0x2; // New functions only
const POLICY_BREAKING: u8 = 0x4; // Full changes
###7. Chiến lược kiểm tra ####Chạy khô Localnet
sui client publish --upgrade-policy 7 --dry-run
####** Mô phỏng nâng cấp**
#[test_only]
module test {
fun test_upgrade() {
let (cap, _) = package::test_upgrade_cap();
package::authorize_upgrade(&mut cap, ...);
assert!(package::test_is_authorized(cap), 0);
}
}
###Tác động kiến trúctur 1.** Quản trị phi tập trung (phi tập trung)**:
- DAO có thể giữ mũ nâng cấp
shared
- Đề án đa sig thông qua các đối tượng
2.** Sẵn sàng cho doanh nghiệp**:
- Triển khai theo giai đoạn với cờ chính sách
- Khả năng thu hồi khẩn cấp
3.** Ưu điểm của Devex**:
- Sửa lỗi sau triển khai
- Di chuyển lưu trữ tiết kiệm khí
Đối với hệ thống sản xuất:
- Bảo quản
UpgradeCap
trong kho lạnh - Thực hiện nâng cấp cơ chế bỏ phiếu
- Giám sát thông qua Tab Nâng cấp của Sui Explorer
Trong Sui, upgrade_cap
là một đối tượng đặc biệt cho phép bạn nâng cấp gói Move đã xuất bản. Khi bạn triển khai một gói với--upgradeable
, bạn sẽ tự động nhận được một UpgradeCap
đối tượng được liên kết với nó. Đối tượng này hoạt động giống như một phiếu cấp phép — nếu không có nó, bạn không thể đẩy nâng cấp cho gói đó. Bạn cần giữ và ký với đối tượng này bất cứ khi nào bạn muốn nâng cấp mã, điều này làm cho nó trở thành một cơ chế kiểm soát truy cập mạnh mẽ để phát triển trên chuỗi.
Thiết kế này làm cho Sui khác với chuỗi EVM, nơi logic nâng cấp thường được xử lý thông qua các hợp đồng proxy và vai trò quản trị riêng biệt. Ở Sui, quyền nâng cấp được nung vào hệ thống đối tượng. Nếu bạn đang xây dựng bộ sưu tập NFT, hợp đồng DeFi hoặc bất kỳ hệ thống nào cần cập nhật trong tương lai, điều này UpgradeCap
đảm bảo rằng chỉ nhà phát triển đáng tin cậy (hoặc multisig) với giới hạn đó mới có thể thúc đẩy những thay đổi đó, giảm khả năng nâng cấp trái phép.
Để tạo một gói có thể nâng cấp, hãy sử dụng Sui CLI:
sui client publish --path . --gas-budget 100000000 --with-unpublished-dependencies --upgradeable
Sau khi xuất bản, bạn sẽ thấy một upgrade_cap
trong đầu ra như sau:
"createdObjects": [
{
"objectType": "0x2::package::UpgradeCap",
"objectId": "0xabc123...",
...
}
]
Để nâng cấp gói sau này, hãy biên dịch nó thành bản .json
tổng hợp và chạy:
sui client upgrade --package-id <PACKAGE_ID> --module <PATH_TO_COMPILED_MODULE> --upgrade-capability <CAP_OBJECT_ID> --gas-budget 100000000
Đảm bảo ID đối tượng trong --upgrade-capability
khớp với ID bạn nhận được từ lần xuất bản đầu tiên. Nếu bạn mất đối tượng này hoặc quên bảo vệ nó (như bằng cách chuyển sang ví multisig), bất kỳ ai nhận được nó đều có thể sửa đổi hợp đồng của bạn.
Các lỗi phổ biến bao gồm quên lưu trữupgrade_cap
, sử dụng bản tóm tắt không hợp lệ hoặc cố gắng nâng cấp gói không thể nâng cấp. Thực tiễn tốt nhất là bảo quản an upgrade_cap
toàn, đặc biệt là trong sản xuất và giám sát chặt chẽ trong quá trình kiểm toán.
Bạn có thể đọc thêm về upgrade_cap
và nâng cấp gói bảo mật trong tài liệu chính thức của Sui:
[https://docs.sui.io/build/package-upgrades](https://docs.sui.io/build/package-upgrades]
Bạn có biết câu trả lời không?
Hãy đăng nhập và chia sẻ nó.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Kiếm phần của bạn từ 1000 Sui
Tích lũy điểm danh tiếng và nhận phần thưởng khi giúp cộng đồng Sui phát triển.
- Tại sao BCS yêu cầu thứ tự trường chính xác để khử chuỗi khi cấu trúc Move có các trường được đặt tên?53
- Nhiều lỗi xác minh nguồn” trong các ấn phẩm về mô-đun Sui Move - Giải quyết lỗi tự động43
- Giao dịch Sui thất bại: Đối tượng được dành riêng cho giao dịch khác25
- Làm thế nào để các ràng buộc về khả năng tương tác với các trường động trong các bộ sưu tập không đồng nhất?05