Пост
Поделитесь своими знаниями.
Как я могу несанкционированно обновить пакет Move?
Я пытаюсь разобраться в этом аспекте сети Sui, потому что занимаюсь разработкой, отладкой или развертыванием чего-то, затрагивающего эту область. Мне нужно подробное объяснение работы этого механизма или функции, а также соответствующего использования интерфейса командной строки, структуры кода Move или архитектурных концепций. Моя цель — получить достаточно ясности, чтобы применить эти знания в реальном проекте, будь то специальный смарт-контракт, система NFT, интеграция кошельков или инструмент DeFi. Сеть Sui обладает уникальными возможностями по сравнению с сетями EVM, поэтому мне особенно интересно, что её отличает и как это влияет на передовые практики разработки. Было бы полезно ознакомиться с образцами кода, примерами командной строки или типичными ошибками, особенно при использовании интерфейса командной строки Sui, SDK или развертывании в localnet/testnet. В конечном итоге я хочу избежать распространенных ошибок, следовать лучшим принципам безопасности и обеспечить, чтобы функциональность, над которой я работаю, работала должным образом в реальных условиях.
- Sui
- Transaction Processing
- Move
Ответы
14Для предотвращения несанкционированных обновлений пакета Move на Sui ключевым механизмом является объект upgrade_cap. Этот объект действует как сетевая функция, предоставляющая исключительные полномочия на обновление развернутого пакета. Без наличия upgrade_cap никто не сможет обновить пакет, тем самым защитив его от несанкционированных изменений.
При публикации пакета с помощью интерфейса командной строки Sui:
ваш клиент опубликует --path. /my_package --газовый бюджет 1000
Система создает объект upgrade_cap и возвращает идентификатор объекта. Этот объект должен быть включен в любую транзакцию обновления, например:
sui клиент upgrade --package. <upgrade_cap_object_id>/new_package --upgrade-cap --газ-бюджет 10000
Чтобы защитить ваш пакет, выполните следующие действия:
-
Защитите upgrade_cap: надежно храните его в аппаратном кошельке или кошельке с несколькими подписями, чтобы транзакции по обновлению могли подписывать только уполномоченные лица.
-
Используйте кошельки с несколькими подписями в качестве полномочий на обновление: оберните upgrade_cap в объект кошелька с несколькими подписями. Для этого требуется несколько подписей, прежде чем транзакция обновления будет принята, что повышает уровень безопасности.
-
Внедрите механизмы управления вне сети: координируйте обновления с процедурами одобрения за пределами сети, чтобы избежать мошеннических обновлений.
-
Не передавайте upgrade_cap посторонним лицам и не раскрывайте его в небезопасных средах.
-
Используйте средства управления доступом, специфичные для конкретной среды: например, ограничьте операции обновления определенными средами развертывания или белыми списками IP-адресов в операционной инфраструктуре.
-
Аудит транзакций по обновлению: отслеживайте блокчейн на предмет несанкционированных или неожиданных запросов на обновление, чтобы оперативно реагировать на них.
Если вы потеряете контроль над пакетом upgrade_cap, ваш пакет может быть обновлен любым владельцем пакета, что поставит под угрозу целостность вашего контракта. И наоборот, если вы полностью потеряете upgrade_cap и у вас нет резервной копии, вы больше не сможете обновить пакет, фактически заморозив его состояние.
В отличие от моделей обновления прокси-серверов Ethereum, где возможность обновления закодирована в контрактной логике, Sui использует явный объект возможностей. Такой дизайн повышает прозрачность безопасности, привязывая полномочия по обновлению непосредственно к контролируемому вами объекту в сети.
В коде Move поле upgrade_cap не отображается, поскольку управление разрешениями на обновление осуществляется вне контрактной логики, но оно крайне важно при развертывании и обновлении транзакций с помощью интерфейса командной строки или SDK.
Пример проверки возможности обновления вашего пакета:
клиент sui get-package <package_id>
Это покажет метаданные пакета, включая объект upgrade_cap.
Следуя этим рекомендациям, вы обеспечиваете строгий контроль за обновлениями пакетов, снижая риски несанкционированных изменений и поддерживая доверие пользователей к вашим смарт-контрактам.
Несанкционированные обновления в сети Sui (перемещение)
Чтобы предотвратить несанкционированное обновление пакета Move в сети Sui, вам необходимо убедиться, что обновление разрешено только доверенным лицам или адресам. Это делается с помощью upgrade_cap
механизма****и тщательного контроля за тем, кто может обновить ваш пакет.
Ключевые понятия:
*** upgrade_cap
**: возможность, ограничивающая круг лиц, которые могут обновлять пакет. Вы можете настроить и проверить это во upgrade_cap
время развертывания контракта.
*Процесс обновления контракта: некоторые контракты после их развертывания можно обновить, но вы должны контролировать, кто может инициировать эти обновления.
Шаги по предотвращению несанкционированных обновлений:
1.Настройте upgrade_cap
: при развертывании пакета Move определите, каким образом можно upgrade_cap
ограничить круг лиц, которые могут обновлять ваш контракт.
2.Предоставляйте разрешения на обновление: предоставляйте возможность обновления только доверенным адресам (например, администраторам).
Пример кода перемещения:
module MyPackage {
use 0x1::UpgradeCap;
public fun initialize(owner: address) {
let cap = UpgradeCap::new(owner); // Create upgrade capability for the owner
// Store the upgrade cap in a resource or object
}
public fun upgrade(owner: address) {
// Only the owner (who has the upgrade cap) can call this function
UpgradeCap::assert_cap(&cap, owner); // Ensure the caller has the upgrade cap
// Perform the upgrade logic here
}
}
upgrade_cap
### Пример настройки интерфейса командной строки:
При публикации или развертывании пакета Move вы можете передать upgrade_cap
идентификатор клиенту Sui:
sui client publish --gas-budget 10000 --upgrade-cap <upgrade-cap-id>
Распространенные ошибки:
*Неправильное связывание символа upgrade_cap
: если возможность обновления настроена неправильно, несанкционированные адреса могут случайно получить разрешение на обновление контракта.
*Неверный адрес для обновления: убедитесь, что обновление можно выполнить только по авторизованным адресам (тем, на которых upgrade_cap
они указаны).
Лучшие практики:
upgrade_cap
*Ограничьте возможности обновления: предоставляйте их только доверенным адресам или администраторам.
*Тестируйте в Testnet/Localnet: всегда проверяйте логику обновления в локальных/тестовых сетях, чтобы предотвратить несанкционированные обновления.
*Надежно храните upgrade_cap
файл: убедитесь, что адрес, на котором доступна возможность обновления, надежно управляется.
Контролируя upgrade_cap
и тщательно ограничивая круг лиц, которые могут инициировать обновления, вы сможете избежать несанкционированных обновлений и обеспечить безопасность контракта после развертывания.
Чтобыотменить авторизацию обновленийпакета Move в Sui, вы должныотозвать или сжечь upgrade_cap
объект, поскольку эта возможность является единственным механизмом авторизации обновлений пакетов. После upgrade_cap
уничтожения пакета (например, с помощью команды in public entry fun burn
Move) пакет становитсянеизменным, поскольку Sui применяет строгий контроль за возможностью обновления на уровне протокола. В этом отличие от цепочек EVM, где возможность обновления зависит от шаблонов прокси-серверов или изменяемого хранилища. Модель Sui обеспечивает детерминированную безопасность, явно увязывая обновления с владением возможностями. AdminCap
Чтобы обеспечить децентрализацию в будущем, лучше всего использовать программную оболочку отзыва (напримерupgrade_cap
), а не прятать ее непосредственно под контролем правительства**.
Чтобы несанкционированно или отключить обновления пакета Move в сети Sui, необходимо уничтожить или перенести UpgradeCap
объект, созданный во время первоначального развертывания пакета. UpgradeCap
Это специальный объект, предоставляющий разрешение на обновление этого конкретного пакета. Без этой возможности будущие обновления невозможны.
Чтобы предотвратить обновления, вы можете перенести UpgradeCap
их на недоступный адрес (например0x0
) или уничтожить его с помощью контролируемой вами функции Move. Например, если вы хотите сделать контракт неизменным, включите public entry fun burn_upgrade_cap(cap: UpgradeCap)
функцию в свой модуль и просто вызовите ее после развертывания. После записи обновления навсегда отключаются.
Вот пример фрагмента Move для записи:
public entry fun burn_upgrade_cap(cap: UpgradeCap) {
sui::package::delete_upgrade_cap(cap);
}
Если вы развертываете с помощью интерфейса командной строки, вы можете вызвать эту функцию ввода после публикации:
sui client call \
--package <your_package_id> \
--module <your_module> \
--function burn_upgrade_cap \
--args <upgrade_cap_object_id>
Отключение обновлений необходимо, если вы хотите навсегда заблокировать логику смарт-контракта по соображениям безопасности или управления. Как только ограничение будет уничтожено или перенесено на адрес без секретного ключа, пакет становится полностью неизменным.
Чтобы предотвратить несанкционированное обновление пакета Move в Sui, вы можете реализовать контроль доступа в процессе обновления. В частности, вы можете использовать upgrade_cap
(возможность обновления) и убедиться, что она надежно контролируется доверенным лицом или учетной записью.
Ключевые понятия:
upgrade_cap
*Возможности обновления: определите, кто может обновить пакет Move, связав его с доверенным адресом.
*Контроль доступа: разрешите запускать обновление только той учетной записи, на которой имеется возможность обновления.
Лучшие практики:
1.Безопасное upgrade_cap
владение: предоставляйте права на обновление только доверенным адресам (например, учетной записи разработчика).
2.Используйте подпись: используйте логику проверки подписывающей стороны в процессе обновления, чтобы обновление могли выполнить только авторизованные пользователи.
Пример кода:
module MyModule {
use sui::object::{Object, upgrade_cap};
public fun upgrade(beneficiary: &signer) {
let cap = upgrade_cap::get_cap(beneficiary);
assert!(cap.is_some(), 0); // Ensure the signer is authorized
// Logic for upgrading the contract
}
}
Использование интерфейса командной строки:
Используйте интерфейс командной строки Sui для безопасной публикации обновлений и управления ими:
sui client publish --upgrade --package <package-id> --capability <upgrade-cap-id>
Распространенные ошибки, которых следует избегать:
upgrade_cap
*Отсутствие контроля доступа: избегайте присвоения учетным записям, которым не доверяют.
*Несовместимость состояний: убедитесь, что обновление не нарушает существующие состояния объектов или структуры данных. Всегда сначала тестируйте в локальной сети/тестовой сети.
Чтобы предотвратить несанкционированное обновление пакета Move, выполните следующие действия:
####1. Сделайте пакет неизменяемым
// During publishing, set `UpgradePolicy` to `immutable`
let upgrade_cap = package::claim_and_keep(otw);
package::make_immutable(upgrade_cap); // 🔐 Burn upgrade capability
-Эффект: дальнейшие обновления не разрешены (например, контракты EVM).
####2. UpgradeCap
Безопасное управление
Если необходимы обновления:
-Переход на upgrade_cap
MultiSIG/DAO:
transfer::transfer(upgrade_cap, @multisig_address);
-Используйте собственную логику аутентификации:
public entry fun upgrade(
_: &AdminCap, // Requires admin permission
upgrade_cap: &mut UpgradeCap,
new_package: vector<u8>
) { package::upgrade(upgrade_cap, new_package); }
####Пример интерфейса командной строки (публикация неизменяема)
sui client publish --gas-budget 100000000
# Then call `make_immutable` with the returned `upgrade_cap` ID
###Ключевые отличия от EVM
UpgradeCap
-Sui: возможность обновления возможна по желанию (через).
-EVM: Контракты по умолчанию неизменны (нет встроенного механизма обновления).
###Распространенные ловушки
upgrade_cap
Утрата: переводы на недействительный адрес = необратимы. 2.Обновления с повышенными привилегиями: не предоставляйте EOA прав на обновление.
UpgradeCap
Чтобы никто не мог обновить пакет Move в сети Sui, в том числе и вы сами, вам необходимо отозвать полномочия, связанные с объектом пакета. Именно этот объект контролирует разрешение на будущие обновления. Если вы удалите этот объект или сделаете его недоступным, пакет станет неизменяемым и его больше нельзя будет изменить.
Вы можете сделать это безопасно, используя sui::package::delete_upgrade_cap
функцию в коде Move. Вот простой пример, который вы можете добавить в свой модуль:
use sui::package;
use sui::package::UpgradeCap;
public entry fun lock_package(cap: UpgradeCap) {
package::delete_upgrade_cap(cap);
}
Затем после развертывания пакета выполните следующую функцию в транзакции с помощью интерфейса командной строки Sui или SDK:
sui client call \
--package <your_package_id> \
--module <your_module_name> \
--function lock_package \
--args <upgrade_cap_object_id> \
--gas-budget 100000000
Таким образом, программа UpgradeCap
сжигается, а значит, ее больше нет в блокчейне, и никто не сможет авторизовать еще одно обновление. Это лучший способ, если вы хотите обеспечить неизменность кода, особенно для готовых к использованию контрактов DeFi, стандартов NFT или любой другой логики, в которой пользователи полагаются на ненадежное и заблокированное поведение.
В архитектурном контексте: в отличие от EVM, где смарт-контракты по умолчанию неизменны, Sui позволяет обновлять пакеты, что обеспечивает гибкость, но также усложняет управление. Чтобы «запретить» обновления, необходимо явно уничтожить ключ, разрешающий их использование.
Подробнее читайте в официальной документации по обновлению пакета Sui здесь: https://docs.sui.io/build/packages-and-upgrades#making-packages-immutable
Чтобы предотвратить несанкционированное обновление пакета Move в Sui,уничтожьте или заблокируйте upgrade_cap
объектпосле публикации.
Объект upgrade_cap
(from0x2::package::UpgradeCap
) — это первоклассный объект, предоставляющий право на обновление. Если пакет останется в адресе издателя, любой, у кого есть доступ, сможет обновить пакет.
Лучшие практики:
-Для неизменяемых контрактов: включите возможность:
public entry fun burn_upgrade_cap(cap: package::UpgradeCap) {
package::discard(cap); // Destroys the capability
}
-Для регулируемых обновлений: переходите upgrade_cap
на модуль multisig или DAO вместо того, чтобы хранить его в одной учетной записи.
- Никогда не выставляйте на публичные мероприятия без контроля
upgrade_cap
доступа.
Проверьте интерфейс командной строки:
sui client object --id [PACKAGE_ID] # Look for associated UpgradeCap object
После upgrade_cap
уничтожения пакет становитсянавсегда неизменяемым— это эквивалентно «блокировке» контракта для Sui (например, паттерны обновляемости EVM).
Этот механизм уникален для объектно-ориентированной модели Sui: разрешение на обновление зависит от владельца объекта, а не от ролей администратора или логики в контракте.
Чтобы предотвратить несанкционированные обновления в Sui, выполните следующие действия:
1.Сожгите UpgradeCap
— уничтожьте его после развертывания, чтобы сохранить его в неизменном виде.
2. init
Заблокировать— Если требуется постоянная неизменяемость, не используйте колпачок в одном месте.
###Пример перемещения:
public fun lock_forever(cap: UpgradeCap) {
sui::package::make_immutable(cap) // Burns cap
}
Ключевые примечания:
✔ UpgradeCap
Без них обновления невозможны.
✔ В отличие от EVM, Sui обеспечивает обратимую неизменность.
Альтернатива CLI:
sui client call --function lock_forever --args <CAP_ID>
- (Внимание! Если вы заранее не запланировали методы восстановления), оно может быть постоянным. ) *
Для предотвращения несанкционированных обновлений пакета Move на Sui основным механизмом является объект upgrade_cap. Этот объект возможностей предоставляет исключительные полномочия на обновление развернутого пакета. Не обладая функцией upgrade_cap, никто не сможет обновить пакет, обеспечив тем самым безопасность.
Когда вы публикуете пакет с помощью интерфейса командной строки Sui:
ваш клиент опубликует --path. /my_package --газовый бюджет 1000
Создан и возвращен объект upgrade_cap. Этот идентификатор объекта должен быть указан при обновлении пакета:
sui клиент upgrade --package. <upgrade_cap_object_id>/new_package --upgrade-cap --газ-бюджет 10000
Чтобы обезопасить процесс обновления, выполните следующие действия:
-
Храните upgrade_cap безопасно, например, в аппаратном кошельке или кошельке с несколькими подписями.
-
Используйте кошелек с несколькими подписями для хранения upgrade_cap, поэтому для обновлений требуется несколько подписей.
-
Не сообщайте идентификатор объекта upgrade_cap и не публикуйте его в открытом доступе.
-
Внедрите управление вне сети, чтобы утверждать обновления перед их внедрением.
-
Ограничьте доступ к обновлениям с помощью средств управления средой или внесения инфраструктуры в белый список.
-
Отслеживайте транзакции в блокчейне для обнаружения несанкционированных попыток обновления.
-
Безопасно создайте резервную копию upgrade_cap, чтобы не потерять возможность обновления.
-
Помните, что потеря upgrade_cap означает, что вы больше не сможете обновлять свой пакет.
-
В отличие от прокси-серверов EVM, управление обновлениями в Sui осуществляется отдельным объектом, а не контрактной логикой.
-
Сам код Move не содержит логики обновления; он обрабатывается извне с помощью upgrade_cap.
-
upgrade_cap привязан к метаданным пакета и виден при запросе информации о пакете:
клиент sui: get-package <package_id>
-
Всегда проверяйте право собственности upgrade_cap перед попыткой обновления.
-
При обновлении идентификатор пакета остается неизменным; изменяется только код.
-
Несанкционированное владение upgrade_cap позволяет осуществлять вредоносные обновления.
-
Используйте механизмы контроля доступа в операционной среде для защиты транзакций по обновлению.
-
Спроектируйте свой конвейер CI/CD таким образом, чтобы обновление утверждалось вручную.
-
Для привлечения к ответственности отслеживайте, кому принадлежит upgrade_cap в вашей команде или организации.
-
При необходимости вы можете перенести объект upgrade_cap в другую учетную запись, но делайте это осторожно.
-
Обеспечьте экономичность операций по модернизации, указав соответствующие бюджеты на газ.
-
Сочетание внутрисетевого контроля upgrade_cap с управлением вне сети — лучшая практика безопасного обновления пакетов на Sui.
To prevent unauthorized upgrades of a Move package on Sui, the core mechanism is the upgrade_cap object. This capability object grants exclusive authority to upgrade a deployed package. Without possessing the upgrade_cap, no one can upgrade the package, ensuring security.
When you publish a package via Sui CLI:
sui client publish --path ./my_package --gas-budget 10000
An upgrade_cap object is created and returned. This object ID must be provided when upgrading the package:
sui client upgrade --package ./new_package --upgrade-cap <upgrade_cap_object_id> --gas-budget 10000
To secure the upgrade process:
Store the upgrade_cap securely, such as in a hardware wallet or multisig wallet.
Use a multisig wallet to hold the upgrade_cap so multiple signatures are required for upgrades.
Avoid sharing the upgrade_cap object ID or exposing it publicly.
Implement off-chain governance to approve upgrades before execution.
Restrict upgrade access with environment controls or infrastructure whitelisting.
Monitor blockchain transactions to detect unauthorized upgrade attempts.
Back up the upgrade_cap securely to avoid losing upgrade ability.
Remember that losing the upgrade_cap means you cannot upgrade your package anymore.
Unlike EVM proxies, Sui’s upgrade control is managed by a distinct object, not contract logic.
The Move code itself does not hold upgrade logic; it's handled externally via the upgrade_cap.
The upgrade_cap is tied to the package’s metadata and visible when querying package info:
sui client get-package <package_id>
Always verify the upgrade_cap ownership before attempting upgrades.
When upgrading, the package ID remains constant; only the code changes.
Unauthorized possession of the upgrade_cap allows malicious upgrades.
Use access control mechanisms in your operational environment to protect upgrade transactions.
Design your CI/CD pipeline to require manual approval steps for upgrades.
Track who holds the upgrade_cap in your team or organization for accountability.
You can transfer the upgrade_cap object to another account if needed, but do so cautiously.
Keep upgrade transactions gas-efficient by specifying appropriate gas budgets.
Combining on-chain upgrade_cap control with off-chain governance is the best practice for secure package upgrades on Sui.
###1. Основной механизм безопасности
UpgradeCap
Sui используетupgrade caps() для управления изменчивостью пакетов. В отличие от неизменяемых контрактов EVM, Sui разрешает обновления, но при условии строгого контроля владения.
####Ключевые свойства
Функция | Описание |
---|---|
UpgradeCap | Передаваемый объект, предоставляющий права на обновление |
Политики | Битовые флаги, определяющие допустимые изменения (обратно совместимые, аддитивные, критические) |
Проверка дайджеста | Обеспечивает соответствие байт-кода ожидаемому хешу |
###2. Паттерны реализации
####Базовый неизменяемый пакет
module my_pkg::governance {
use sui::package;
use sui::transfer;
use sui::tx_context;
// Burn upgrade cap at initialization
public fun init(ctx: &mut TxContext) {
let (upgrade_cap, _) = package::claim_upgrade_cap(ctx);
package::burn_upgrade_cap(upgrade_cap); // Permanent immutability
}
}
####Обновления, управляемые DAO
module my_pkg::dao {
use sui::voting;
use sui::package;
struct DaoCap has key, store {
id: UID,
upgrade_cap: UpgradeCap,
threshold: u64
}
public entry fun authorize_upgrade(
dao: &mut DaoCap,
proposal_id: ID,
policy: u8,
digest: vector<u8>,
ctx: &mut TxContext
) {
assert!(voting::is_approved(proposal_id, dao.threshold), EACCESS_DENIED);
package::authorize_upgrade(&mut dao.upgrade_cap, policy, digest);
}
}
###3. Применение CLI
####Развертывайте как неизменяемые
sui client publish --gas-budget 1000000000 --with-upgrade-capability false
####Проверьте неизменность
sui client object <UPGRADE_CAP_ID> --json | grep "burned"
# Expected: "burned": true
###4. Передовые практики безопасности
####Матрица политик обновления
Флаг политики | Разрешенные изменения | Рекомендуется для |
---|---|---|
0x1 (СОВМЕСТИМО) | Только исправления ошибок | Стабильные протоколы |
0x3 (ADDITIVE) | Новые функции | Развивающиеся системы |
0x7 (АКТУАЛЬНО) | Полные изменения | Ранняя разработка |
#####Защита от нескольких подписаний
module my_pkg::multisig {
struct UpgradeVault has key {
id: UID,
cap: UpgradeCap,
required: u8,
approvals: vector<address>
}
public entry fun approve(
vault: &mut UpgradeVault,
signer: &signer
) {
let addr = signer::address_of(signer);
assert!(!vector::contains(&vault.approvals, &addr), EALREADY_APPROVED);
vector::push_back(&mut vault.approvals, addr);
if (vector::length(&vault.approvals) >= vault.required) {
package::authorize_upgrade(&mut vault.cap, POLICY_ADDITIVE, digest);
}
}
}
###5. Векторы атак и способы их смягчения
Угроза | Решение | Пример перемещения |
---|---|---|
struct TimedCap { unlock_epoch: u64 } | Украденный колпачок | Модернизация тайм-замков |
assert!(digest == expected_digest, EINVALID) | Вредоносное обновление | Требуется верификация дайджеста |
required = 5/7 | Управление | Прогрессивная децентрализация |
###6. Стратегии тестирования
####Пробный запуск локальной сети
sui client publish --upgrade-policy 1 --dry-run
# Verify no upgrade cap is created
####Отрицательный тестовый случай
#[test(expected_failure = "EUPGRADE_NOT_AUTHORIZED")]
fun test_unauthorized_upgrade() {
let (_, publisher) = package::claim_upgrade_cap(ctx);
package::authorize_upgrade(&mut cap, 0x7, digest); // Should fail
}
###7. Мониторинг и восстановление
####**Проверка в сети
// TypeScript SDK check
const isImmutable = await client.getObject({
id: upgradeCapId,
options: { showContent: true }
}).then(obj => obj.data?.content?.type === '0x2::package::UpgradeCap');
####Экстренное замораживание
public entry fun freeze_forever(cap: UpgradeCap) {
transfer::freeze_object(cap); // Makes cap non-transferable
}
###Ключевые отличия от EVM | Внешний вид | Костюм | EVM | -------------| | | -----| |Механизм обновления| Объектно-ориентированный | Прокси-паттерны | |Детализация| Управление каждым пакетом | Все или ничего | |Проверяемость| История обновлений в сети | Администраторы непрозрачных прокси-серверов |
Для производственных систем:
- Хранить
UpgradeCap
в холодном хранилище - Внедритемультиподпись с временными задержками
- ИспользуйтеSui Explorerдля отслеживания предложений по обновлению
Знаете ответ?
Пожалуйста, войдите в систему и поделитесь им.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Заработай свою долю из 1000 Sui
Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.

- ... SUIMatthardy+2095
- ... SUIacher+1666
- ... SUIjakodelarin+1092
- ... SUIChubbycheeks +1081
- ... SUITucker+1047
- ... SUIKurosakisui+1034
- ... SUIzerus+890
- Почему BCS требует точного порядка полей для десериализации, когда структуры Move содержат именованные поля?65
- «Ошибки проверки нескольких источников» в публикациях модуля Sui Move — автоматическое устранение ошибок55
- Как максимизировать прибыль, держа SUI: стейкинг и ликвидный стейкинг414
- Сбой транзакции Sui: объекты, зарезервированные для другой транзакции49
- Ошибка Sui Move — невозможно обработать транзакцию Не найдено действительных газовых монет для транзакции316