Skip to content

Commit ccdeebe

Browse files
committed
CorrelationId fix
1 parent 729c751 commit ccdeebe

File tree

5 files changed

+244
-7
lines changed

5 files changed

+244
-7
lines changed

blockchain/messages/descriptors.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,16 @@ func (descriptor *BlockMessageDescriptor) IsBroadcasted() bool {
3737
return len(descriptor.TransactionHashes) > 0
3838
}
3939

40+
const BitMaskForTxHashCorrelationId = 0b11 // masks 2-bit field, 0 to 3 inclusive
41+
4042
func (descriptor *BlockMessageDescriptor) CorrelationId() []byte {
4143
if descriptor.IsBroadcasted() {
44+
45+
if len(descriptor.TransactionHashes) == 1 {
46+
txHash := descriptor.TransactionHashes[0]
47+
return []byte(strconv.Itoa(hexDigitToInt(txHash[len(txHash)-1])))
48+
}
49+
4250
var txIndex = -1
4351
for _, txHash := range descriptor.TransactionHashes {
4452
index := hexDigitToInt(txHash[len(txHash)-1])
@@ -64,15 +72,13 @@ func (descriptor *BlockMessageDescriptor) CorrelationId() []byte {
6472

6573
}
6674

67-
const BitMaskForTxHashCorrelationId = 0b11 // masks 2-bit field, 0 to 3 inclusive
68-
6975
func hexDigitToInt(c byte) int {
70-
switch {
71-
case c >= '0' && c < '4':
76+
switch c {
77+
case '0', '4', '8', 'c', 'C':
7278
return 0
73-
case c >= '4' && c < '8':
79+
case '1', '5', '9', 'd', 'D':
7480
return 1
75-
case (c >= 'a' && c < 'c') || (c >= 'A' && c < 'C'):
81+
case '2', '6', 'a', 'A', 'e', 'E':
7682
return 2
7783
default:
7884
// Invalid hex digit — handle as needed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package blockchain_messages
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestOneCorrId(t *testing.T) {
10+
t.Parallel()
11+
12+
descriptor := &BlockMessageDescriptor{
13+
TransactionHashes: []string{
14+
"0x1234567890123456789012345678901234567890123456789012345678901234",
15+
},
16+
}
17+
18+
assert.Equal(t, []byte("0"), descriptor.CorrelationId())
19+
20+
descriptor = &BlockMessageDescriptor{
21+
TransactionHashes: []string{
22+
"0x1234567890123456789012345678901234567890123456789012345678901235",
23+
},
24+
}
25+
26+
assert.Equal(t, []byte("1"), descriptor.CorrelationId())
27+
28+
descriptor = &BlockMessageDescriptor{
29+
TransactionHashes: []string{
30+
"0x1234567890123456789012345678901234567890123456789012345678901236",
31+
},
32+
}
33+
34+
assert.Equal(t, []byte("2"), descriptor.CorrelationId())
35+
36+
descriptor = &BlockMessageDescriptor{
37+
TransactionHashes: []string{
38+
"0x1234567890123456789012345678901234567890123456789012345678901237",
39+
},
40+
}
41+
42+
assert.Equal(t, []byte("3"), descriptor.CorrelationId())
43+
}
44+
45+
func TestManyCorrId(t *testing.T) {
46+
t.Parallel()
47+
48+
descriptor := &BlockMessageDescriptor{
49+
TransactionHashes: []string{
50+
"0x1234567890123456789012345678901234567890123456789012345678901234",
51+
"0x1234567890123456789012345678901234567890123456789012345678901238",
52+
"0x123456789012345678901234567890123456789012345678901234567890123c",
53+
},
54+
}
55+
56+
assert.Equal(t, []byte("0"), descriptor.CorrelationId())
57+
58+
descriptor = &BlockMessageDescriptor{
59+
TransactionHashes: []string{
60+
"0x1234567890123456789012345678901234567890123456789012345678901235",
61+
"0x1234567890123456789012345678901234567890123456789012345678901234",
62+
},
63+
}
64+
65+
assert.Nil(t, descriptor.CorrelationId())
66+
67+
descriptor = &BlockMessageDescriptor{
68+
TransactionHashes: []string{
69+
"0xb432db11c6c6460f6bbf951a71b3ea3df9e0e414c1a4616728795111a7518f30",
70+
"0x74d35692f26ae3b6f0d276091a73093205b31ed320f127d5ce4c6454a250d98c",
71+
"0x8140ba1c7ea8104437e7c576fc43cb05d75276dcff3d99eec83ba7c4784787a8",
72+
"0x74a96c3df0649f9e3de102da99f2e6cac350c1537e5643e6c20b5b8b57dbf73c",
73+
},
74+
}
75+
76+
assert.Equal(t, []byte("0"), descriptor.CorrelationId())
77+
78+
descriptor = &BlockMessageDescriptor{
79+
TransactionHashes: []string{
80+
"0xd051e1a031d589ad246518525b792518984301ca5e833bbf64719783b20cc662",
81+
"0xad4f25e8a958dfd99baabf1a2479dda2765ecb05feb17efe2996331dc3eb5f4a",
82+
},
83+
}
84+
85+
assert.Equal(t, []byte("2"), descriptor.CorrelationId())
86+
87+
descriptor = &BlockMessageDescriptor{
88+
TransactionHashes: []string{
89+
"0x1ed6796ba1bfae3e6c3ea00c077e3fb7e24522c6f7d332148ed248f15cd748f9",
90+
"0x9724e6f6835be2aad985bfe51a0b8498b20b49f71f1001394005913dc7a371a1",
91+
},
92+
}
93+
94+
assert.Equal(t, []byte("1"), descriptor.CorrelationId())
95+
96+
descriptor = &BlockMessageDescriptor{
97+
TransactionHashes: []string{
98+
"0x97026efd8249efac39bd45750b40baeb3a2def0357ceb1779797edf4802bd8be",
99+
"0xd7bebfb0968ad3f385dc2971ed9314bda30fa063a3969e14a5ca7a884bdd4402",
100+
},
101+
}
102+
103+
assert.Equal(t, []byte("2"), descriptor.CorrelationId())
104+
}

go.mod

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ go 1.21
44

55
require (
66
github.com/akamensky/base58 v0.0.0-20210829145138-ce8bf8802e8f
7+
github.com/stretchr/testify v1.11.1
78
google.golang.org/protobuf v1.35.2
89
)
910

10-
require github.com/google/go-cmp v0.5.9 // indirect
11+
require (
12+
github.com/davecgh/go-spew v1.1.1 // indirect
13+
github.com/google/go-cmp v0.5.9 // indirect
14+
github.com/pmezard/go-difflib v1.0.0 // indirect
15+
gopkg.in/yaml.v3 v3.0.1 // indirect
16+
)

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
github.com/akamensky/base58 v0.0.0-20210829145138-ce8bf8802e8f h1:z8MkSJCUyTmW5YQlxsMLBlwA7GmjxC7L4ooicxqnhz8=
22
github.com/akamensky/base58 v0.0.0-20210829145138-ce8bf8802e8f/go.mod h1:UdUwYgAXBiL+kLfcqxoQJYkHA/vl937/PbFhZM34aZs=
3+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
46
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
7+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
8+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
9+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
10+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
511
google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
612
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
13+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
14+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
15+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
16+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package solana_messages
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestOneCorrId(t *testing.T) {
10+
t.Parallel()
11+
12+
descriptor := &ExtendedBlockMessageDescriptor{
13+
Transactions: &Transactions{
14+
IndexRanges: []IndexRange{
15+
{0, 1},
16+
},
17+
},
18+
}
19+
20+
assert.Equal(t, []byte("0"), descriptor.CorrelationId())
21+
22+
descriptor = &ExtendedBlockMessageDescriptor{
23+
Transactions: &Transactions{
24+
IndexRanges: []IndexRange{
25+
{100, 104},
26+
},
27+
},
28+
}
29+
30+
assert.Equal(t, []byte("1"), descriptor.CorrelationId())
31+
32+
descriptor = &ExtendedBlockMessageDescriptor{
33+
Transactions: &Transactions{
34+
IndexRanges: []IndexRange{
35+
{1000, 1004},
36+
},
37+
},
38+
}
39+
40+
assert.Equal(t, []byte("3"), descriptor.CorrelationId())
41+
42+
descriptor = &ExtendedBlockMessageDescriptor{
43+
Transactions: &Transactions{
44+
IndexRanges: []IndexRange{
45+
{1028, 1029},
46+
},
47+
},
48+
}
49+
50+
assert.Equal(t, []byte("0"), descriptor.CorrelationId())
51+
52+
descriptor = &ExtendedBlockMessageDescriptor{
53+
Transactions: &Transactions{
54+
IndexRanges: []IndexRange{
55+
{1028, 1129},
56+
},
57+
},
58+
}
59+
60+
assert.Nil(t, descriptor.CorrelationId())
61+
62+
}
63+
64+
func TestManyCorrId(t *testing.T) {
65+
t.Parallel()
66+
67+
descriptor := &ExtendedBlockMessageDescriptor{
68+
Transactions: &Transactions{
69+
IndexRanges: []IndexRange{
70+
{0, 1},
71+
{10, 11},
72+
},
73+
},
74+
}
75+
76+
assert.Equal(t, []byte("0"), descriptor.CorrelationId())
77+
78+
descriptor = &ExtendedBlockMessageDescriptor{
79+
Transactions: &Transactions{
80+
IndexRanges: []IndexRange{
81+
{100, 104},
82+
{1024 + 100, 1024 + 104},
83+
},
84+
},
85+
}
86+
87+
assert.Equal(t, []byte("1"), descriptor.CorrelationId())
88+
89+
descriptor = &ExtendedBlockMessageDescriptor{
90+
Transactions: &Transactions{
91+
IndexRanges: []IndexRange{
92+
{100, 104},
93+
{1028, 1129},
94+
},
95+
},
96+
}
97+
98+
assert.Nil(t, descriptor.CorrelationId())
99+
100+
descriptor = &ExtendedBlockMessageDescriptor{
101+
Transactions: &Transactions{
102+
IndexRanges: []IndexRange{
103+
{100, 104},
104+
{1028, 1029},
105+
},
106+
},
107+
}
108+
109+
assert.Nil(t, descriptor.CorrelationId())
110+
111+
}

0 commit comments

Comments
 (0)