Sui.

帖子

分享您的知识。

HaGiang.
Jul 26, 2025
专家问答

我需要发送并行收款吗?,

伙计们我有一个 go 语言的 sui 接收器,但是 tps 很低,我怎样才能让它更快,我需要发送并行 txs 吗?, requestType: “waitforEffectsCert”,一个接一个的速度真的很慢

  • Sui
0
10
分享
评论
.

答案

10
0xduckmove.
Jul 27 2025, 11:29

是的,并行发送交易可以显著提高您的吞吐量. 按顺序对每笔交易使用 WaitforEffectSert 会减慢你的速度. 取而代之的是,对您的交易进行批处理并异步处理响应. 另外,考虑仅在必要时使用 WaitforLocalExecution. 通过重复使用连接和调整 SDK 的并发设置进行优化.

2
最佳答案
评论
.
Arnold.
Arnold3036
Jul 29 2025, 14:57

是的,使用并行 TxS来提高 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:使用 goroutine(避开速率限制).
  2. 批量请求:尽可能组合 TX.
    3.WaitForLocalExecution``WaitForEffectsCert更快的确认:优先于.
5
评论
.
Paul.
Paul4340
Jul 31 2025, 12:17

是的,如果您遇到每秒交易量 (TPS)缓慢的情况,并且 Go 中的Sui 接收器在按顺序处理交易时出现延迟,则发送并行交易可以显著提高吞吐量. **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. 高效使用 TransactionBlockAPI

*交易区块:与其发送单笔交易,不如将多个操作分组为一个交易区块. 这减少了单独发送每笔交易的开销,并可以加快处理速度. *批量提交:Sui 的 API 允许您在一次交易中发送多个操作,这可以显著提高吞吐量. 将操作组织成更大的交易可以减少WaitForEffectsCert所需的呼叫次数.

4. 监控和调整 Sui 客户端配置

  • 如果您使用Sui RPC 客户端发送交易,请检查客户端配置(例如批量大小或请求超时)是否针对高吞吐量进行了优化. *批量大小:调整提交多笔交易的批量大小有助于减少开销. *超时和重试:确保您的客户端设置为可以有效地处理超时和重试. 网络问题或服务器负载可能会导致延迟,因此优化超时和重试策略有助于缩短响应时间.

5. 负载平衡和分片

  • 如果您要处理大量交易,请考虑使用负载平衡分片您的请求. 将您的交易拆分到多个节点或客户端上,以避免单个连接造成的瓶颈.
  • 这可以通过将不同的交易集分配给不同的Sui 验证器RPC 端点来实现,从而确保对多个资源进行并行处理.

6. 查看交易依赖关系

  • 如果交易相互依赖(例如,如果一笔交易必须先于另一笔交易发生),则需要按顺序等待每笔交易的效果. 但是,如果交易是独立的,则可以并行发送它们并独立等待生效.
  • 如果可能,重组事务以减少相互依存关系,从而实现更大的并行化.

7. 优化 RPC 请求

*连接池:如果您要发出多个 RPC 请求,请确保重复使用永久连接,以避免为每个请求建立新连接的开销. *请求批处理:如果 Sui RPC 支持,请考虑将多个请求批处理为一个,以减少多次往返网络调用的开销.

8. 考虑节点性能

*验证器负载:如果您要向单个 Sui 验证器节点发送交易,请确保该节点能够处理高 TPS. 为了获得更好的性能,您可能需要扩展基础设施或将请求分配给多个验证器.


总结一下:

*并行交易:在 Go 中使用goroutines来同时发送和等待交易,从而减少延迟. *批量交易:将多个操作分组为一项事务以减少开销. *优化 WaitForEffectsCert:同时处理多个WaitForEffectsCert呼叫以提高吞吐量. *客户端配置:检查超时和批量大小等客户端设置,以确保最佳性能. *基础设施扩展:如有必要,将负载分配给多个 Sui 验证器或节点以提高 TPS.

通过应用这些策略,您应该能够显著提高 Sui 接收器的吞吐量和性能,使其��适合实时用例.

5
评论
.
Evgeniy CRYPTOCOIN.
Jul 30 2025, 08:52

是的,并行交易将提高您的TPS. Sui 的设计因并行执行而蓬勃发展. 以下是优化的方法:

###快速修复:

  1. 并行发送 Tx — 使用 goroutine 对交易进行批处理(Sui 并行处理它们).
  2. 跳过 WaitForEffectsCert— 对于非依赖性 TX,请使用:
  RequestType: "ImmediateReturn" // Faster, but check status later  

3.ProgrammableTransactionBlockBatch PTBs— 将操作合而为一.

主要收益: ✔**没有冲突吗?→ 自由并行化(Sui 自动处理对象锁定).
依赖的 TX?**分组 PTB 或仅对关键步骤进行排序.

示例流程:

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

注意: -高并发下气体峰值.
-订单依赖关系(如果 TX 共享对象,则使用 PTB).

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. 特定于 Sui 的优化 ####气体对象管理

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

####批量交易生成

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 | 500ms+ | | 并行(10 个工作人员)| 800-1200 | 80ms | | 批处理 (50 TX/RPC) | 3000+ | 200ms |


###关键检查

  1. 节点加载
  watch -n 1 'curl -s http://localhost:9000/metrics | grep "rpc_queue"'
  1. 错误处理
  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"基于 Go 的 Sui 接收器中使用时发现吞吐量低,那么按顺序发送交易是您的主要瓶颈. 要显著提高您的 TPS(每秒交易),您绝对需要并行发送交易,而不是等待每笔交易完全确认后再发送下一笔交易.

WaitForEffectsCert模式会等到交易执行并验证其效果后再返回——这对于水龙头、NFT 铸币厂或 DeFi 机器人等高吞吐量应用程序来说是安全但缓慢的. 当你逐一等待效果时,会将吞吐量限制为每笔交易的往返时间,可能为 1—2 秒.

以下是加快速度的方法:

✅ 提高吞吐量的最佳实践

*使用 Goroutine 对事务进行批处理和并行化.

  • 如果您能容忍效果验证中的轻微延迟,请使用**“无” 或 “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

是的,并行发送交易可以显著提高您的吞吐量. 按顺序对每笔交易使用 WaitforEffectSert 会减慢你的速度. 取而代之的是,对您的交易进行批处理并异步处理响应. 另外,考虑仅在必要时使用 WaitforLocalExecution. 通过重复使用连接和调整 SDK 的并发设置进行优化.

2
评论
.
SuiLover.
Jul 27 2025, 07:08

如果你在基于 Go 的 Sui 交易发送者中遇到了低的 TPS,那么瓶颈可能是由于使用 requestType: “WaitforEffectsCert” 按顺序发送交易造成的. 此请求类型等待完全确定后再继续,一次完成一个请求并未针对吞吐量进行优化. 为了提高性能,你应该实现并行或批量交易发送.

并行化允许同时进行多笔交易,从而有效地利用了 Sui 同时处理交易的能力,尤其是在交易触及不相交的对象时. 您应该实现一个或多个 goroutine 来同时提交事务. 确保正确管理随机数(序列号)或对象引用,以免造成对象所有权冲突.

发送并行交易时,除非合约逻辑允许共享访问(例如,使用 &mut 引用),否则应避免重叠的输入对象. 注意潜在的对象争用,并确保您的代码能够正常处理重试和暂时性错误. 您可以通过调整并发级别来进一步优化,即从小规模开始(例如 10 个 goroutine),然后根据结果向上扩展.

另外,如果你想稍微加快确认速度但又能容忍非最终结果,你可以考虑使用 WaitforLocalExecution 而不是 WaitforEffectSCert. 但是,对于敏感状态更新或面向用户的余额,WaitforEffectsCert更安全. 您还可以对交易进行预签名并批量发送,以最大限度地减少每个请求之间的延迟.

确保您的 Sui 节点或 RPC 端点能够处理高请求量——考虑使用负载平衡或高性能 RPC 提供商. 分析您的 Go 客户端,查看 HTTP 或序列化开销是否导致延迟. 使用异步 HTTP 客户端,如 fasthttp 或持久 gRPC 连接(如果软件开发工具包中可用).

最后,记录和分析失败的交易,以检测瓶颈或争用模式. 通过适当的并行度和分布良好的输入对象,您应该能够显著提高 TPS.

1
评论
.
lucid-obsidian.
Aug 11 2025, 06:57

如果你在基于 Go 的 Sui 交易发送者中遇到了低的 TPS,那么瓶颈可能是由于使用 requestType: “WaitforEffectsCert” 按顺序发送交易造成的. 此请求类型等待完全确定后再继续,一次完成一个请求并未针对吞吐量进行优化. 为了提高性能,你应该实现并行或批量交易发送.

1
评论
.

你知道答案吗?

请登录并分享。