core: return error from verifyOutputs()

Make debugging easier.
This commit is contained in:
Roman Khimov 2019-10-11 12:09:16 +03:00
parent ab4ff79e02
commit 96934cfeab

View file

@ -785,8 +785,8 @@ func (bc *Blockchain) Verify(t *transaction.Transaction) error {
if IsDoubleSpend(bc.Store, t) { if IsDoubleSpend(bc.Store, t) {
return errors.New("invalid transaction caused by double spending") return errors.New("invalid transaction caused by double spending")
} }
if ok := bc.verifyOutputs(t); !ok { if err := bc.verifyOutputs(t); err != nil {
return errors.New("invalid transaction's outputs") return errors.Wrap(err, "wrong outputs")
} }
if err := bc.verifyResults(t); err != nil { if err := bc.verifyResults(t); err != nil {
return err return err
@ -813,25 +813,25 @@ func (bc *Blockchain) verifyInputs(t *transaction.Transaction) bool {
return true return true
} }
func (bc *Blockchain) verifyOutputs(t *transaction.Transaction) bool { func (bc *Blockchain) verifyOutputs(t *transaction.Transaction) error {
for assetID, outputs := range t.GroupOutputByAssetID() { for assetID, outputs := range t.GroupOutputByAssetID() {
assetState := bc.GetAssetState(assetID) assetState := bc.GetAssetState(assetID)
if assetState == nil { if assetState == nil {
return false return fmt.Errorf("no asset state for %s", assetID.ReverseString())
} }
if assetState.Expiration < bc.blockHeight+1 && assetState.AssetType != transaction.GoverningToken && assetState.AssetType != transaction.UtilityToken { if assetState.Expiration < bc.blockHeight+1 && assetState.AssetType != transaction.GoverningToken && assetState.AssetType != transaction.UtilityToken {
return false return fmt.Errorf("asset %s expired", assetID.ReverseString())
} }
for _, out := range outputs { for _, out := range outputs {
if int64(out.Amount)%int64(math.Pow10(8-int(assetState.Precision))) != 0 { if int64(out.Amount)%int64(math.Pow10(8-int(assetState.Precision))) != 0 {
return false return fmt.Errorf("output is not compliant with %s asset precision", assetID.ReverseString())
} }
} }
} }
return true return nil
} }
func (bc *Blockchain) verifyResults(t *transaction.Transaction) error { func (bc *Blockchain) verifyResults(t *transaction.Transaction) error {