Автор: Sui Network
Sui — это публичная сеть L1, переработанная и построенная на основе основных принципов, целью которой является предоставление создателям и разработчикам платформы разработки, способной принять следующий миллиард пользователей в Web3. Приложения на Sui основаны на языке смарт-контрактов Move и имеют возможность горизонтального масштабирования, что позволяет разработчикам быстро и с низкими затратами поддерживать широкий спектр разработки приложений. Основная сеть Sui была официально запущена 3 мая 2023 года.
Эта статья послужит для разработчиков кратким справочником по лучшим практикам Sui Network.
Переместить общие знания
Узнайте больше об обновлениях пакетов и напишите код, удобный для обновления.
Пакеты неизменяемы, а уязвимый код пакета может вызываться вечно. Решение состоит в том, чтобы добавить защиту на уровне объекта. Если вы обновите пакет с P до P', другие пакеты и клиенты, зависящие от P, продолжат использовать P вместо автоматического обновления до P'. Поэтому код, который зависит как от пакета, так и от клиента, необходимо обновить, чтобы он явно указывал на P'. Пакеты, которые, как ожидается, будут расширяться зависимыми пакетами, могут избежать нарушения своих предыдущих расширений при каждом обновлении, предоставляя (неизменяемый) интерфейс, соответствующий стандарту во всех версиях. Если взять в качестве примера межцепной мост Wormhole, сообщения отправляются через Wormhole в качестве моста. Чтобы сгенерировать пакет расширения для отправки сообщений, вы можете использовать инструкцию подготовить_message в любой версии пакета Wormhole для создания MessageTicket и клиента. код, отправляющий сообщение, должен передать MessageTicket в public_message в пакете последней версии. Публичные функции нельзя удалить или изменить, а вот публичные (дружественные) функции — можно. Вы можете использовать общедоступные (другие) или только видимые для себя функции, если только вы не хотите сделать библиотечную функцию now общедоступной навсегда. Вы не можете удалять типы структур, добавлять новые поля (хотя вы можете добавлять динамические поля) или обновлять новые функции. Тщательно подумайте, добавляя новые типы: однажды добавленные они останутся там навсегда!
Используйте коллекции с поддержкой векторов (например, Vector, VecSet, VecMap, PriorityQueue) с максимальным количеством элементов данных 1000.
Коллекции, использующие поддержку динамических полей (например, Table, Bag, ObjectBag, ObjectTable, LinkedTable), используются для любой коллекции, которая позволяет третьим лицам добавлять более крупные коллекции и коллекции неизвестного размера. Максимальный размер объектов Sui Move составляет 250 КБ. Любая попытка создать объект большего размера приведет к прерыванию транзакции. Убедитесь, что размер вашего объекта не превышает размер поддерживаемой коллекции вектора.
Если ваша функция f требует платежа от вызывающей стороны, например, с помощью SUI, используйте функцию fun f(Payment: Coin) вместо функции fun f(Payment: &mut Coin, sum: u64). Это безопаснее для вызывающего абонента, поскольку он точно знает, сколько заплатить, и ему не нужно полагаться на функцию f для получения правильной суммы.
Никакой небольшой оптимизации потребления газа не требуется. При расчете стоимости на Sui она округляется до ближайшего ведра, поэтому смену газа вызовут только очень резкие колебания. Особенно, если ваша сделка уже находится в диапазоне самых низких затрат, она не может стать дешевле. Пожалуйста, обратитесь к изображению ниже для получения подробной информации.
Следуйте соглашениям по кодированию Move, чтобы добиться единообразия стиля.
Возможность компоновки Используйте стандарт отображения, чтобы настроить внешний вид ваших объектов в кошельках, приложениях и браузерах. Избегайте использования функции «самопередачи» — в любой момент можно вернуть obj из текущей функции вместо записи Transfer::transfer(obj, tx_context::sender(ctx)), что позволяет вызывающему объекту или программируемой блокировке транзакции (программируемый блок транзакций) использует obj. Тест Используйте sui::test_scenario` для моделирования тестового сценария с несколькими транзакциями и несколькими отправителями. Используйте sui::test_utilsmodule для улучшения сообщений об исправлении ошибок с помощью тестов Assert_eq, отладочной печати с помощью print и уничтожения только для тестирования с помощью Destroy. Используйте sui move test --coverage для расчета информации о покрытии кода при тестировании и используйте sui move Coverage source --module для просмотра непокрытых строк, выделенных красным. Если это возможно, рекомендуется установить охват на 100%. Приложения. Для оптимальной производительности и согласованности данных приложения должны отправлять запросы на запись и чтение на одном и том же полном узле. В SDK TS это означает, что приложение должно использовать API-интерфейс SignTransactionBlock кошелька, а затем отправить транзакцию, вызвав Execute_transactionBlock на полном узле приложения, а не использовать API-интерфейс SignAndExecuteTransactionBlock кошелька. Это обеспечивает согласованность записи перед чтением — операции чтения из полного узла приложения немедленно отражают записи транзакции, а не ждут контрольной точки. Чтобы уменьшить задержку, если вашему приложению необходимо знать, что транзакция была подтверждена, но ему не нужно немедленно видеть последствия транзакции или читать объекты/события, записанные транзакцией, используйте ExecuteTransactionBlock с «showEffects»: false и « шоуЕвентс": ложь. Приложения должны кэшировать часто читаемые данные локально, а не часто получать их из полного узла. По возможности используйте программируемые блоки транзакций для объединения существующих функций цепочки, а не выпускайте новый код смарт-контракта. Программируемые блоки транзакций позволяют осуществлять крупномасштабную пакетную обработку и гетерогенный состав, что еще больше снижает и без того низкую плату за газ. Приложения должны оставлять бюджет газа, цену газа и выбор монет на усмотрение кошелька, что обеспечит большую гибкость кошелька, и ответственность кошелька заключается в тестировании транзакции, чтобы гарантировать, что транзакция не завершится неудачно. Подписание Никогда не подписывайте две параллельные транзакции, которые касаются одного и того же эксклюзивного объекта, либо используя эксклюзивный объект отдельно, либо ожидая завершения одной транзакции перед отправкой следующей транзакции. Нарушение этого правила может привести к двусмысленности клиента и блокировке эксклюзивных объектов, участвующих в обеих транзакциях, до конца текущей эпохи. Любая команда клиента sui, инициирующая транзакцию (например, публикация клиента sui, вызов клиента sui), может принять флаг --serialize-output для вывода транзакции base64, подлежащей подписанию. Sui поддерживает несколько схем подписи для подписи транзакций, включая собственные мультиподписи.
