Skip to content

Commit 90d81c8

Browse files
Exca-DKgregnazario
authored andcommitted
Refactor transaction builder: streamline sequence number management
1 parent 35d6c94 commit 90d81c8

File tree

2 files changed

+9
-30
lines changed

2 files changed

+9
-30
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ adheres to the format set out by [Keep a Changelog](https://keepachangelog.com/e
55

66
# Unreleased
77

8+
- [`Refactor`] Remove unnecessary atomic swap in submit transactions
9+
810
# v1.6.0 (3/24/2025)
911

1012
- [`Feature`] Add the ability for ABI simple type conversion of entry function arguments with both remote and local ABI

transactionSubmission.go

+7-30
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"errors"
55
"fmt"
66
"sync"
7-
"sync/atomic"
87

98
"github.com/aptos-labs/aptos-go-sdk/api"
109
)
@@ -51,25 +50,6 @@ type WorkerPoolConfig struct {
5150
SubmissionBuffer uint32
5251
}
5352

54-
type SequenceNumberTracker struct {
55-
SequenceNumber atomic.Uint64
56-
}
57-
58-
func (snt *SequenceNumberTracker) Increment() uint64 {
59-
for {
60-
seqNumber := snt.SequenceNumber.Load()
61-
next := seqNumber + 1
62-
ok := snt.SequenceNumber.CompareAndSwap(seqNumber, next)
63-
if ok {
64-
return seqNumber
65-
}
66-
}
67-
}
68-
69-
func (snt *SequenceNumberTracker) Update(next uint64) uint64 {
70-
return snt.SequenceNumber.Swap(next)
71-
}
72-
7353
// BuildTransactions start a goroutine to process [TransactionPayload] and spit out [RawTransactionImpl].
7454
func (client *Client) BuildTransactions(sender AccountAddress, payloads chan TransactionBuildPayload, responses chan TransactionBuildResponse, setSequenceNumber chan uint64, options ...any) {
7555
client.nodeClient.BuildTransactions(sender, payloads, responses, setSequenceNumber, options...)
@@ -78,20 +58,18 @@ func (client *Client) BuildTransactions(sender AccountAddress, payloads chan Tra
7858
// BuildTransactions start a goroutine to process [TransactionPayload] and spit out [RawTransactionImpl].
7959
func (rc *NodeClient) BuildTransactions(sender AccountAddress, payloads chan TransactionBuildPayload, responses chan TransactionBuildResponse, setSequenceNumber chan uint64, options ...any) {
8060
// Initialize state
61+
defer close(responses)
8162
account, err := rc.Account(sender)
8263
if err != nil {
8364
responses <- TransactionBuildResponse{Err: err}
84-
close(responses)
8565
return
8666
}
8767
sequenceNumber, err := account.SequenceNumber()
8868
if err != nil {
8969
responses <- TransactionBuildResponse{Err: err}
90-
close(responses)
9170
return
9271
}
93-
snt := &SequenceNumberTracker{}
94-
snt.SequenceNumber.Store(sequenceNumber)
72+
snt := sequenceNumber
9573
optionsLast := len(options)
9674
options = append(options, SequenceNumber(0))
9775

@@ -100,22 +78,21 @@ func (rc *NodeClient) BuildTransactions(sender AccountAddress, payloads chan Tra
10078
case payload, ok := <-payloads:
10179
// End if it's not closed
10280
if !ok {
103-
close(responses)
10481
return
10582
}
10683
switch payload.Type {
10784
case TransactionSubmissionTypeSingle:
108-
curSequenceNumber := snt.Increment()
109-
options[optionsLast] = SequenceNumber(curSequenceNumber)
85+
options[optionsLast] = SequenceNumber(snt)
86+
snt++
11087
txnResponse, err := rc.BuildTransaction(sender, payload.Inner, options...)
11188
if err != nil {
11289
responses <- TransactionBuildResponse{Err: err}
11390
} else {
11491
responses <- TransactionBuildResponse{Response: txnResponse}
11592
}
11693
case TransactionSubmissionTypeMultiAgent:
117-
curSequenceNumber := snt.Increment()
118-
options[optionsLast] = SequenceNumber(curSequenceNumber)
94+
options[optionsLast] = SequenceNumber(snt)
95+
snt++
11996
txnResponse, err := rc.BuildTransactionMultiAgent(sender, payload.Inner, options...)
12097
if err != nil {
12198
responses <- TransactionBuildResponse{Err: err}
@@ -127,7 +104,7 @@ func (rc *NodeClient) BuildTransactions(sender AccountAddress, payloads chan Tra
127104
}
128105
case newSequenceNumber := <-setSequenceNumber:
129106
// This can be used to update the sequence number at anytime
130-
snt.Update(newSequenceNumber)
107+
snt = newSequenceNumber
131108
// TODO: We should periodically handle reconciliation of the sequence numbers, but this needs to know submission as well
132109
}
133110
}

0 commit comments

Comments
 (0)