From 5c6911c775d79b61a9b35cd42b8a71b8dd78c0dc Mon Sep 17 00:00:00 2001
From: Dave Collins <davec@conformal.com>
Date: Tue, 20 Aug 2013 11:19:34 -0500
Subject: [PATCH] Add IsKnownOrphan function.

This commit provides a new exported function, IsKnownOrphan, which can
be used to determine if the passed hash is currently already known to the
chain as an orphan.
---
 chain.go | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/chain.go b/chain.go
index 0f5a1b83..1625d28d 100644
--- a/chain.go
+++ b/chain.go
@@ -168,6 +168,29 @@ func (b *BlockChain) DisableVerify(disable bool) {
 	b.noVerify = disable
 }
 
+// IsKnownOrphan returns whether the passed hash is currently a known orphan.
+// Keep in mind that only a limited number of orphans are held onto for a
+// limited amount of time, so this function must not be used as an absolute
+// way to test if a block is an orphan block.  A full block (as opposed to just
+// its hash) must be passed to ProcessBlock for that purpose.  However, calling
+// ProcessBlock with an orphan that already exists results in an error, so this
+// function provides a mechanism for a caller to intelligently detect *recent*
+// duplicate orphans and react accordingly.
+//
+// This function is safe for concurrent access.
+func (b *BlockChain) IsKnownOrphan(hash *btcwire.ShaHash) bool {
+	// Protect concurrent access.  Using a read lock only so multiple
+	// readers can query without blocking each other.
+	b.orphanLock.RLock()
+	defer b.orphanLock.RUnlock()
+
+	if _, exists := b.orphans[*hash]; exists {
+		return true
+	}
+
+	return false
+}
+
 // GetOrphanRoot returns the head of the chain for the provided hash from the
 // map of orphan blocks.
 //