From 5c6911c775d79b61a9b35cd42b8a71b8dd78c0dc Mon Sep 17 00:00:00 2001 From: Dave Collins 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. //