Skip to content

Commit 01dbe17

Browse files
authored
fix(crypto, state): resolve panic on 32-bit OSes (#1604)
1 parent 3bd1088 commit 01dbe17

File tree

5 files changed

+41
-45
lines changed

5 files changed

+41
-45
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ require (
1919
github.com/hashicorp/golang-lru/v2 v2.0.7
2020
github.com/inancgumus/screen v0.0.0-20190314163918-06e984b86ed3
2121
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213
22-
github.com/kilic/bls12-381 v0.1.0
22+
github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69
2323
github.com/libp2p/go-libp2p v0.37.0
2424
github.com/libp2p/go-libp2p-kad-dht v0.28.1
2525
github.com/libp2p/go-libp2p-pubsub v0.12.0

go.sum

+2-6
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7
3030
github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI=
3131
github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY=
3232
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
33-
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
3433
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
3534
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
3635
github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM=
@@ -114,7 +113,6 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4
114113
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
115114
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
116115
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
117-
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
118116
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
119117
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
120118
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
@@ -226,7 +224,6 @@ github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ
226224
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
227225
github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
228226
github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
229-
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
230227
github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
231228
github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
232229
github.com/ipfs/go-test v0.0.4 h1:DKT66T6GBB6PsDFLoO56QZPrOmzJkqU1FZH5C9ySkew=
@@ -247,8 +244,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7
247244
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
248245
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg=
249246
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
250-
github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4=
251-
github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig=
247+
github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69 h1:kMJlf8z8wUcpyI+FQJIdGjAhfTww1y0AbQEv86bpVQI=
248+
github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69/go.mod h1:tlkavyke+Ac7h8R3gZIjI5LKBcvMlSWnXNMgT3vZXo8=
252249
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
253250
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
254251
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -704,7 +701,6 @@ golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7w
704701
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
705702
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
706703
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
707-
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
708704
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
709705
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
710706
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

state/state.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ func (st *state) loadMerkels() {
184184
panic(fmt.Sprintf(
185185
"Account number is out of range: %v >= %v", acc.Number(), totalAccount))
186186
}
187-
st.accountMerkle.SetHash(int(acc.Number()), acc.Hash())
187+
st.accountMerkle.SetHash(acc.Number(), acc.Hash())
188188

189189
return false
190190
})
@@ -196,7 +196,7 @@ func (st *state) loadMerkels() {
196196
panic(fmt.Sprintf(
197197
"Validator number is out of range: %v >= %v", val.Number(), totalValidator))
198198
}
199-
st.validatorMerkle.SetHash(int(val.Number()), val.Hash())
199+
st.validatorMerkle.SetHash(val.Number(), val.Hash())
200200

201201
return false
202202
})
@@ -529,14 +529,14 @@ func (st *state) commitSandbox(sbx sandbox.Sandbox, round int16) {
529529
sbx.IterateAccounts(func(addr crypto.Address, acc *account.Account, updated bool) {
530530
if updated {
531531
st.store.UpdateAccount(addr, acc)
532-
st.accountMerkle.SetHash(int(acc.Number()), acc.Hash())
532+
st.accountMerkle.SetHash(acc.Number(), acc.Hash())
533533
}
534534
})
535535

536536
sbx.IterateValidators(func(val *validator.Validator, updated bool, _ bool) {
537537
if updated {
538538
st.store.UpdateValidator(val)
539-
st.validatorMerkle.SetHash(int(val.Number()), val.Hash())
539+
st.validatorMerkle.SetHash(val.Number(), val.Hash())
540540
}
541541
})
542542

util/persistentmerkle/merkle.go

+19-19
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import (
77
)
88

99
type Tree struct {
10-
nodes map[int]*node
11-
maxWidth int
12-
maxHeight int
10+
nodes map[uint32]*node
11+
maxWidth int32
12+
maxHeight int32
1313
}
1414

1515
type node struct {
16-
width int
17-
height int
16+
width int32
17+
height int32
1818
hash *hash.Hash
1919
}
2020

@@ -24,30 +24,30 @@ type node struct {
2424
// +-+---+
2525
// h: height
2626
// w: width
27-
func nodeID(width, height int) int {
28-
return ((height & 0xff) << 24) | (width & 0xffffff)
27+
func nodeID(width, height int32) uint32 {
28+
return (uint32(height&0xff) << 24) | uint32(width&0xffffff)
2929
}
3030

3131
func New() *Tree {
3232
return &Tree{
33-
nodes: make(map[int]*node),
33+
nodes: make(map[uint32]*node),
3434
}
3535
}
3636

37-
func (*Tree) createNode(width, height int) *node {
37+
func (*Tree) createNode(width, height int32) *node {
3838
return &node{
3939
width: width,
4040
height: height,
4141
}
4242
}
4343

44-
func (t *Tree) getNode(width, height int) *node {
44+
func (t *Tree) getNode(width, height int32) *node {
4545
id := nodeID(width, height)
4646

4747
return t.nodes[id]
4848
}
4949

50-
func (t *Tree) getOrCreateNode(width, height int) *node {
50+
func (t *Tree) getOrCreateNode(width, height int32) *node {
5151
id := nodeID(width, height)
5252
node, ok := t.nodes[id]
5353
if !ok {
@@ -58,36 +58,36 @@ func (t *Tree) getOrCreateNode(width, height int) *node {
5858
return node
5959
}
6060

61-
func (t *Tree) invalidateNode(width, height int) {
61+
func (t *Tree) invalidateNode(width, height int32) {
6262
n := t.getOrCreateNode(width, height)
6363
n.hash = nil
6464
}
6565

66-
func (t *Tree) recalculateHeight(maxWidth int) {
66+
func (t *Tree) recalculateHeight(maxWidth int32) {
6767
if maxWidth > t.maxWidth {
6868
t.maxWidth = maxWidth
6969

7070
maxHeight := math.Log2(float64(maxWidth))
7171
if math.Remainder(maxHeight, 1.0) != 0 {
72-
t.maxHeight = int(math.Trunc(maxHeight)) + 2
72+
t.maxHeight = int32(math.Trunc(maxHeight)) + 2
7373
} else {
74-
t.maxHeight = int(math.Trunc(maxHeight)) + 1
74+
t.maxHeight = int32(math.Trunc(maxHeight)) + 1
7575
}
7676
}
7777
}
7878

79-
func (t *Tree) SetData(leaf int, data []byte) {
79+
func (t *Tree) SetData(leaf int32, data []byte) {
8080
t.SetHash(leaf, hash.CalcHash(data))
8181
}
8282

83-
func (t *Tree) SetHash(leaf int, h hash.Hash) {
83+
func (t *Tree) SetHash(leaf int32, h hash.Hash) {
8484
t.recalculateHeight(leaf + 1)
8585

8686
node := t.getOrCreateNode(leaf, 0)
8787
node.hash = &h
8888

8989
w := leaf / 2
90-
for h := 1; h < t.maxHeight; h++ {
90+
for h := int32(1); h < t.maxHeight; h++ {
9191
t.invalidateNode(w, h)
9292
w /= 2
9393
}
@@ -97,7 +97,7 @@ func (t *Tree) Root() hash.Hash {
9797
return t.nodeHash(0, t.maxHeight-1)
9898
}
9999

100-
func (t *Tree) nodeHash(width, height int) hash.Hash {
100+
func (t *Tree) nodeHash(width, height int32) hash.Hash {
101101
node := t.getNode(width, height)
102102
if node == nil {
103103
node = t.getNode(width-1, height)

util/persistentmerkle/merkle_test.go

+15-15
Original file line numberDiff line numberDiff line change
@@ -8,38 +8,38 @@ import (
88
)
99

1010
func TestNodeID(t *testing.T) {
11-
assert.Equal(t, 0x00000000, nodeID(0, 0))
12-
assert.Equal(t, 0x01000000, nodeID(0, 1))
13-
assert.Equal(t, 0x00000001, nodeID(1, 0))
14-
assert.Equal(t, 0x01000001, nodeID(1, 1))
15-
assert.Equal(t, 0xffffffff, nodeID(0xffffff, 0xff))
16-
assert.Equal(t, 0x00ffffff, nodeID(0xffffff, 0x00))
17-
assert.Equal(t, 0x77ff00ff, nodeID(0xff00ff, 0x77))
11+
assert.Equal(t, uint32(0x00000000), nodeID(0, 0))
12+
assert.Equal(t, uint32(0x01000000), nodeID(0, 1))
13+
assert.Equal(t, uint32(0x00000001), nodeID(1, 0))
14+
assert.Equal(t, uint32(0x01000001), nodeID(1, 1))
15+
assert.Equal(t, uint32(0xffffffff), nodeID(0xffffff, 0xff))
16+
assert.Equal(t, uint32(0x00ffffff), nodeID(0xffffff, 0x00))
17+
assert.Equal(t, uint32(0x77ff00ff), nodeID(0xff00ff, 0x77))
1818
}
1919

2020
func TestCalculateHeight(t *testing.T) {
2121
tree := New()
2222

2323
tree.recalculateHeight(0)
24-
assert.Equal(t, 0, tree.maxHeight)
24+
assert.Equal(t, int32(0), tree.maxHeight)
2525

2626
tree.recalculateHeight(1)
27-
assert.Equal(t, 1, tree.maxHeight)
27+
assert.Equal(t, int32(1), tree.maxHeight)
2828

2929
tree.recalculateHeight(2)
30-
assert.Equal(t, 2, tree.maxHeight)
30+
assert.Equal(t, int32(2), tree.maxHeight)
3131

3232
tree.recalculateHeight(4)
33-
assert.Equal(t, 3, tree.maxHeight)
33+
assert.Equal(t, int32(3), tree.maxHeight)
3434

3535
tree.recalculateHeight(5)
36-
assert.Equal(t, 4, tree.maxHeight)
36+
assert.Equal(t, int32(4), tree.maxHeight)
3737

3838
tree.recalculateHeight(8)
39-
assert.Equal(t, 4, tree.maxHeight)
39+
assert.Equal(t, int32(4), tree.maxHeight)
4040

4141
tree.recalculateHeight(9)
42-
assert.Equal(t, 5, tree.maxHeight)
42+
assert.Equal(t, int32(5), tree.maxHeight)
4343
}
4444

4545
func TestMerkleTree(t *testing.T) {
@@ -79,7 +79,7 @@ func TestMerkleTree(t *testing.T) {
7979
}
8080

8181
for i, d := range data {
82-
tree.SetData(i, []byte(d))
82+
tree.SetData(int32(i), []byte(d))
8383
expected, _ := hex.DecodeString(roots[i])
8484
assert.Equal(t, expected, tree.Root().Bytes(), "Root %d not matched", i)
8585
}

0 commit comments

Comments
 (0)