Sui.

Пост

Поделитесь своими знаниями.

HaGiang.
Jul 26, 2025
Экспертные Вопросы и Ответы

Нужно ли мне отправлять параллельные текстовые сообщения? ,

ребята, у меня есть приемник sui на языке go, но скорость в секунду низкая, как мне сделать его быстрее, нужно ли мне отправлять параллельные TXS? , RequestType: «waitforEffectScert», работает очень медленно

  • Sui
0
10
Поделиться
Комментарии
.

Ответы

10
0xduckmove.
Jul 27 2025, 11:29

Да, параллельная отправка транзакций может значительно повысить пропускную способность. Последовательное использование waitForEffectScert для каждой транзакции замедлит вашу работу. Вместо этого пакетируйте транзакции и обрабатывайте ответы асинхронно. Кроме того, используйте waitForLocalExecution только в случае необходимости. Оптимизируйте, повторно используя соединения и настраивая параметры параллелизма в SDK.

2
Лучший ответ
Комментарии
.
Arnold.
Arnold3036
Jul 29 2025, 14:57

Да, используйтепараллельные TXдля повышения TPS. WaitForEffectsCert``WaitForLocalExecutionувеличивает задержку — переключайтесь на запросы или выполняйте пакетные запросы.

// Example: Send TXs concurrently in Go  
var wg sync.WaitGroup  
for i := 0; i < 10; i++ {  
    wg.Add(1)  
    go func() {  
        defer wg.Done()  
        // Your Sui TX code here  
    }()  
}  
wg.Wait()  

Ключевые оптимизации: 1.Параллельные TX: используйте горутины (избегайте ограничений скорости). 2.Пакетные запросы: по возможности комбинируйте TX. 3. WaitForLocalExecution``WaitForEffectsCertБолее быстрое подтверждение: Предпочтительнее.

5
Комментарии
.
Paul.
Paul4340
Jul 31 2025, 12:17

Да, если у вас медленные транзакции в секунду (TPS), а ваш приемникSui в Go запаздывает при последовательной обработке транзакций, отправкапараллельных транзакцийможет значительно повысить пропускную способность. WaitForEffectsCertОперация**может стать узким местом при однопоточном выполнении, но параллельное выполнение транзакций и ожидание результатов может повысить эффективность. Ниже описано, как решить эту проблему:

1.Параллелизуйте отправку транзакций

*Отправляйте параллельные транзакции: вместо последовательного ожидания результатов каждой транзакции можно отправлять несколько транзакций параллельно. Это позволяет системе обрабатывать транзакции одновременно, улучша�� TPS.

  • В Go вы можете использоватьgoroutinesдля параллельной отправки транзакций, что поможет максимизировать пропускную способность. Убедитесь, что транзакции независимы друг от друга (то есть не зависят от результатов друг друга).

Примерс использованиемgoroutinesдля отправки параллельных транзакций:

package main

import (
    "fmt"
    "sync"
)

// Simulate sending a transaction
func sendTransaction(txID int, wg *sync.WaitGroup) {
    defer wg.Done()
    // Send transaction logic here
    fmt.Printf("Transaction %d sent\n", txID)
}

func main() {
    var wg sync.WaitGroup
    txCount := 10  // Number of transactions to send

    for i := 0; i < txCount; i++ {
        wg.Add(1)
        go sendTransaction(i, &wg)  // Launch goroutine to send transaction
    }

    wg.Wait()  // Wait for all transactions to be sent
    fmt.Println("All transactions sent.")
}

2. WaitForEffectsCertОптимизируйте

*Распараллеливайте ожидание эффектов: это WaitForEffectsCertможет замедлить последовательное выполнение, поскольку рез��льтаты каждой транзакции будут подтверждены один за другим. Чтобы смягчить эту проблему, сделайте следующее:

Ожидание пакета: вместо последовательного ожидания результатов каждой транзакции вы можете управлять результатами нескольких транзакций и ждать их одномомент*. Это сокращает время ожидания. WaitForEffectsCert*Используйте параллельность: создайте пул работников или используйтеgoroutinesдля параллельной обработки нескольких запросов.

WaitForEffectsCertПримерраспараллеливания (псевдокод):

// Pseudo-code to parallelize effect wait
effectsChannel := make(chan Result, txCount)
for i := 0; i < txCount; i++ {
    go func(txID int) {
        // Wait for effect cert
        result := waitForEffectsCert(txID)
        effectsChannel <- result
    }(i)
}

// Collect results
for i := 0; i < txCount; i++ {
    result := <-effectsChannel
    fmt.Printf("Effect for Transaction %d: %v\n", result.txID, result)
}

3. TransactionBlockЭффективно используйте API

*Блоки транзакций: вместо отправки отдельных транзакций сгруппируйте несколько операций вблок транзакций. Это снижает накладные расходы на отправку каждой транзакции по отдельности и ускоряет обработку. *Массовая отправка: API Sui позволяет отправлять несколько действий за одну транзакцию, что может значительно повысить пропускную способность. WaitForEffectsCertОбъединение операций в более крупные транзакции снижает количество необходимых вызовов.

4.Отслеживайте и настраивайте конфигурацию клиента Sui

  • Если вы используете клиентSui RPCдля отправки транзакций, проверьте, оптимизирована ли конфигурация клиента (например, размер пакета или время ожидания запроса) для обеспечения высокой пропускной способности. *Размер пакета: настройка размеров пакетов для отправки нескольких транзакций поможет снизить накладные расходы. *Тайм-ауты и повторные запросы: убедитесь, что ваш клиент настроен на эффективную обработку тайм-аутов и повторных попыток. Проблемы с сетью или нагрузка на сервер могут привести к задержкам, поэтому оптимизация политик тайм-аутов и повторных попыток поможет сократить время отклика.

5.Балансировка нагрузки и сегментирование нагрузки

  • Если вы сталкиваетесь сбольшим объемом транзакций, рассмотрите возможность балансировки нагрузкиилисегментирования**ваших запросов. Разделите транзакции между несколькими узлами или клиентами, чтобы избежать узких мест, вызванных одним подключением.
  • Это можно сделать, распределив разные наборы транзакций между разными валидаторамиSuiиликонечными точками RPC, обеспечив параллельную обработку нескольких ресурсов.

6.Просмотрите зависимости от транзакций

  • Если транзакции зависят друг от друга (например, если одна транзакция должна произойти раньше другой), вам нужно будет последовательно дожидаться результатов каждой транзакции. Однако если транзакциинезависимые, вы можете отправлять их параллельно и дожидаться результатов самостоятельно.
  • Если возможно, реструктурируйте транзакции, чтобы уменьшить взаимозависимости и обеспечить большую параллелизацию.

7.Оптимизируйте запросы RPC

*Объединение соединений: если вы отправляете несколько запросов RPC, убедитесь, что вы повторно используетепостоянные соединения, чтобы избежать накладных расходов на установку новых подключений для каждого запроса. *Пакетирование запросов: если Sui RPC поддерживает эту функцию, рассмотрите возможностьобъединения нескольких запросов в одно, чтобы сократить накладные расходы на несколько сетевых вызовов туда и обратно.

8.Учитывайте производительность узла

*Загрузка валидатора: если вы отправляете транзакции на один узел валидатора Sui, убедитесь, что этот узелспособен обрабатывать высокие значения TPS. Возможно, вам придется масштабировать инфраструктуру или распределять запросы между несколькими валидаторами для повышения производительности.


Вкратце:

*Параллельные транзакции: используйтеgoroutinesв Go для одновременной отправки и ожидания транзакций, уменьшая задержку. *Пакетные транзакции: сгруппируйте несколько действий в одну транзакцию, чтобы снизить накладные расходы. *Оптимизация WaitForEffectsCert: одновременная обработка нескольких WaitForEffectsCertвызовов для повышения пропускной способности. *Конфигурация клиента: проверьте настройки клиента, такие как время ожидания и размер пакета, чтобы обеспечить оптимальную производительность. *Масштабирование инфраструктуры: при необходимости распределите нагрузку между несколькими валидаторами или узлами Sui, чтобы увеличить TPS.

Применяя эти стратегии, вы сможете значительно повысить пропускную способность и производительность приемника Sui, сделав его более подходящим для сценариев использования в реальном времени.

5
Комментарии
.
Evgeniy CRYPTOCOIN.
Jul 30 2025, 08:52

Да,параллельные транзакцииповысят ваш TPS. Дизайн Sui основан на параллельном исполнении. Вот как можно оптимизировать:

###Быстрые исправления: 1.Одновременная отправка текстовых сообщений— используйте подпрограммы для пакетной обработки транзакций (Sui обрабатывает их параллельно). 2.Пропустить WaitForEffectsCert— Для независимых TX используйте:

  RequestType: "ImmediateReturn" // Faster, but check status later  
  1. ProgrammableTransactionBlockПакетные PTBS— объединение действий в одно.

Ключевые преимущества:Конфликтов нет? → Свободно распараллеливайте (Sui автоматически обрабатывает блокировки объектов). ✔Зависимые TX? Сгруппируйте в PTB или упорядочьте только критические этапы.

Пример последовательности действий:

// Launch 100 TXs concurrently  
for i := 0; i < 100; i++ {  
    go submitTx(txData[i])  
}  

Следите за: -Резкие скачки газовпри высоком уровне параллелизма. -Зависимости от заказа(используйте PTB, если TX делят объекты).

4
Комментарии
.
Alya.
Alya-14
Jul 31 2025, 14:34

Да, отправляйте параллельные транзакции для увеличения TPS. WaitForEffectsCertработает медленно, потому что один за другим ожидает консенсуса. Используйте параллельное выполнение с уникальными объектами отправителя или временными метками, чтобы избежать конфликтов. Sui занимается параллелизацией — просто обеспечьте независимые транзакции и правильно выполняйте пакетную обработку.

4
Комментарии
.
Bekky.
Bekky1762
Jul 30 2025, 13:37

###1. Параллельная обработка TX (обязательно)

// Worker pool pattern
func processInParallel(txChan <-chan *Transaction, workers int) {
    var wg sync.WaitGroup
    wg.Add(workers)

    for i := 0; i < workers; i++ {
        go func() {
            defer wg.Done()
            for tx := range txChan {
                submitTx(tx) // Your TX submission logic
            }
        }()
    }
    wg.Wait()
}

Ключевые настройки:

  • Оптимальные работники = 2 * CPU cores
  • Размер партии = 50-100 TXs/worker

###2. Более быстрый режим подтверждения WaitForEffectsCertЗамените на:

requestType := "WaitForLocalExecution"  // 3-5x faster
// OR for max speed (risky):
requestType := "ImmediateReturn" // + async status checks

###3. Объединение соединений

import "github.com/valyala/fasthttp"

client := &fasthttp.Client{
    MaxConnsPerHost:     1000,  // Default is 512
    ReadTimeout:         10 * time.Second,
    WriteTimeout:        10 * time.Second,
    MaxIdleConnDuration: 30 * time.Second,
}

###4. Специальная оптимизация ####Управление газовыми объектами

// Pre-load 1000 gas objects
gasObjects := make(chan string, 1000)
go func() {
    for i := 0; i < 1000; i++ {
        obj := getNewGasObject() // Your implementation
        gasObjects <- obj
    }
}()

####Пакетное здание TX

txBatch := make([]*Transaction, 0, 50)
for i := 0; i < 50; i++ {
    txBatch = append(txBatch, buildTx())
}
submitParallel(txBatch) // Implement batch RPC

###5. Бенчмарки производительности | Подход | TPS (Go) | Задержка | ----------| ---------| | ---------| | Последовательный | 50-100 | 500 мс + | | Параллельно (10 рабочих) | 800-1200 | 80 мс | | Пакет (50 TX/RPC) | 3000+ | 200 мс |


###Критические проверки 1.Загрузка узла

  watch -n 1 'curl -s http://localhost:9000/metrics | grep "rpc_queue"'

2.Обработка ошибок

  if errors.Is(err, sui.ErrTxQueueFull) {
      time.Sleep(100 * time.Millisecond)
      retry(tx)
  }

Для максимальной производительности: sui.NewClient(grpcDialOpts)- ИспользуйтеgRPCвместо JSON-RPC ()

  • Включитесжатие:
 dialOpts := []grpc.DialOption{
     grpc.WithDefaultCallOptions(grpc.UseCompressor("gzip")),
 }
3
Комментарии
.
shamueely.
Jul 26 2025, 17:53

Да, если вы наблюдаете низкую пропускную способность при использовании RequestType: "WaitForEffectsCert"приемника Sui на базе Go, топоследовательная отправка транзакций — это ваше основное препятствие. Чтобы значительно увеличить TPS (количество транзакций в секунду), вам абсолютно необходимоотправлять транзакции параллельно, а не дожидаться полного подтверждения каждой транзакции, прежде чем отправлять следующую.

Этот WaitForEffectsCertрежим предполагает ожидание выполнения транзакции и подтверждения ее результатов перед возвратом. Этобезопасно, но медленнодля высокопроизводительных приложений, таких как краны, NFT-монеты или боты DeFi. Когда вы ждете эффектов один за другим, вы ограничиваете пропускную способность до конца транзакции, которое может составлять 1—2 секунды.

Вот как можно ускорить процесс:

✅ Лучшие практики повышения пропускной способности

*Пакетируйте и распараллеливайте транзакциис помощью Goroutines.

  • Используйте тип запроса**«None» или «waitForLocalExecution"**, если вы допускаете небольшие задержки при проверке эффекта.
  • Ограничьте параллелизм, чтобы избежать превышения ограничений по скорости RPC (например, 20—50 параллельных TX в зависимости от узла).
  • Заблаговременно готовьте транзакции к использованиюTransactionBlockBuilder, подписывайте их и проводите параллельно.

Пример паттерна в Go (концептуальный) :

for i := 0; i < txCount; i++ {
    go func(i int) {
        tx := BuildTx(i) // your custom tx builder
        resp, err := suiClient.ExecuteTransaction(tx, "WaitForLocalExecution")
        if err != nil {
            log.Println("TX error:", err)
        } else {
            log.Println("TX confirmed:", resp.Digest)
        }
    }(i)
}

⚠️ Примечания:

  • «WaitForLocalExecution» работает намного быстрее и все же вселяет уверенность в том, что узел уже видел TX.
  • При создании бота производственного уровня контролируйте мемпул и распространение блоков.
  • Используйтегорячий кошелек с высоким балансом газаили чередуйте несколько газопластов, чтобы уменьшить количество столкновений.

Подробнее о вариантах исполнения транзакций: https://docs.sui.io/build/transaction-types

2
Комментарии
.
290697tz.
Jul 27 2025, 06:48

Да, параллельная отправка транзакций может значительно повысить пропускную способность. Последовательное использование waitForEffectScert для каждой транзакции замедлит вашу работу. Вместо этого пакетируйте транзакции и обрабатывайте ответы асинхронно. Кроме того, используйте waitForLocalExecution только в случае необходимости. Оптимизируйте, повторно используя соединения и настраивая параметры параллелизма в SDK.

2
Комментарии
.
SuiLover.
Jul 27 2025, 07:08

Если у отправителя транзакций Sui на базе Go наблюдается низкий уровень TPS, проблема, скорее всего, связана с последовательной отправкой транзакций с помощью requestType: «waitforEffectScert». Этот тип запроса ожидает полной обработки, прежде чем продолжить обработку, что не позволяет оптимизировать пропускную способность каждого запроса по отдельности. Для повышения производительности следует внедрить параллельную или пакетную отправку транзакций.

Параллелизация позволяет выполнять несколько транзакций одновременно, эффективно используя возможность Sui обрабатывать транзакции одновременно, особенно когда транзакции касаются непересекающихся объектов. Следует внедрить пул сотрудников или подпрограммы для одновременной отправки транзакций. Убедитесь, что вы правильно управляете примечаниями (порядковыми номерами) или ссылками на объекты, чтобы не создавать конфликтов при владении объектами.

При отправке параллельных транзакций избегайте перекрытия входных объектов, если логика контракта не предусматривает совместного доступа (например, со ссылками &mut). Помните о потенциальной конкуренции между объектами и следите за тем, чтобы ваш код корректно обрабатывал повторы и временные ошибки. Дальнейшую оптимизацию можно проводить, настраивая уровень параллелизма, начиная с малого (например, 10 программ) и увеличивая масштаб в зависимости от результатов.

Кроме того, вы можете использовать waitForLocalExecution вместо waitForEffectScert, если вы хотите немного ускорить подтверждение, но при этом допускаете неокончательные результаты. Однако для конфиденциальных обновлений состояния или балансов, доступных пользователям, WaitforEffectScert безопаснее. Вы также можете предварительно подписывать транзакции и отправлять их пакетами, чтобы минимизировать задержку между каждым запросом.

Убедитесь, что ваш узел Sui или конечная точка RPC могут обрабатывать большие объемы запросов. Рассмотрите возможность использования поставщика RPC с балансировкой нагрузки или высокопроизводительным поставщиком RPC. Профилируйте свой клиент Go, чтобы узнать, способствуют ли задержкам накладные расходы на HTTP или сериализацию. Используйте асинхронные HTTP-клиенты, такие как fasthttp или постоянные соединения gRPC, если они доступны в SDK.

Наконец, регистрируйте и анализируйте неудачные транзакции для выявления узких мест или моделей конкуренции. При правильном параллелизме и правильном распределении объектов ввода вы сможете значительно улучшить TPS.

1
Комментарии
.
lucid-obsidian.
Aug 11 2025, 06:57

Если у отправителя транзакций Sui на базе Go наблюдается низкий уровень TPS, проблема, скорее всего, связана с последовательной отправкой транзакций с помощью requestType: «waitforEffectScert». Этот тип запроса ожидает полной обработки, прежде чем продолжить обработку, что не позволяет оптимизировать пропускную способность каждого запроса по отдельности. Для повышения производительности следует внедрить параллельную или пакетную отправку транзакций.

1
Комментарии
.

Знаете ответ?

Пожалуйста, войдите в систему и поделитесь им.