帖子
分享您的知识。
我需要发送并行收款吗?,
伙计们我有一个 go 语言的 sui 接收器,但是 tps 很低,我怎样才能让它更快,我需要发送并行 txs 吗?, requestType: “waitforEffectsCert”,一个接一个的速度真的很慢
- Sui
答案
10是的,并行发送交易可以显著提高您的吞吐量. 按顺序对每笔交易使用 WaitforEffectSert 会减慢你的速度. 取而代之的是,对您的交易进行批处理并异步处理响应. 另外,考虑仅在必要时使用 WaitforLocalExecution. 通过重复使用连接和调整 SDK 的并发设置进行优化.
是的,使用并行 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()
关键优化:
- 并行 TX:使用 goroutine(避开速率限制).
- 批量请求:尽可能组合 TX.
3.WaitForLocalExecution``WaitForEffectsCert
更快的确认:优先于.
是的,如果您遇到每秒交易量 (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. 高效使用 TransactionBlock
API
*交易区块:与其发送单笔交易,不如将多个操作分组为一个交易区块. 这减少了单独发送每笔交易的开销,并可以加快处理速度.
*批量提交: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 接收器的吞吐量和性能,使其��适合实时用例.
是的,并行交易将提高您的TPS. Sui 的设计因并行执行而蓬勃发展. 以下是优化的方法:
###快速修复:
- 并行发送 Tx — 使用 goroutine 对交易进行批处理(Sui 并行处理它们).
- 跳过
WaitForEffectsCert
— 对于非依赖性 TX,请使用:
RequestType: "ImmediateReturn" // Faster, but check status later
3.ProgrammableTransactionBlock
Batch PTBs— 将操作合而为一.
主要收益:
✔**没有冲突吗?→ 自由并行化(Sui 自动处理对象锁定).
✔依赖的 TX?**分组 PTB 或仅对关键步骤进行排序.
示例流程:
// Launch 100 TXs concurrently
for i := 0; i < 100; i++ {
go submitTx(txData[i])
}
注意:
-高并发下气体峰值.
-订单依赖关系(如果 TX 共享对象,则使用 PTB).
是的,发送并行交易以提高 TPS. WaitForEffectsCert
之所以缓慢,是因为它要逐一等待共识. 使用具有唯一发送者对象或时间戳的并行执行来避免冲突. Sui 处理并行化——只要确保独立事务和正确批处理即可.
###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 |
###关键检查
- 节点加载
watch -n 1 'curl -s http://localhost:9000/metrics | grep "rpc_queue"'
- 错误处理
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")),
}
是的,如果您在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
是的,并行发送交易可以显著提高您的吞吐量. 按顺序对每笔交易使用 WaitforEffectSert 会减慢你的速度. 取而代之的是,对您的交易进行批处理并异步处理响应. 另外,考虑仅在必要时使用 WaitforLocalExecution. 通过重复使用连接和调整 SDK 的并发设置进行优化.
如果你在基于 Go 的 Sui 交易发送者中遇到了低的 TPS,那么瓶颈可能是由于使用 requestType: “WaitforEffectsCert” 按顺序发送交易造成的. 此请求类型等待完全确定后再继续,一次完成一个请求并未针对吞吐量进行优化. 为了提高性能,你应该实现并行或批量交易发送.
并行化允许同时进行多笔交易,从而有效地利用了 Sui 同时处理交易的能力,尤其是在交易触及不相交的对象时. 您应该实现一个或多个 goroutine 来同时提交事务. 确保正确管理随机数(序列号)或对象引用,以免造成对象所有权冲突.
发送并行交易时,除非合约逻辑允许共享访问(例如,使用 &mut 引用),否则应避免重叠的输入对象. 注意潜在的对象争用,并确保您的代码能够正常处理重试和暂时性错误. 您可以通过调整并发级别来进一步优化,即从小规模开始(例如 10 个 goroutine),然后根据结果向上扩展.
另外,如果你想稍微加快确认速度但又能容忍非最终结果,你可以考虑使用 WaitforLocalExecution 而不是 WaitforEffectSCert. 但是,对于敏感状态更新或面向用户的余额,WaitforEffectsCert更安全. 您还可以对交易进行预签名并批量发送,以最大限度地减少每个请求之间的延迟.
确保您的 Sui 节点或 RPC 端点能够处理高请求量——考虑使用负载平衡或高性能 RPC 提供商. 分析您的 Go 客户端,查看 HTTP 或序列化开销是否导致延迟. 使用异步 HTTP 客户端,如 fasthttp 或持久 gRPC 连接(如果软件开发工具包中可用).
最后,记录和分析失败的交易,以检测瓶颈或争用模式. 通过适当的并行度和分布良好的输入对象,您应该能够显著提高 TPS.
如果你在基于 Go 的 Sui 交易发送者中遇到了低的 TPS,那么瓶颈可能是由于使用 requestType: “WaitforEffectsCert” 按顺序发送交易造成的. 此请求类型等待完全确定后再继续,一次完成一个请求并未针对吞吐量进行优化. 为了提高性能,你应该实现并行或批量交易发送.
你知道答案吗?
请登录并分享。
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.