diff --git a/reorganization_test.go b/reorganization_test.go index 2bca2ff2..c041ea6f 100644 --- a/reorganization_test.go +++ b/reorganization_test.go @@ -57,14 +57,14 @@ func TestReorganization(t *testing.T) { chain.DisableCheckpoints(true) btcchain.TstSetCoinbaseMaturity(1) - expectedOrphans := map[int]bool{5: true, 6: true} + expectedOrphans := map[int]struct{}{5: struct{}{}, 6: struct{}{}} for i := 1; i < len(blocks); i++ { isOrphan, err := chain.ProcessBlock(blocks[i], btcchain.BFNone) if err != nil { t.Errorf("ProcessBlock fail on block %v: %v\n", i, err) return } - if isOrphan && !expectedOrphans[i] { + if _, ok := expectedOrphans[i]; !ok && isOrphan { t.Errorf("ProcessBlock incorrectly returned block %v "+ "is an orphan\n", i) } diff --git a/txlookup.go b/txlookup.go index de6036ef..c969ba7e 100644 --- a/txlookup.go +++ b/txlookup.go @@ -100,7 +100,7 @@ func disconnectTransactions(txStore TxStore, block *btcutil.Block) error { // transactions from the point of view of the end of the main chain. It takes // a flag which specifies whether or not fully spent transaction should be // included in the results. -func fetchTxStoreMain(db btcdb.Db, txSet map[btcwire.ShaHash]bool, includeSpent bool) TxStore { +func fetchTxStoreMain(db btcdb.Db, txSet map[btcwire.ShaHash]struct{}, includeSpent bool) TxStore { // Just return an empty store now if there are no requested hashes. txStore := make(TxStore) if len(txSet) == 0 { @@ -160,7 +160,7 @@ func fetchTxStoreMain(db btcdb.Db, txSet map[btcwire.ShaHash]bool, includeSpent // chain). Another scenario is where a transaction exists from the point of // view of the main chain, but doesn't exist in a side chain that branches // before the block that contains the transaction on the main chain. -func (b *BlockChain) fetchTxStore(node *blockNode, txSet map[btcwire.ShaHash]bool) (TxStore, error) { +func (b *BlockChain) fetchTxStore(node *blockNode, txSet map[btcwire.ShaHash]struct{}) (TxStore, error) { // Get the previous block node. This function is used over simply // accessing node.parent directly as it will dynamically create previous // block nodes as needed. This helps allow only the pieces of the chain @@ -245,7 +245,7 @@ func (b *BlockChain) fetchInputTransactions(node *blockNode, block *btcutil.Bloc // Loop through all of the transaction inputs (except for the coinbase // which has no inputs) collecting them into sets of what is needed and // what is already known (in-flight). - txNeededSet := make(map[btcwire.ShaHash]bool) + txNeededSet := make(map[btcwire.ShaHash]struct{}) txStore := make(TxStore) for i, tx := range transactions[1:] { for _, txIn := range tx.MsgTx().TxIn { @@ -274,7 +274,7 @@ func (b *BlockChain) fetchInputTransactions(node *blockNode, block *btcutil.Bloc txD.Spent = make([]bool, len(originTx.MsgTx().TxOut)) txD.Err = nil } else { - txNeededSet[*originHash] = true + txNeededSet[*originHash] = struct{}{} } } } @@ -302,10 +302,10 @@ func (b *BlockChain) FetchTransactionStore(tx *btcutil.Tx) (TxStore, error) { // Create a set of needed transactions from the transactions referenced // by the inputs of the passed transaction. Also, add the passed // transaction itself as a way for the caller to detect duplicates. - txNeededSet := make(map[btcwire.ShaHash]bool) - txNeededSet[*tx.Sha()] = true + txNeededSet := make(map[btcwire.ShaHash]struct{}) + txNeededSet[*tx.Sha()] = struct{}{} for _, txIn := range tx.MsgTx().TxIn { - txNeededSet[txIn.PreviousOutpoint.Hash] = true + txNeededSet[txIn.PreviousOutpoint.Hash] = struct{}{} } // Request the input transactions from the point of view of the end of diff --git a/validate.go b/validate.go index ba6c9ef5..476448f7 100644 --- a/validate.go +++ b/validate.go @@ -243,13 +243,13 @@ func CheckTransactionSanity(tx *btcutil.Tx) error { } // Check for duplicate transaction inputs. - existingTxOut := make(map[btcwire.OutPoint]bool) + existingTxOut := make(map[btcwire.OutPoint]struct{}) for _, txIn := range msgTx.TxIn { if _, exists := existingTxOut[txIn.PreviousOutpoint]; exists { return ruleError(ErrDuplicateTxInputs, "transaction "+ "contains duplicate inputs") } - existingTxOut[txIn.PreviousOutpoint] = true + existingTxOut[txIn.PreviousOutpoint] = struct{}{} } // Coinbase script length must be between min and max length. @@ -518,7 +518,7 @@ func checkBlockSanity(block *btcutil.Block, powLimit *big.Int, flags BehaviorFla // Check for duplicate transactions. This check will be fairly quick // since the transaction hashes are already cached due to building the // merkle tree above. - existingTxHashes := make(map[btcwire.ShaHash]bool) + existingTxHashes := make(map[btcwire.ShaHash]struct{}) for _, tx := range transactions { hash := tx.Sha() if _, exists := existingTxHashes[*hash]; exists { @@ -526,7 +526,7 @@ func checkBlockSanity(block *btcutil.Block, powLimit *big.Int, flags BehaviorFla "transaction %v", hash) return ruleError(ErrDuplicateTx, str) } - existingTxHashes[*hash] = true + existingTxHashes[*hash] = struct{}{} } // The number of signature operations must be less than the maximum @@ -611,9 +611,9 @@ func isTransactionSpent(txD *TxData) bool { func (b *BlockChain) checkBIP0030(node *blockNode, block *btcutil.Block) error { // Attempt to fetch duplicate transactions for all of the transactions // in this block from the point of view of the parent node. - fetchSet := make(map[btcwire.ShaHash]bool) + fetchSet := make(map[btcwire.ShaHash]struct{}) for _, tx := range block.Transactions() { - fetchSet[*tx.Sha()] = true + fetchSet[*tx.Sha()] = struct{}{} } txResults, err := b.fetchTxStore(node, fetchSet) if err != nil {