-func (view *UtxoViewpoint) ApplyBlock(block *bc.Block, txStatus *bc.TransactionStatus) error {
- for i, tx := range block.Transactions {
- statusFail, err := txStatus.GetStatus(i)
- if err != nil {
- return err
- }
- if err := view.ApplyTransaction(block, tx, statusFail); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (view *UtxoViewpoint) CanSpend(hash *bc.Hash) bool {
- entry := view.Entries[*hash]
- return entry != nil && !entry.Spent
-}
-
-func (view *UtxoViewpoint) DetachTransaction(tx *bc.Tx, statusFail bool) error {
- for _, prevout := range tx.MainchainOutputIDs {
- // don't simply delete(view.Entries, prevout), because we need to delete from db in saveUtxoView()
- entry, ok := view.Entries[prevout]
- if ok && (entry.Type != storage.CrosschainUTXOType) {
- return errors.New("look up mainchainOutputID but find utxo not from mainchain")
- }
-
- if ok && !entry.Spent {
- return errors.New("try to revert an unspent utxo")
- }
-
- if !ok {
- view.Entries[prevout] = storage.NewUtxoEntry(storage.CrosschainUTXOType, 0, false)
- continue
- }
- entry.UnspendOutput()
- }
-