+ if err := view.detachSpendUtxo(tx, statusFail); err != nil {
+ return err
+ }
+
+ return view.detachOutputUtxo(tx, statusFail)
+}
+
+func (view *UtxoViewpoint) DetachBlock(block *bc.Block, txStatus *bc.TransactionStatus) error {
+ for i := len(block.Transactions) - 1; i >= 0; i-- {
+ statusFail, err := txStatus.GetStatus(i)
+ if err != nil {
+ return err
+ }
+
+ if err := view.DetachTransaction(block.Transactions[i], statusFail); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (view *UtxoViewpoint) HasUtxo(hash *bc.Hash) bool {
+ _, ok := view.Entries[*hash]
+ return ok
+}
+
+func (view *UtxoViewpoint) applyCrossChainUtxo(block *bc.Block, tx *bc.Tx) error {
+ for _, prevout := range tx.MainchainOutputIDs {