@@ -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