X-Git-Url: http://git.osdn.net/view?p=bytom%2Fvapor.git;a=blobdiff_plain;f=protocol%2Fstate%2Futxo_view.go;h=d10517835f4abdd2f3e9f7214ca3ec4e70f7b1c5;hp=f539112df53178a738d56f2a87be65c8e4a6b722;hb=7673e01ba118c9c021aff983f0fbe56ec125d9e3;hpb=db158dcf09436b003defd333f1a665e7e051d820 diff --git a/protocol/state/utxo_view.go b/protocol/state/utxo_view.go index f539112d..d1051783 100644 --- a/protocol/state/utxo_view.go +++ b/protocol/state/utxo_view.go @@ -1,10 +1,9 @@ package state import ( - "errors" - "github.com/vapor/consensus" "github.com/vapor/database/storage" + "github.com/vapor/errors" "github.com/vapor/protocol/bc" ) @@ -22,11 +21,22 @@ func NewUtxoViewpoint() *UtxoViewpoint { func (view *UtxoViewpoint) ApplyTransaction(block *bc.Block, tx *bc.Tx, statusFail bool) error { for _, prevout := range tx.SpentOutputIDs { - spentOutput, err := tx.Output(prevout) + assetID := bc.AssetID{} + entryOutput, err := tx.Entry(prevout) if err != nil { return err } - if statusFail && *spentOutput.Source.Value.AssetId != *consensus.BTMAssetID { + + switch output := entryOutput.(type) { + case *bc.IntraChainOutput: + assetID = *output.Source.Value.AssetId + case *bc.VoteOutput: + assetID = *output.Source.Value.AssetId + default: + return errors.Wrapf(bc.ErrEntryType, "entry %x has unexpected type %T", prevout.Bytes(), entryOutput) + } + + if statusFail && assetID != *consensus.BTMAssetID { continue } @@ -44,12 +54,23 @@ func (view *UtxoViewpoint) ApplyTransaction(block *bc.Block, tx *bc.Tx, statusFa } for _, id := range tx.TxHeader.ResultIds { - output, err := tx.Output(*id) + assetID := bc.AssetID{} + entryOutput, err := tx.Entry(*id) if err != nil { - // error due to it's a retirement, utxo doesn't care this output type so skip it continue } - if statusFail && *output.Source.Value.AssetId != *consensus.BTMAssetID { + + switch output := entryOutput.(type) { + case *bc.IntraChainOutput: + assetID = *output.Source.Value.AssetId + case *bc.VoteOutput: + assetID = *output.Source.Value.AssetId + default: + // due to it's a retirement, utxo doesn't care this output type so skip it + continue + } + + if statusFail && assetID != *consensus.BTMAssetID { continue } @@ -82,11 +103,22 @@ func (view *UtxoViewpoint) CanSpend(hash *bc.Hash) bool { func (view *UtxoViewpoint) DetachTransaction(tx *bc.Tx, statusFail bool) error { for _, prevout := range tx.SpentOutputIDs { - spentOutput, err := tx.Output(prevout) + assetID := bc.AssetID{} + entryOutput, err := tx.Entry(prevout) if err != nil { return err } - if statusFail && *spentOutput.Source.Value.AssetId != *consensus.BTMAssetID { + + switch output := entryOutput.(type) { + case *bc.IntraChainOutput: + assetID = *output.Source.Value.AssetId + case *bc.VoteOutput: + assetID = *output.Source.Value.AssetId + default: + return errors.Wrapf(bc.ErrEntryType, "entry %x has unexpected type %T", prevout.Bytes(), entryOutput) + } + + if statusFail && assetID != *consensus.BTMAssetID { continue } @@ -102,12 +134,23 @@ func (view *UtxoViewpoint) DetachTransaction(tx *bc.Tx, statusFail bool) error { } for _, id := range tx.TxHeader.ResultIds { - output, err := tx.Output(*id) + assetID := bc.AssetID{} + entryOutput, err := tx.Entry(*id) if err != nil { - // error due to it's a retirement, utxo doesn't care this output type so skip it continue } - if statusFail && *output.Source.Value.AssetId != *consensus.BTMAssetID { + + switch output := entryOutput.(type) { + case *bc.IntraChainOutput: + assetID = *output.Source.Value.AssetId + case *bc.VoteOutput: + assetID = *output.Source.Value.AssetId + default: + // due to it's a retirement, utxo doesn't care this output type so skip it + continue + } + + if statusFail && assetID != *consensus.BTMAssetID { continue }