@@ -24,7 +24,7 @@ type StatefulBlock struct {
2424 Prnt ids.ID `serialize:"true" json:"parent"`
2525 Tmstmp int64 `serialize:"true" json:"timestamp"`
2626 Hght uint64 `serialize:"true" json:"height"`
27- Difficulty uint64 `serialize:"true" json:"difficulty"`
27+ Difficulty uint64 `serialize:"true" json:"difficulty"` // difficulty per unit
2828 Cost uint64 `serialize:"true" json:"cost"`
2929 Txs []* Transaction `serialize:"true" json:"txs"`
3030}
@@ -59,7 +59,6 @@ func NewBlock(vm VM, parent snowman.Block, tmstp int64, context *Context) *State
5959 }
6060}
6161
62- // TODO: check work here? Seems like a DoS vuln?
6362func ParseBlock (
6463 source []byte ,
6564 status choices.Status ,
@@ -159,20 +158,18 @@ func (b *StatelessBlock) verify() (*StatelessBlock, *versiondb.Database, error)
159158 }
160159
161160 // Process new transactions
162- log .Debug ("build context" , "next difficulty" , context . NextDifficulty , "next cost" , context . NextCost )
163- var surplusDifficulty uint64
161+ log .Debug ("build context" , "height" , b . Hght , " difficulty" , b . Difficulty , "cost" , b . Cost )
162+ surplusWork := uint64 ( 0 )
164163 for _ , tx := range b .Txs {
165164 if err := tx .Execute (onAcceptDB , b .Tmstmp , context ); err != nil {
166- log .Debug ("failed tx verification" , "err" , err )
167165 return nil , nil , err
168166 }
169- surplusDifficulty += tx .Difficulty () - context . NextDifficulty
167+ surplusWork += ( tx .Difficulty () - b . Difficulty ) * tx . Units ()
170168 }
171169 // Ensure enough work is performed to compensate for block production speed
172170 requiredSurplus := b .Difficulty * b .Cost
173- if surplusDifficulty < requiredSurplus {
174- log .Debug ("insufficient block surplus" , "found" , surplusDifficulty , "required" , requiredSurplus )
175- return nil , nil , ErrInsufficientSurplus
171+ if surplusWork < requiredSurplus {
172+ return nil , nil , fmt .Errorf ("%w: required=%d found=%d" , ErrInsufficientSurplus , requiredSurplus , surplusWork )
176173 }
177174 return parent , onAcceptDB , nil
178175}
0 commit comments