Skip to content

Commit f95e41b

Browse files
committed
Correctly handle quorum data reconstruction for epochs prior to 151.
1 parent e2b206e commit f95e41b

1 file changed

Lines changed: 43 additions & 16 deletions

File tree

validator/quorum/models.go

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ func ReconstructQuorumData(currentTickQuorumData, nextTickQuorumData *protobuff.
113113
QuorumDiffPerComputor: make(map[uint32]*protobuff.QuorumDiff),
114114
}
115115

116+
epoch := currentTickQuorumData.QuorumTickStructure.Epoch
117+
116118
spectrumDigest, err := hex.DecodeString(nextTickQuorumData.QuorumTickStructure.PrevSpectrumDigestHex)
117119
if err != nil {
118120
return nil, errors.Wrap(err, "obtaining spectrum digest from next tick quorum data")
@@ -126,17 +128,15 @@ func ReconstructQuorumData(currentTickQuorumData, nextTickQuorumData *protobuff.
126128
return nil, errors.Wrap(err, "obtaining computer digest from next tick quorum data")
127129
}
128130

129-
resourceDigestValue, err := convertHexToUint32(nextTickQuorumData.QuorumTickStructure.PrevResourceTestingDigestHex)
131+
resourceDigest, err := hex.DecodeString(nextTickQuorumData.QuorumTickStructure.PrevResourceTestingDigestHex)
130132
if err != nil {
131133
return nil, errors.Wrap(err, "obtaining resource testing digest from next tick quorum data")
132134
}
133-
resourceDigest := convertUint32ToBytes(resourceDigestValue)
134135

135-
transactionBodyDigestValue, err := convertHexToUint32(nextTickQuorumData.QuorumTickStructure.PrevTransactionBodyHex)
136+
transactionBodyDigest, err := hex.DecodeString(nextTickQuorumData.QuorumTickStructure.PrevTransactionBodyHex)
136137
if err != nil {
137138
return nil, errors.Wrap(err, "obtaining transaction body digest from the next tick quorum data")
138139
}
139-
transactionBodyDigest := convertUint32ToBytes(transactionBodyDigestValue)
140140

141141
for id, voteDiff := range currentTickQuorumData.QuorumDiffPerComputor {
142142

@@ -168,32 +168,59 @@ func ReconstructQuorumData(currentTickQuorumData, nextTickQuorumData *protobuff.
168168
return nil, errors.Wrap(err, "hashing salted computer digest")
169169
}
170170

171-
var tmp2 [36]byte
171+
newFormat := epoch >= 151
172172

173-
copy(tmp2[:32], computorPublicKey[:])
174-
copy(tmp2[32:], resourceDigest[:])
175-
saltedResourceTestingDigest, err := utils.K12Hash(tmp2[:])
176-
if err != nil {
177-
return nil, errors.Wrap(err, "hashing salted resource testing digest")
173+
// Establish length of returned digest based on format
174+
digestSize := 8
175+
if newFormat {
176+
digestSize = 4
178177
}
179178

180-
copy(tmp2[:32], computorPublicKey[:])
181-
copy(tmp2[32:], transactionBodyDigest[:])
182-
saltedTransactionBodyDigest, err := utils.K12Hash(tmp2[:])
179+
// Create resource testing digest no matter what
180+
saltedResourceTestingDigestBytes, err := reconstructShortSaltedDigest(computorPublicKey[:], resourceDigest, newFormat)
183181
if err != nil {
184-
return nil, errors.Wrap(err, "hashing salted transaction body digest")
182+
return nil, errors.Wrap(err, "reconstructing salted resource testing digest")
183+
}
184+
saltedResourceTestingDigest := hex.EncodeToString(saltedResourceTestingDigestBytes[:digestSize])
185+
186+
// Declare transaction body digest no matter what and populate only if new data format
187+
var saltedTransactionBodyDigest string
188+
if newFormat {
189+
saltedTransactionBodyDigestBytes, err := reconstructShortSaltedDigest(computorPublicKey[:], transactionBodyDigest, true)
190+
if err != nil {
191+
return nil, errors.Wrap(err, "reconstructing salted transaction body digest")
192+
}
193+
saltedTransactionBodyDigest = hex.EncodeToString(saltedTransactionBodyDigestBytes[:digestSize])
185194
}
186195

187196
reconstructedQuorumData.QuorumDiffPerComputor[id] = &protobuff.QuorumDiff{
188-
SaltedResourceTestingDigestHex: hex.EncodeToString(saltedResourceTestingDigest[:4]),
197+
SaltedResourceTestingDigestHex: saltedResourceTestingDigest,
198+
SaltedTransactionBodyHex: saltedTransactionBodyDigest,
189199
SaltedSpectrumDigestHex: hex.EncodeToString(saltedSpectrumDigest[:]),
190200
SaltedUniverseDigestHex: hex.EncodeToString(saltedUniverseDigest[:]),
191201
SaltedComputerDigestHex: hex.EncodeToString(saltedComputerDigest[:]),
192202
ExpectedNextTickTxDigestHex: voteDiff.ExpectedNextTickTxDigestHex,
193203
SignatureHex: voteDiff.SignatureHex,
194-
SaltedTransactionBodyHex: hex.EncodeToString(saltedTransactionBodyDigest[:4]),
195204
}
196205
}
197206

198207
return &reconstructedQuorumData, nil
199208
}
209+
210+
func reconstructShortSaltedDigest(computorPubkey, prevDigest []byte, newFormat bool) ([32]byte, error) {
211+
212+
var buf [40]byte
213+
copy(buf[:32], computorPubkey)
214+
copy(buf[32:], prevDigest)
215+
216+
buf2 := buf[:]
217+
if newFormat {
218+
buf2 = buf2[:36]
219+
}
220+
221+
saltedDigest, err := utils.K12Hash(buf2)
222+
if err != nil {
223+
return [32]byte{}, errors.Wrap(err, "hashing salted digest")
224+
}
225+
return saltedDigest, nil
226+
}

0 commit comments

Comments
 (0)