github.com/palcoin-project/palcd@v1.0.0/mempool/mempool.go (about) 1 // Copyright (c) 2013-2016 The btcsuite developers 2 // Use of this source code is governed by an ISC 3 // license that can be found in the LICENSE file. 4 5 package mempool 6 7 import ( 8 "container/list" 9 "fmt" 10 "math" 11 "sync" 12 "sync/atomic" 13 "time" 14 15 "github.com/palcoin-project/palcd/blockchain" 16 "github.com/palcoin-project/palcd/blockchain/indexers" 17 "github.com/palcoin-project/palcd/btcjson" 18 "github.com/palcoin-project/palcd/chaincfg" 19 "github.com/palcoin-project/palcd/chaincfg/chainhash" 20 "github.com/palcoin-project/palcd/mining" 21 "github.com/palcoin-project/palcd/txscript" 22 "github.com/palcoin-project/palcd/wire" 23 "github.com/palcoin-project/palcutil" 24 ) 25 26 const ( 27 // DefaultBlockPrioritySize is the default size in bytes for high- 28 // priority / low-fee transactions. It is used to help determine which 29 // are allowed into the mempool and consequently affects their relay and 30 // inclusion when generating block templates. 31 DefaultBlockPrioritySize = 50000 32 33 // orphanTTL is the maximum amount of time an orphan is allowed to 34 // stay in the orphan pool before it expires and is evicted during the 35 // next scan. 36 orphanTTL = time.Minute * 15 37 38 // orphanExpireScanInterval is the minimum amount of time in between 39 // scans of the orphan pool to evict expired transactions. 40 orphanExpireScanInterval = time.Minute * 5 41 42 // MaxRBFSequence is the maximum sequence number an input can use to 43 // signal that the transaction spending it can be replaced using the 44 // Replace-By-Fee (RBF) policy. 45 MaxRBFSequence = 0xfffffffd 46 47 // MaxReplacementEvictions is the maximum number of transactions that 48 // can be evicted from the mempool when accepting a transaction 49 // replacement. 50 MaxReplacementEvictions = 100 51 ) 52 53 // Tag represents an identifier to use for tagging orphan transactions. The 54 // caller may choose any scheme it desires, however it is common to use peer IDs 55 // so that orphans can be identified by which peer first relayed them. 56 type Tag uint64 57 58 // Config is a descriptor containing the memory pool configuration. 59 type Config struct { 60 // Policy defines the various mempool configuration options related 61 // to policy. 62 Policy Policy 63 64 // ChainParams identifies which chain parameters the txpool is 65 // associated with. 66 ChainParams *chaincfg.Params 67 68 // FetchUtxoView defines the function to use to fetch unspent 69 // transaction output information. 70 FetchUtxoView func(*palcutil.Tx) (*blockchain.UtxoViewpoint, error) 71 72 // BestHeight defines the function to use to access the block height of 73 // the current best chain. 74 BestHeight func() int32 75 76 // MedianTimePast defines the function to use in order to access the 77 // median time past calculated from the point-of-view of the current 78 // chain tip within the best chain. 79 MedianTimePast func() time.Time 80 81 // CalcSequenceLock defines the function to use in order to generate 82 // the current sequence lock for the given transaction using the passed 83 // utxo view. 84 CalcSequenceLock func(*palcutil.Tx, *blockchain.UtxoViewpoint) (*blockchain.SequenceLock, error) 85 86 // IsDeploymentActive returns true if the target deploymentID is 87 // active, and false otherwise. The mempool uses this function to gauge 88 // if transactions using new to be soft-forked rules should be allowed 89 // into the mempool or not. 90 IsDeploymentActive func(deploymentID uint32) (bool, error) 91 92 // SigCache defines a signature cache to use. 93 SigCache *txscript.SigCache 94 95 // HashCache defines the transaction hash mid-state cache to use. 96 HashCache *txscript.HashCache 97 98 // AddrIndex defines the optional address index instance to use for 99 // indexing the unconfirmed transactions in the memory pool. 100 // This can be nil if the address index is not enabled. 101 AddrIndex *indexers.AddrIndex 102 103 // FeeEstimatator provides a feeEstimator. If it is not nil, the mempool 104 // records all new transactions it observes into the feeEstimator. 105 FeeEstimator *FeeEstimator 106 } 107 108 // Policy houses the policy (configuration parameters) which is used to 109 // control the mempool. 110 type Policy struct { 111 // MaxTxVersion is the transaction version that the mempool should 112 // accept. All transactions above this version are rejected as 113 // non-standard. 114 MaxTxVersion int32 115 116 // DisableRelayPriority defines whether to relay free or low-fee 117 // transactions that do not have enough priority to be relayed. 118 DisableRelayPriority bool 119 120 // AcceptNonStd defines whether to accept non-standard transactions. If 121 // true, non-standard transactions will be accepted into the mempool. 122 // Otherwise, all non-standard transactions will be rejected. 123 AcceptNonStd bool 124 125 // FreeTxRelayLimit defines the given amount in thousands of bytes 126 // per minute that transactions with no fee are rate limited to. 127 FreeTxRelayLimit float64 128 129 // MaxOrphanTxs is the maximum number of orphan transactions 130 // that can be queued. 131 MaxOrphanTxs int 132 133 // MaxOrphanTxSize is the maximum size allowed for orphan transactions. 134 // This helps prevent memory exhaustion attacks from sending a lot of 135 // of big orphans. 136 MaxOrphanTxSize int 137 138 // MaxSigOpCostPerTx is the cumulative maximum cost of all the signature 139 // operations in a single transaction we will relay or mine. It is a 140 // fraction of the max signature operations for a block. 141 MaxSigOpCostPerTx int 142 143 // MinRelayTxFee defines the minimum transaction fee in BTC/kB to be 144 // considered a non-zero fee. 145 MinRelayTxFee palcutil.Amount 146 147 // RejectReplacement, if true, rejects accepting replacement 148 // transactions using the Replace-By-Fee (RBF) signaling policy into 149 // the mempool. 150 RejectReplacement bool 151 } 152 153 // TxDesc is a descriptor containing a transaction in the mempool along with 154 // additional metadata. 155 type TxDesc struct { 156 mining.TxDesc 157 158 // StartingPriority is the priority of the transaction when it was added 159 // to the pool. 160 StartingPriority float64 161 } 162 163 // orphanTx is normal transaction that references an ancestor transaction 164 // that is not yet available. It also contains additional information related 165 // to it such as an expiration time to help prevent caching the orphan forever. 166 type orphanTx struct { 167 tx *palcutil.Tx 168 tag Tag 169 expiration time.Time 170 } 171 172 // TxPool is used as a source of transactions that need to be mined into blocks 173 // and relayed to other peers. It is safe for concurrent access from multiple 174 // peers. 175 type TxPool struct { 176 // The following variables must only be used atomically. 177 lastUpdated int64 // last time pool was updated 178 179 mtx sync.RWMutex 180 cfg Config 181 pool map[chainhash.Hash]*TxDesc 182 orphans map[chainhash.Hash]*orphanTx 183 orphansByPrev map[wire.OutPoint]map[chainhash.Hash]*palcutil.Tx 184 outpoints map[wire.OutPoint]*palcutil.Tx 185 pennyTotal float64 // exponentially decaying total for penny spends. 186 lastPennyUnix int64 // unix time of last ``penny spend'' 187 188 // nextExpireScan is the time after which the orphan pool will be 189 // scanned in order to evict orphans. This is NOT a hard deadline as 190 // the scan will only run when an orphan is added to the pool as opposed 191 // to on an unconditional timer. 192 nextExpireScan time.Time 193 } 194 195 // Ensure the TxPool type implements the mining.TxSource interface. 196 var _ mining.TxSource = (*TxPool)(nil) 197 198 // removeOrphan is the internal function which implements the public 199 // RemoveOrphan. See the comment for RemoveOrphan for more details. 200 // 201 // This function MUST be called with the mempool lock held (for writes). 202 func (mp *TxPool) removeOrphan(tx *palcutil.Tx, removeRedeemers bool) { 203 // Nothing to do if passed tx is not an orphan. 204 txHash := tx.Hash() 205 otx, exists := mp.orphans[*txHash] 206 if !exists { 207 return 208 } 209 210 // Remove the reference from the previous orphan index. 211 for _, txIn := range otx.tx.MsgTx().TxIn { 212 orphans, exists := mp.orphansByPrev[txIn.PreviousOutPoint] 213 if exists { 214 delete(orphans, *txHash) 215 216 // Remove the map entry altogether if there are no 217 // longer any orphans which depend on it. 218 if len(orphans) == 0 { 219 delete(mp.orphansByPrev, txIn.PreviousOutPoint) 220 } 221 } 222 } 223 224 // Remove any orphans that redeem outputs from this one if requested. 225 if removeRedeemers { 226 prevOut := wire.OutPoint{Hash: *txHash} 227 for txOutIdx := range tx.MsgTx().TxOut { 228 prevOut.Index = uint32(txOutIdx) 229 for _, orphan := range mp.orphansByPrev[prevOut] { 230 mp.removeOrphan(orphan, true) 231 } 232 } 233 } 234 235 // Remove the transaction from the orphan pool. 236 delete(mp.orphans, *txHash) 237 } 238 239 // RemoveOrphan removes the passed orphan transaction from the orphan pool and 240 // previous orphan index. 241 // 242 // This function is safe for concurrent access. 243 func (mp *TxPool) RemoveOrphan(tx *palcutil.Tx) { 244 mp.mtx.Lock() 245 mp.removeOrphan(tx, false) 246 mp.mtx.Unlock() 247 } 248 249 // RemoveOrphansByTag removes all orphan transactions tagged with the provided 250 // identifier. 251 // 252 // This function is safe for concurrent access. 253 func (mp *TxPool) RemoveOrphansByTag(tag Tag) uint64 { 254 var numEvicted uint64 255 mp.mtx.Lock() 256 for _, otx := range mp.orphans { 257 if otx.tag == tag { 258 mp.removeOrphan(otx.tx, true) 259 numEvicted++ 260 } 261 } 262 mp.mtx.Unlock() 263 return numEvicted 264 } 265 266 // limitNumOrphans limits the number of orphan transactions by evicting a random 267 // orphan if adding a new one would cause it to overflow the max allowed. 268 // 269 // This function MUST be called with the mempool lock held (for writes). 270 func (mp *TxPool) limitNumOrphans() error { 271 // Scan through the orphan pool and remove any expired orphans when it's 272 // time. This is done for efficiency so the scan only happens 273 // periodically instead of on every orphan added to the pool. 274 if now := time.Now(); now.After(mp.nextExpireScan) { 275 origNumOrphans := len(mp.orphans) 276 for _, otx := range mp.orphans { 277 if now.After(otx.expiration) { 278 // Remove redeemers too because the missing 279 // parents are very unlikely to ever materialize 280 // since the orphan has already been around more 281 // than long enough for them to be delivered. 282 mp.removeOrphan(otx.tx, true) 283 } 284 } 285 286 // Set next expiration scan to occur after the scan interval. 287 mp.nextExpireScan = now.Add(orphanExpireScanInterval) 288 289 numOrphans := len(mp.orphans) 290 if numExpired := origNumOrphans - numOrphans; numExpired > 0 { 291 log.Debugf("Expired %d %s (remaining: %d)", numExpired, 292 pickNoun(numExpired, "orphan", "orphans"), 293 numOrphans) 294 } 295 } 296 297 // Nothing to do if adding another orphan will not cause the pool to 298 // exceed the limit. 299 if len(mp.orphans)+1 <= mp.cfg.Policy.MaxOrphanTxs { 300 return nil 301 } 302 303 // Remove a random entry from the map. For most compilers, Go's 304 // range statement iterates starting at a random item although 305 // that is not 100% guaranteed by the spec. The iteration order 306 // is not important here because an adversary would have to be 307 // able to pull off preimage attacks on the hashing function in 308 // order to target eviction of specific entries anyways. 309 for _, otx := range mp.orphans { 310 // Don't remove redeemers in the case of a random eviction since 311 // it is quite possible it might be needed again shortly. 312 mp.removeOrphan(otx.tx, false) 313 break 314 } 315 316 return nil 317 } 318 319 // addOrphan adds an orphan transaction to the orphan pool. 320 // 321 // This function MUST be called with the mempool lock held (for writes). 322 func (mp *TxPool) addOrphan(tx *palcutil.Tx, tag Tag) { 323 // Nothing to do if no orphans are allowed. 324 if mp.cfg.Policy.MaxOrphanTxs <= 0 { 325 return 326 } 327 328 // Limit the number orphan transactions to prevent memory exhaustion. 329 // This will periodically remove any expired orphans and evict a random 330 // orphan if space is still needed. 331 mp.limitNumOrphans() 332 333 mp.orphans[*tx.Hash()] = &orphanTx{ 334 tx: tx, 335 tag: tag, 336 expiration: time.Now().Add(orphanTTL), 337 } 338 for _, txIn := range tx.MsgTx().TxIn { 339 if _, exists := mp.orphansByPrev[txIn.PreviousOutPoint]; !exists { 340 mp.orphansByPrev[txIn.PreviousOutPoint] = 341 make(map[chainhash.Hash]*palcutil.Tx) 342 } 343 mp.orphansByPrev[txIn.PreviousOutPoint][*tx.Hash()] = tx 344 } 345 346 log.Debugf("Stored orphan transaction %v (total: %d)", tx.Hash(), 347 len(mp.orphans)) 348 } 349 350 // maybeAddOrphan potentially adds an orphan to the orphan pool. 351 // 352 // This function MUST be called with the mempool lock held (for writes). 353 func (mp *TxPool) maybeAddOrphan(tx *palcutil.Tx, tag Tag) error { 354 // Ignore orphan transactions that are too large. This helps avoid 355 // a memory exhaustion attack based on sending a lot of really large 356 // orphans. In the case there is a valid transaction larger than this, 357 // it will ultimtely be rebroadcast after the parent transactions 358 // have been mined or otherwise received. 359 // 360 // Note that the number of orphan transactions in the orphan pool is 361 // also limited, so this equates to a maximum memory used of 362 // mp.cfg.Policy.MaxOrphanTxSize * mp.cfg.Policy.MaxOrphanTxs (which is ~5MB 363 // using the default values at the time this comment was written). 364 serializedLen := tx.MsgTx().SerializeSize() 365 if serializedLen > mp.cfg.Policy.MaxOrphanTxSize { 366 str := fmt.Sprintf("orphan transaction size of %d bytes is "+ 367 "larger than max allowed size of %d bytes", 368 serializedLen, mp.cfg.Policy.MaxOrphanTxSize) 369 return txRuleError(wire.RejectNonstandard, str) 370 } 371 372 // Add the orphan if the none of the above disqualified it. 373 mp.addOrphan(tx, tag) 374 375 return nil 376 } 377 378 // removeOrphanDoubleSpends removes all orphans which spend outputs spent by the 379 // passed transaction from the orphan pool. Removing those orphans then leads 380 // to removing all orphans which rely on them, recursively. This is necessary 381 // when a transaction is added to the main pool because it may spend outputs 382 // that orphans also spend. 383 // 384 // This function MUST be called with the mempool lock held (for writes). 385 func (mp *TxPool) removeOrphanDoubleSpends(tx *palcutil.Tx) { 386 msgTx := tx.MsgTx() 387 for _, txIn := range msgTx.TxIn { 388 for _, orphan := range mp.orphansByPrev[txIn.PreviousOutPoint] { 389 mp.removeOrphan(orphan, true) 390 } 391 } 392 } 393 394 // isTransactionInPool returns whether or not the passed transaction already 395 // exists in the main pool. 396 // 397 // This function MUST be called with the mempool lock held (for reads). 398 func (mp *TxPool) isTransactionInPool(hash *chainhash.Hash) bool { 399 if _, exists := mp.pool[*hash]; exists { 400 return true 401 } 402 403 return false 404 } 405 406 // IsTransactionInPool returns whether or not the passed transaction already 407 // exists in the main pool. 408 // 409 // This function is safe for concurrent access. 410 func (mp *TxPool) IsTransactionInPool(hash *chainhash.Hash) bool { 411 // Protect concurrent access. 412 mp.mtx.RLock() 413 inPool := mp.isTransactionInPool(hash) 414 mp.mtx.RUnlock() 415 416 return inPool 417 } 418 419 // isOrphanInPool returns whether or not the passed transaction already exists 420 // in the orphan pool. 421 // 422 // This function MUST be called with the mempool lock held (for reads). 423 func (mp *TxPool) isOrphanInPool(hash *chainhash.Hash) bool { 424 if _, exists := mp.orphans[*hash]; exists { 425 return true 426 } 427 428 return false 429 } 430 431 // IsOrphanInPool returns whether or not the passed transaction already exists 432 // in the orphan pool. 433 // 434 // This function is safe for concurrent access. 435 func (mp *TxPool) IsOrphanInPool(hash *chainhash.Hash) bool { 436 // Protect concurrent access. 437 mp.mtx.RLock() 438 inPool := mp.isOrphanInPool(hash) 439 mp.mtx.RUnlock() 440 441 return inPool 442 } 443 444 // haveTransaction returns whether or not the passed transaction already exists 445 // in the main pool or in the orphan pool. 446 // 447 // This function MUST be called with the mempool lock held (for reads). 448 func (mp *TxPool) haveTransaction(hash *chainhash.Hash) bool { 449 return mp.isTransactionInPool(hash) || mp.isOrphanInPool(hash) 450 } 451 452 // HaveTransaction returns whether or not the passed transaction already exists 453 // in the main pool or in the orphan pool. 454 // 455 // This function is safe for concurrent access. 456 func (mp *TxPool) HaveTransaction(hash *chainhash.Hash) bool { 457 // Protect concurrent access. 458 mp.mtx.RLock() 459 haveTx := mp.haveTransaction(hash) 460 mp.mtx.RUnlock() 461 462 return haveTx 463 } 464 465 // removeTransaction is the internal function which implements the public 466 // RemoveTransaction. See the comment for RemoveTransaction for more details. 467 // 468 // This function MUST be called with the mempool lock held (for writes). 469 func (mp *TxPool) removeTransaction(tx *palcutil.Tx, removeRedeemers bool) { 470 txHash := tx.Hash() 471 if removeRedeemers { 472 // Remove any transactions which rely on this one. 473 for i := uint32(0); i < uint32(len(tx.MsgTx().TxOut)); i++ { 474 prevOut := wire.OutPoint{Hash: *txHash, Index: i} 475 if txRedeemer, exists := mp.outpoints[prevOut]; exists { 476 mp.removeTransaction(txRedeemer, true) 477 } 478 } 479 } 480 481 // Remove the transaction if needed. 482 if txDesc, exists := mp.pool[*txHash]; exists { 483 // Remove unconfirmed address index entries associated with the 484 // transaction if enabled. 485 if mp.cfg.AddrIndex != nil { 486 mp.cfg.AddrIndex.RemoveUnconfirmedTx(txHash) 487 } 488 489 // Mark the referenced outpoints as unspent by the pool. 490 for _, txIn := range txDesc.Tx.MsgTx().TxIn { 491 delete(mp.outpoints, txIn.PreviousOutPoint) 492 } 493 delete(mp.pool, *txHash) 494 atomic.StoreInt64(&mp.lastUpdated, time.Now().Unix()) 495 } 496 } 497 498 // RemoveTransaction removes the passed transaction from the mempool. When the 499 // removeRedeemers flag is set, any transactions that redeem outputs from the 500 // removed transaction will also be removed recursively from the mempool, as 501 // they would otherwise become orphans. 502 // 503 // This function is safe for concurrent access. 504 func (mp *TxPool) RemoveTransaction(tx *palcutil.Tx, removeRedeemers bool) { 505 // Protect concurrent access. 506 mp.mtx.Lock() 507 mp.removeTransaction(tx, removeRedeemers) 508 mp.mtx.Unlock() 509 } 510 511 // RemoveDoubleSpends removes all transactions which spend outputs spent by the 512 // passed transaction from the memory pool. Removing those transactions then 513 // leads to removing all transactions which rely on them, recursively. This is 514 // necessary when a block is connected to the main chain because the block may 515 // contain transactions which were previously unknown to the memory pool. 516 // 517 // This function is safe for concurrent access. 518 func (mp *TxPool) RemoveDoubleSpends(tx *palcutil.Tx) { 519 // Protect concurrent access. 520 mp.mtx.Lock() 521 for _, txIn := range tx.MsgTx().TxIn { 522 if txRedeemer, ok := mp.outpoints[txIn.PreviousOutPoint]; ok { 523 if !txRedeemer.Hash().IsEqual(tx.Hash()) { 524 mp.removeTransaction(txRedeemer, true) 525 } 526 } 527 } 528 mp.mtx.Unlock() 529 } 530 531 // addTransaction adds the passed transaction to the memory pool. It should 532 // not be called directly as it doesn't perform any validation. This is a 533 // helper for maybeAcceptTransaction. 534 // 535 // This function MUST be called with the mempool lock held (for writes). 536 func (mp *TxPool) addTransaction(utxoView *blockchain.UtxoViewpoint, tx *palcutil.Tx, height int32, fee int64) *TxDesc { 537 // Add the transaction to the pool and mark the referenced outpoints 538 // as spent by the pool. 539 txD := &TxDesc{ 540 TxDesc: mining.TxDesc{ 541 Tx: tx, 542 Added: time.Now(), 543 Height: height, 544 Fee: fee, 545 FeePerKB: fee * 1000 / GetTxVirtualSize(tx), 546 }, 547 StartingPriority: mining.CalcPriority(tx.MsgTx(), utxoView, height), 548 } 549 550 mp.pool[*tx.Hash()] = txD 551 for _, txIn := range tx.MsgTx().TxIn { 552 mp.outpoints[txIn.PreviousOutPoint] = tx 553 } 554 atomic.StoreInt64(&mp.lastUpdated, time.Now().Unix()) 555 556 // Add unconfirmed address index entries associated with the transaction 557 // if enabled. 558 if mp.cfg.AddrIndex != nil { 559 mp.cfg.AddrIndex.AddUnconfirmedTx(tx, utxoView) 560 } 561 562 // Record this tx for fee estimation if enabled. 563 if mp.cfg.FeeEstimator != nil { 564 mp.cfg.FeeEstimator.ObserveTransaction(txD) 565 } 566 567 return txD 568 } 569 570 // checkPoolDoubleSpend checks whether or not the passed transaction is 571 // attempting to spend coins already spent by other transactions in the pool. 572 // If it does, we'll check whether each of those transactions are signaling for 573 // replacement. If just one of them isn't, an error is returned. Otherwise, a 574 // boolean is returned signaling that the transaction is a replacement. Note it 575 // does not check for double spends against transactions already in the main 576 // chain. 577 // 578 // This function MUST be called with the mempool lock held (for reads). 579 func (mp *TxPool) checkPoolDoubleSpend(tx *palcutil.Tx) (bool, error) { 580 var isReplacement bool 581 for _, txIn := range tx.MsgTx().TxIn { 582 conflict, ok := mp.outpoints[txIn.PreviousOutPoint] 583 if !ok { 584 continue 585 } 586 587 // Reject the transaction if we don't accept replacement 588 // transactions or if it doesn't signal replacement. 589 if mp.cfg.Policy.RejectReplacement || 590 !mp.signalsReplacement(conflict, nil) { 591 str := fmt.Sprintf("output %v already spent by "+ 592 "transaction %v in the memory pool", 593 txIn.PreviousOutPoint, conflict.Hash()) 594 return false, txRuleError(wire.RejectDuplicate, str) 595 } 596 597 isReplacement = true 598 } 599 600 return isReplacement, nil 601 } 602 603 // signalsReplacement determines if a transaction is signaling that it can be 604 // replaced using the Replace-By-Fee (RBF) policy. This policy specifies two 605 // ways a transaction can signal that it is replaceable: 606 // 607 // Explicit signaling: A transaction is considered to have opted in to allowing 608 // replacement of itself if any of its inputs have a sequence number less than 609 // 0xfffffffe. 610 // 611 // Inherited signaling: Transactions that don't explicitly signal replaceability 612 // are replaceable under this policy for as long as any one of their ancestors 613 // signals replaceability and remains unconfirmed. 614 // 615 // The cache is optional and serves as an optimization to avoid visiting 616 // transactions we've already determined don't signal replacement. 617 // 618 // This function MUST be called with the mempool lock held (for reads). 619 func (mp *TxPool) signalsReplacement(tx *palcutil.Tx, 620 cache map[chainhash.Hash]struct{}) bool { 621 622 // If a cache was not provided, we'll initialize one now to use for the 623 // recursive calls. 624 if cache == nil { 625 cache = make(map[chainhash.Hash]struct{}) 626 } 627 628 for _, txIn := range tx.MsgTx().TxIn { 629 if txIn.Sequence <= MaxRBFSequence { 630 return true 631 } 632 633 hash := txIn.PreviousOutPoint.Hash 634 unconfirmedAncestor, ok := mp.pool[hash] 635 if !ok { 636 continue 637 } 638 639 // If we've already determined the transaction doesn't signal 640 // replacement, we can avoid visiting it again. 641 if _, ok := cache[hash]; ok { 642 continue 643 } 644 645 if mp.signalsReplacement(unconfirmedAncestor.Tx, cache) { 646 return true 647 } 648 649 // Since the transaction doesn't signal replacement, we'll cache 650 // its result to ensure we don't attempt to determine so again. 651 cache[hash] = struct{}{} 652 } 653 654 return false 655 } 656 657 // txAncestors returns all of the unconfirmed ancestors of the given 658 // transaction. Given transactions A, B, and C where C spends B and B spends A, 659 // A and B are considered ancestors of C. 660 // 661 // The cache is optional and serves as an optimization to avoid visiting 662 // transactions we've already determined ancestors of. 663 // 664 // This function MUST be called with the mempool lock held (for reads). 665 func (mp *TxPool) txAncestors(tx *palcutil.Tx, 666 cache map[chainhash.Hash]map[chainhash.Hash]*palcutil.Tx) map[chainhash.Hash]*palcutil.Tx { 667 668 // If a cache was not provided, we'll initialize one now to use for the 669 // recursive calls. 670 if cache == nil { 671 cache = make(map[chainhash.Hash]map[chainhash.Hash]*palcutil.Tx) 672 } 673 674 ancestors := make(map[chainhash.Hash]*palcutil.Tx) 675 for _, txIn := range tx.MsgTx().TxIn { 676 parent, ok := mp.pool[txIn.PreviousOutPoint.Hash] 677 if !ok { 678 continue 679 } 680 ancestors[*parent.Tx.Hash()] = parent.Tx 681 682 // Determine if the ancestors of this ancestor have already been 683 // computed. If they haven't, we'll do so now and cache them to 684 // use them later on if necessary. 685 moreAncestors, ok := cache[*parent.Tx.Hash()] 686 if !ok { 687 moreAncestors = mp.txAncestors(parent.Tx, cache) 688 cache[*parent.Tx.Hash()] = moreAncestors 689 } 690 691 for hash, ancestor := range moreAncestors { 692 ancestors[hash] = ancestor 693 } 694 } 695 696 return ancestors 697 } 698 699 // txDescendants returns all of the unconfirmed descendants of the given 700 // transaction. Given transactions A, B, and C where C spends B and B spends A, 701 // B and C are considered descendants of A. A cache can be provided in order to 702 // easily retrieve the descendants of transactions we've already determined the 703 // descendants of. 704 // 705 // This function MUST be called with the mempool lock held (for reads). 706 func (mp *TxPool) txDescendants(tx *palcutil.Tx, 707 cache map[chainhash.Hash]map[chainhash.Hash]*palcutil.Tx) map[chainhash.Hash]*palcutil.Tx { 708 709 // If a cache was not provided, we'll initialize one now to use for the 710 // recursive calls. 711 if cache == nil { 712 cache = make(map[chainhash.Hash]map[chainhash.Hash]*palcutil.Tx) 713 } 714 715 // We'll go through all of the outputs of the transaction to determine 716 // if they are spent by any other mempool transactions. 717 descendants := make(map[chainhash.Hash]*palcutil.Tx) 718 op := wire.OutPoint{Hash: *tx.Hash()} 719 for i := range tx.MsgTx().TxOut { 720 op.Index = uint32(i) 721 descendant, ok := mp.outpoints[op] 722 if !ok { 723 continue 724 } 725 descendants[*descendant.Hash()] = descendant 726 727 // Determine if the descendants of this descendant have already 728 // been computed. If they haven't, we'll do so now and cache 729 // them to use them later on if necessary. 730 moreDescendants, ok := cache[*descendant.Hash()] 731 if !ok { 732 moreDescendants = mp.txDescendants(descendant, cache) 733 cache[*descendant.Hash()] = moreDescendants 734 } 735 736 for _, moreDescendant := range moreDescendants { 737 descendants[*moreDescendant.Hash()] = moreDescendant 738 } 739 } 740 741 return descendants 742 } 743 744 // txConflicts returns all of the unconfirmed transactions that would become 745 // conflicts if we were to accept the given transaction into the mempool. An 746 // unconfirmed conflict is known as a transaction that spends an output already 747 // spent by a different transaction within the mempool. Any descendants of these 748 // transactions are also considered conflicts as they would no longer exist. 749 // These are generally not allowed except for transactions that signal RBF 750 // support. 751 // 752 // This function MUST be called with the mempool lock held (for reads). 753 func (mp *TxPool) txConflicts(tx *palcutil.Tx) map[chainhash.Hash]*palcutil.Tx { 754 conflicts := make(map[chainhash.Hash]*palcutil.Tx) 755 for _, txIn := range tx.MsgTx().TxIn { 756 conflict, ok := mp.outpoints[txIn.PreviousOutPoint] 757 if !ok { 758 continue 759 } 760 conflicts[*conflict.Hash()] = conflict 761 for hash, descendant := range mp.txDescendants(conflict, nil) { 762 conflicts[hash] = descendant 763 } 764 } 765 return conflicts 766 } 767 768 // CheckSpend checks whether the passed outpoint is already spent by a 769 // transaction in the mempool. If that's the case the spending transaction will 770 // be returned, if not nil will be returned. 771 func (mp *TxPool) CheckSpend(op wire.OutPoint) *palcutil.Tx { 772 mp.mtx.RLock() 773 txR := mp.outpoints[op] 774 mp.mtx.RUnlock() 775 776 return txR 777 } 778 779 // fetchInputUtxos loads utxo details about the input transactions referenced by 780 // the passed transaction. First, it loads the details form the viewpoint of 781 // the main chain, then it adjusts them based upon the contents of the 782 // transaction pool. 783 // 784 // This function MUST be called with the mempool lock held (for reads). 785 func (mp *TxPool) fetchInputUtxos(tx *palcutil.Tx) (*blockchain.UtxoViewpoint, error) { 786 utxoView, err := mp.cfg.FetchUtxoView(tx) 787 if err != nil { 788 return nil, err 789 } 790 791 // Attempt to populate any missing inputs from the transaction pool. 792 for _, txIn := range tx.MsgTx().TxIn { 793 prevOut := &txIn.PreviousOutPoint 794 entry := utxoView.LookupEntry(*prevOut) 795 if entry != nil && !entry.IsSpent() { 796 continue 797 } 798 799 if poolTxDesc, exists := mp.pool[prevOut.Hash]; exists { 800 // AddTxOut ignores out of range index values, so it is 801 // safe to call without bounds checking here. 802 utxoView.AddTxOut(poolTxDesc.Tx, prevOut.Index, 803 mining.UnminedHeight) 804 } 805 } 806 807 return utxoView, nil 808 } 809 810 // FetchTransaction returns the requested transaction from the transaction pool. 811 // This only fetches from the main transaction pool and does not include 812 // orphans. 813 // 814 // This function is safe for concurrent access. 815 func (mp *TxPool) FetchTransaction(txHash *chainhash.Hash) (*palcutil.Tx, error) { 816 // Protect concurrent access. 817 mp.mtx.RLock() 818 txDesc, exists := mp.pool[*txHash] 819 mp.mtx.RUnlock() 820 821 if exists { 822 return txDesc.Tx, nil 823 } 824 825 return nil, fmt.Errorf("transaction is not in the pool") 826 } 827 828 // validateReplacement determines whether a transaction is deemed as a valid 829 // replacement of all of its conflicts according to the RBF policy. If it is 830 // valid, no error is returned. Otherwise, an error is returned indicating what 831 // went wrong. 832 // 833 // This function MUST be called with the mempool lock held (for reads). 834 func (mp *TxPool) validateReplacement(tx *palcutil.Tx, 835 txFee int64) (map[chainhash.Hash]*palcutil.Tx, error) { 836 837 // First, we'll make sure the set of conflicting transactions doesn't 838 // exceed the maximum allowed. 839 conflicts := mp.txConflicts(tx) 840 if len(conflicts) > MaxReplacementEvictions { 841 str := fmt.Sprintf("replacement transaction %v evicts more "+ 842 "transactions than permitted: max is %v, evicts %v", 843 tx.Hash(), MaxReplacementEvictions, len(conflicts)) 844 return nil, txRuleError(wire.RejectNonstandard, str) 845 } 846 847 // The set of conflicts (transactions we'll replace) and ancestors 848 // should not overlap, otherwise the replacement would be spending an 849 // output that no longer exists. 850 for ancestorHash := range mp.txAncestors(tx, nil) { 851 if _, ok := conflicts[ancestorHash]; !ok { 852 continue 853 } 854 str := fmt.Sprintf("replacement transaction %v spends parent "+ 855 "transaction %v", tx.Hash(), ancestorHash) 856 return nil, txRuleError(wire.RejectInvalid, str) 857 } 858 859 // The replacement should have a higher fee rate than each of the 860 // conflicting transactions and a higher absolute fee than the fee sum 861 // of all the conflicting transactions. 862 // 863 // We usually don't want to accept replacements with lower fee rates 864 // than what they replaced as that would lower the fee rate of the next 865 // block. Requiring that the fee rate always be increased is also an 866 // easy-to-reason about way to prevent DoS attacks via replacements. 867 var ( 868 txSize = GetTxVirtualSize(tx) 869 txFeeRate = txFee * 1000 / txSize 870 conflictsFee int64 871 conflictsParents = make(map[chainhash.Hash]struct{}) 872 ) 873 for hash, conflict := range conflicts { 874 if txFeeRate <= mp.pool[hash].FeePerKB { 875 str := fmt.Sprintf("replacement transaction %v has an "+ 876 "insufficient fee rate: needs more than %v, "+ 877 "has %v", tx.Hash(), mp.pool[hash].FeePerKB, 878 txFeeRate) 879 return nil, txRuleError(wire.RejectInsufficientFee, str) 880 } 881 882 conflictsFee += mp.pool[hash].Fee 883 884 // We'll track each conflict's parents to ensure the replacement 885 // isn't spending any new unconfirmed inputs. 886 for _, txIn := range conflict.MsgTx().TxIn { 887 conflictsParents[txIn.PreviousOutPoint.Hash] = struct{}{} 888 } 889 } 890 891 // It should also have an absolute fee greater than all of the 892 // transactions it intends to replace and pay for its own bandwidth, 893 // which is determined by our minimum relay fee. 894 minFee := calcMinRequiredTxRelayFee(txSize, mp.cfg.Policy.MinRelayTxFee) 895 if txFee < conflictsFee+minFee { 896 str := fmt.Sprintf("replacement transaction %v has an "+ 897 "insufficient absolute fee: needs %v, has %v", 898 tx.Hash(), conflictsFee+minFee, txFee) 899 return nil, txRuleError(wire.RejectInsufficientFee, str) 900 } 901 902 // Finally, it should not spend any new unconfirmed outputs, other than 903 // the ones already included in the parents of the conflicting 904 // transactions it'll replace. 905 for _, txIn := range tx.MsgTx().TxIn { 906 if _, ok := conflictsParents[txIn.PreviousOutPoint.Hash]; ok { 907 continue 908 } 909 // Confirmed outputs are valid to spend in the replacement. 910 if _, ok := mp.pool[txIn.PreviousOutPoint.Hash]; !ok { 911 continue 912 } 913 str := fmt.Sprintf("replacement transaction spends new "+ 914 "unconfirmed input %v not found in conflicting "+ 915 "transactions", txIn.PreviousOutPoint) 916 return nil, txRuleError(wire.RejectInvalid, str) 917 } 918 919 return conflicts, nil 920 } 921 922 // maybeAcceptTransaction is the internal function which implements the public 923 // MaybeAcceptTransaction. See the comment for MaybeAcceptTransaction for 924 // more details. 925 // 926 // This function MUST be called with the mempool lock held (for writes). 927 func (mp *TxPool) maybeAcceptTransaction(tx *palcutil.Tx, isNew, rateLimit, rejectDupOrphans bool) ([]*chainhash.Hash, *TxDesc, error) { 928 txHash := tx.Hash() 929 930 // If a transaction has witness data, and segwit isn't active yet, If 931 // segwit isn't active yet, then we won't accept it into the mempool as 932 // it can't be mined yet. 933 if tx.MsgTx().HasWitness() { 934 segwitActive, err := mp.cfg.IsDeploymentActive(chaincfg.DeploymentSegwit) 935 if err != nil { 936 return nil, nil, err 937 } 938 939 if !segwitActive { 940 simnetHint := "" 941 if mp.cfg.ChainParams.Net == wire.SimNet { 942 bestHeight := mp.cfg.BestHeight() 943 simnetHint = fmt.Sprintf(" (The threshold for segwit activation is 300 blocks on simnet, "+ 944 "current best height is %d)", bestHeight) 945 } 946 str := fmt.Sprintf("transaction %v has witness data, "+ 947 "but segwit isn't active yet%s", txHash, simnetHint) 948 return nil, nil, txRuleError(wire.RejectNonstandard, str) 949 } 950 } 951 952 // Don't accept the transaction if it already exists in the pool. This 953 // applies to orphan transactions as well when the reject duplicate 954 // orphans flag is set. This check is intended to be a quick check to 955 // weed out duplicates. 956 if mp.isTransactionInPool(txHash) || (rejectDupOrphans && 957 mp.isOrphanInPool(txHash)) { 958 959 str := fmt.Sprintf("already have transaction %v", txHash) 960 return nil, nil, txRuleError(wire.RejectDuplicate, str) 961 } 962 963 // Perform preliminary sanity checks on the transaction. This makes 964 // use of blockchain which contains the invariant rules for what 965 // transactions are allowed into blocks. 966 err := blockchain.CheckTransactionSanity(tx) 967 if err != nil { 968 if cerr, ok := err.(blockchain.RuleError); ok { 969 return nil, nil, chainRuleError(cerr) 970 } 971 return nil, nil, err 972 } 973 974 // A standalone transaction must not be a coinbase transaction. 975 if blockchain.IsCoinBase(tx) { 976 str := fmt.Sprintf("transaction %v is an individual coinbase", 977 txHash) 978 return nil, nil, txRuleError(wire.RejectInvalid, str) 979 } 980 981 // Get the current height of the main chain. A standalone transaction 982 // will be mined into the next block at best, so its height is at least 983 // one more than the current height. 984 bestHeight := mp.cfg.BestHeight() 985 nextBlockHeight := bestHeight + 1 986 987 medianTimePast := mp.cfg.MedianTimePast() 988 989 // Don't allow non-standard transactions if the network parameters 990 // forbid their acceptance. 991 if !mp.cfg.Policy.AcceptNonStd { 992 err = checkTransactionStandard(tx, nextBlockHeight, 993 medianTimePast, mp.cfg.Policy.MinRelayTxFee, 994 mp.cfg.Policy.MaxTxVersion) 995 if err != nil { 996 // Attempt to extract a reject code from the error so 997 // it can be retained. When not possible, fall back to 998 // a non standard error. 999 rejectCode, found := extractRejectCode(err) 1000 if !found { 1001 rejectCode = wire.RejectNonstandard 1002 } 1003 str := fmt.Sprintf("transaction %v is not standard: %v", 1004 txHash, err) 1005 return nil, nil, txRuleError(rejectCode, str) 1006 } 1007 } 1008 1009 // The transaction may not use any of the same outputs as other 1010 // transactions already in the pool as that would ultimately result in a 1011 // double spend, unless those transactions signal for RBF. This check is 1012 // intended to be quick and therefore only detects double spends within 1013 // the transaction pool itself. The transaction could still be double 1014 // spending coins from the main chain at this point. There is a more 1015 // in-depth check that happens later after fetching the referenced 1016 // transaction inputs from the main chain which examines the actual 1017 // spend data and prevents double spends. 1018 isReplacement, err := mp.checkPoolDoubleSpend(tx) 1019 if err != nil { 1020 return nil, nil, err 1021 } 1022 1023 // Fetch all of the unspent transaction outputs referenced by the inputs 1024 // to this transaction. This function also attempts to fetch the 1025 // transaction itself to be used for detecting a duplicate transaction 1026 // without needing to do a separate lookup. 1027 utxoView, err := mp.fetchInputUtxos(tx) 1028 if err != nil { 1029 if cerr, ok := err.(blockchain.RuleError); ok { 1030 return nil, nil, chainRuleError(cerr) 1031 } 1032 return nil, nil, err 1033 } 1034 1035 // Don't allow the transaction if it exists in the main chain and is not 1036 // not already fully spent. 1037 prevOut := wire.OutPoint{Hash: *txHash} 1038 for txOutIdx := range tx.MsgTx().TxOut { 1039 prevOut.Index = uint32(txOutIdx) 1040 entry := utxoView.LookupEntry(prevOut) 1041 if entry != nil && !entry.IsSpent() { 1042 return nil, nil, txRuleError(wire.RejectDuplicate, 1043 "transaction already exists") 1044 } 1045 utxoView.RemoveEntry(prevOut) 1046 } 1047 1048 // Transaction is an orphan if any of the referenced transaction outputs 1049 // don't exist or are already spent. Adding orphans to the orphan pool 1050 // is not handled by this function, and the caller should use 1051 // maybeAddOrphan if this behavior is desired. 1052 var missingParents []*chainhash.Hash 1053 for outpoint, entry := range utxoView.Entries() { 1054 if entry == nil || entry.IsSpent() { 1055 // Must make a copy of the hash here since the iterator 1056 // is replaced and taking its address directly would 1057 // result in all of the entries pointing to the same 1058 // memory location and thus all be the final hash. 1059 hashCopy := outpoint.Hash 1060 missingParents = append(missingParents, &hashCopy) 1061 } 1062 } 1063 if len(missingParents) > 0 { 1064 return missingParents, nil, nil 1065 } 1066 1067 // Don't allow the transaction into the mempool unless its sequence 1068 // lock is active, meaning that it'll be allowed into the next block 1069 // with respect to its defined relative lock times. 1070 sequenceLock, err := mp.cfg.CalcSequenceLock(tx, utxoView) 1071 if err != nil { 1072 if cerr, ok := err.(blockchain.RuleError); ok { 1073 return nil, nil, chainRuleError(cerr) 1074 } 1075 return nil, nil, err 1076 } 1077 if !blockchain.SequenceLockActive(sequenceLock, nextBlockHeight, 1078 medianTimePast) { 1079 return nil, nil, txRuleError(wire.RejectNonstandard, 1080 "transaction's sequence locks on inputs not met") 1081 } 1082 1083 // Perform several checks on the transaction inputs using the invariant 1084 // rules in blockchain for what transactions are allowed into blocks. 1085 // Also returns the fees associated with the transaction which will be 1086 // used later. 1087 txFee, err := blockchain.CheckTransactionInputs(tx, nextBlockHeight, 1088 utxoView, mp.cfg.ChainParams) 1089 if err != nil { 1090 if cerr, ok := err.(blockchain.RuleError); ok { 1091 return nil, nil, chainRuleError(cerr) 1092 } 1093 return nil, nil, err 1094 } 1095 1096 // Don't allow transactions with non-standard inputs if the network 1097 // parameters forbid their acceptance. 1098 if !mp.cfg.Policy.AcceptNonStd { 1099 err := checkInputsStandard(tx, utxoView) 1100 if err != nil { 1101 // Attempt to extract a reject code from the error so 1102 // it can be retained. When not possible, fall back to 1103 // a non standard error. 1104 rejectCode, found := extractRejectCode(err) 1105 if !found { 1106 rejectCode = wire.RejectNonstandard 1107 } 1108 str := fmt.Sprintf("transaction %v has a non-standard "+ 1109 "input: %v", txHash, err) 1110 return nil, nil, txRuleError(rejectCode, str) 1111 } 1112 } 1113 1114 // NOTE: if you modify this code to accept non-standard transactions, 1115 // you should add code here to check that the transaction does a 1116 // reasonable number of ECDSA signature verifications. 1117 1118 // Don't allow transactions with an excessive number of signature 1119 // operations which would result in making it impossible to mine. Since 1120 // the coinbase address itself can contain signature operations, the 1121 // maximum allowed signature operations per transaction is less than 1122 // the maximum allowed signature operations per block. 1123 // TODO(roasbeef): last bool should be conditional on segwit activation 1124 sigOpCost, err := blockchain.GetSigOpCost(tx, false, utxoView, true, true) 1125 if err != nil { 1126 if cerr, ok := err.(blockchain.RuleError); ok { 1127 return nil, nil, chainRuleError(cerr) 1128 } 1129 return nil, nil, err 1130 } 1131 if sigOpCost > mp.cfg.Policy.MaxSigOpCostPerTx { 1132 str := fmt.Sprintf("transaction %v sigop cost is too high: %d > %d", 1133 txHash, sigOpCost, mp.cfg.Policy.MaxSigOpCostPerTx) 1134 return nil, nil, txRuleError(wire.RejectNonstandard, str) 1135 } 1136 1137 // Don't allow transactions with fees too low to get into a mined block. 1138 // 1139 // Most miners allow a free transaction area in blocks they mine to go 1140 // alongside the area used for high-priority transactions as well as 1141 // transactions with fees. A transaction size of up to 1000 bytes is 1142 // considered safe to go into this section. Further, the minimum fee 1143 // calculated below on its own would encourage several small 1144 // transactions to avoid fees rather than one single larger transaction 1145 // which is more desirable. Therefore, as long as the size of the 1146 // transaction does not exceeed 1000 less than the reserved space for 1147 // high-priority transactions, don't require a fee for it. 1148 serializedSize := GetTxVirtualSize(tx) 1149 minFee := calcMinRequiredTxRelayFee(serializedSize, 1150 mp.cfg.Policy.MinRelayTxFee) 1151 if serializedSize >= (DefaultBlockPrioritySize-1000) && txFee < minFee { 1152 str := fmt.Sprintf("transaction %v has %d fees which is under "+ 1153 "the required amount of %d", txHash, txFee, 1154 minFee) 1155 return nil, nil, txRuleError(wire.RejectInsufficientFee, str) 1156 } 1157 1158 // Require that free transactions have sufficient priority to be mined 1159 // in the next block. Transactions which are being added back to the 1160 // memory pool from blocks that have been disconnected during a reorg 1161 // are exempted. 1162 if isNew && !mp.cfg.Policy.DisableRelayPriority && txFee < minFee { 1163 currentPriority := mining.CalcPriority(tx.MsgTx(), utxoView, 1164 nextBlockHeight) 1165 if currentPriority <= mining.MinHighPriority { 1166 str := fmt.Sprintf("transaction %v has insufficient "+ 1167 "priority (%g <= %g)", txHash, 1168 currentPriority, mining.MinHighPriority) 1169 return nil, nil, txRuleError(wire.RejectInsufficientFee, str) 1170 } 1171 } 1172 1173 // Free-to-relay transactions are rate limited here to prevent 1174 // penny-flooding with tiny transactions as a form of attack. 1175 if rateLimit && txFee < minFee { 1176 nowUnix := time.Now().Unix() 1177 // Decay passed data with an exponentially decaying ~10 minute 1178 // window - matches bitcoind handling. 1179 mp.pennyTotal *= math.Pow(1.0-1.0/600.0, 1180 float64(nowUnix-mp.lastPennyUnix)) 1181 mp.lastPennyUnix = nowUnix 1182 1183 // Are we still over the limit? 1184 if mp.pennyTotal >= mp.cfg.Policy.FreeTxRelayLimit*10*1000 { 1185 str := fmt.Sprintf("transaction %v has been rejected "+ 1186 "by the rate limiter due to low fees", txHash) 1187 return nil, nil, txRuleError(wire.RejectInsufficientFee, str) 1188 } 1189 oldTotal := mp.pennyTotal 1190 1191 mp.pennyTotal += float64(serializedSize) 1192 log.Tracef("rate limit: curTotal %v, nextTotal: %v, "+ 1193 "limit %v", oldTotal, mp.pennyTotal, 1194 mp.cfg.Policy.FreeTxRelayLimit*10*1000) 1195 } 1196 1197 // If the transaction has any conflicts and we've made it this far, then 1198 // we're processing a potential replacement. 1199 var conflicts map[chainhash.Hash]*palcutil.Tx 1200 if isReplacement { 1201 conflicts, err = mp.validateReplacement(tx, txFee) 1202 if err != nil { 1203 return nil, nil, err 1204 } 1205 } 1206 1207 // Verify crypto signatures for each input and reject the transaction if 1208 // any don't verify. 1209 err = blockchain.ValidateTransactionScripts(tx, utxoView, 1210 txscript.StandardVerifyFlags, mp.cfg.SigCache, 1211 mp.cfg.HashCache) 1212 if err != nil { 1213 if cerr, ok := err.(blockchain.RuleError); ok { 1214 return nil, nil, chainRuleError(cerr) 1215 } 1216 return nil, nil, err 1217 } 1218 1219 // Now that we've deemed the transaction as valid, we can add it to the 1220 // mempool. If it ended up replacing any transactions, we'll remove them 1221 // first. 1222 for _, conflict := range conflicts { 1223 log.Debugf("Replacing transaction %v (fee_rate=%v sat/kb) "+ 1224 "with %v (fee_rate=%v sat/kb)\n", conflict.Hash(), 1225 mp.pool[*conflict.Hash()].FeePerKB, tx.Hash(), 1226 txFee*1000/serializedSize) 1227 1228 // The conflict set should already include the descendants for 1229 // each one, so we don't need to remove the redeemers within 1230 // this call as they'll be removed eventually. 1231 mp.removeTransaction(conflict, false) 1232 } 1233 txD := mp.addTransaction(utxoView, tx, bestHeight, txFee) 1234 1235 log.Debugf("Accepted transaction %v (pool size: %v)", txHash, 1236 len(mp.pool)) 1237 1238 return nil, txD, nil 1239 } 1240 1241 // MaybeAcceptTransaction is the main workhorse for handling insertion of new 1242 // free-standing transactions into a memory pool. It includes functionality 1243 // such as rejecting duplicate transactions, ensuring transactions follow all 1244 // rules, detecting orphan transactions, and insertion into the memory pool. 1245 // 1246 // If the transaction is an orphan (missing parent transactions), the 1247 // transaction is NOT added to the orphan pool, but each unknown referenced 1248 // parent is returned. Use ProcessTransaction instead if new orphans should 1249 // be added to the orphan pool. 1250 // 1251 // This function is safe for concurrent access. 1252 func (mp *TxPool) MaybeAcceptTransaction(tx *palcutil.Tx, isNew, rateLimit bool) ([]*chainhash.Hash, *TxDesc, error) { 1253 // Protect concurrent access. 1254 mp.mtx.Lock() 1255 hashes, txD, err := mp.maybeAcceptTransaction(tx, isNew, rateLimit, true) 1256 mp.mtx.Unlock() 1257 1258 return hashes, txD, err 1259 } 1260 1261 // processOrphans is the internal function which implements the public 1262 // ProcessOrphans. See the comment for ProcessOrphans for more details. 1263 // 1264 // This function MUST be called with the mempool lock held (for writes). 1265 func (mp *TxPool) processOrphans(acceptedTx *palcutil.Tx) []*TxDesc { 1266 var acceptedTxns []*TxDesc 1267 1268 // Start with processing at least the passed transaction. 1269 processList := list.New() 1270 processList.PushBack(acceptedTx) 1271 for processList.Len() > 0 { 1272 // Pop the transaction to process from the front of the list. 1273 firstElement := processList.Remove(processList.Front()) 1274 processItem := firstElement.(*palcutil.Tx) 1275 1276 prevOut := wire.OutPoint{Hash: *processItem.Hash()} 1277 for txOutIdx := range processItem.MsgTx().TxOut { 1278 // Look up all orphans that redeem the output that is 1279 // now available. This will typically only be one, but 1280 // it could be multiple if the orphan pool contains 1281 // double spends. While it may seem odd that the orphan 1282 // pool would allow this since there can only possibly 1283 // ultimately be a single redeemer, it's important to 1284 // track it this way to prevent malicious actors from 1285 // being able to purposely constructing orphans that 1286 // would otherwise make outputs unspendable. 1287 // 1288 // Skip to the next available output if there are none. 1289 prevOut.Index = uint32(txOutIdx) 1290 orphans, exists := mp.orphansByPrev[prevOut] 1291 if !exists { 1292 continue 1293 } 1294 1295 // Potentially accept an orphan into the tx pool. 1296 for _, tx := range orphans { 1297 missing, txD, err := mp.maybeAcceptTransaction( 1298 tx, true, true, false) 1299 if err != nil { 1300 // The orphan is now invalid, so there 1301 // is no way any other orphans which 1302 // redeem any of its outputs can be 1303 // accepted. Remove them. 1304 mp.removeOrphan(tx, true) 1305 break 1306 } 1307 1308 // Transaction is still an orphan. Try the next 1309 // orphan which redeems this output. 1310 if len(missing) > 0 { 1311 continue 1312 } 1313 1314 // Transaction was accepted into the main pool. 1315 // 1316 // Add it to the list of accepted transactions 1317 // that are no longer orphans, remove it from 1318 // the orphan pool, and add it to the list of 1319 // transactions to process so any orphans that 1320 // depend on it are handled too. 1321 acceptedTxns = append(acceptedTxns, txD) 1322 mp.removeOrphan(tx, false) 1323 processList.PushBack(tx) 1324 1325 // Only one transaction for this outpoint can be 1326 // accepted, so the rest are now double spends 1327 // and are removed later. 1328 break 1329 } 1330 } 1331 } 1332 1333 // Recursively remove any orphans that also redeem any outputs redeemed 1334 // by the accepted transactions since those are now definitive double 1335 // spends. 1336 mp.removeOrphanDoubleSpends(acceptedTx) 1337 for _, txD := range acceptedTxns { 1338 mp.removeOrphanDoubleSpends(txD.Tx) 1339 } 1340 1341 return acceptedTxns 1342 } 1343 1344 // ProcessOrphans determines if there are any orphans which depend on the passed 1345 // transaction hash (it is possible that they are no longer orphans) and 1346 // potentially accepts them to the memory pool. It repeats the process for the 1347 // newly accepted transactions (to detect further orphans which may no longer be 1348 // orphans) until there are no more. 1349 // 1350 // It returns a slice of transactions added to the mempool. A nil slice means 1351 // no transactions were moved from the orphan pool to the mempool. 1352 // 1353 // This function is safe for concurrent access. 1354 func (mp *TxPool) ProcessOrphans(acceptedTx *palcutil.Tx) []*TxDesc { 1355 mp.mtx.Lock() 1356 acceptedTxns := mp.processOrphans(acceptedTx) 1357 mp.mtx.Unlock() 1358 1359 return acceptedTxns 1360 } 1361 1362 // ProcessTransaction is the main workhorse for handling insertion of new 1363 // free-standing transactions into the memory pool. It includes functionality 1364 // such as rejecting duplicate transactions, ensuring transactions follow all 1365 // rules, orphan transaction handling, and insertion into the memory pool. 1366 // 1367 // It returns a slice of transactions added to the mempool. When the 1368 // error is nil, the list will include the passed transaction itself along 1369 // with any additional orphan transaactions that were added as a result of 1370 // the passed one being accepted. 1371 // 1372 // This function is safe for concurrent access. 1373 func (mp *TxPool) ProcessTransaction(tx *palcutil.Tx, allowOrphan, rateLimit bool, tag Tag) ([]*TxDesc, error) { 1374 log.Tracef("Processing transaction %v", tx.Hash()) 1375 1376 // Protect concurrent access. 1377 mp.mtx.Lock() 1378 defer mp.mtx.Unlock() 1379 1380 // Potentially accept the transaction to the memory pool. 1381 missingParents, txD, err := mp.maybeAcceptTransaction(tx, true, rateLimit, 1382 true) 1383 if err != nil { 1384 return nil, err 1385 } 1386 1387 if len(missingParents) == 0 { 1388 // Accept any orphan transactions that depend on this 1389 // transaction (they may no longer be orphans if all inputs 1390 // are now available) and repeat for those accepted 1391 // transactions until there are no more. 1392 newTxs := mp.processOrphans(tx) 1393 acceptedTxs := make([]*TxDesc, len(newTxs)+1) 1394 1395 // Add the parent transaction first so remote nodes 1396 // do not add orphans. 1397 acceptedTxs[0] = txD 1398 copy(acceptedTxs[1:], newTxs) 1399 1400 return acceptedTxs, nil 1401 } 1402 1403 // The transaction is an orphan (has inputs missing). Reject 1404 // it if the flag to allow orphans is not set. 1405 if !allowOrphan { 1406 // Only use the first missing parent transaction in 1407 // the error message. 1408 // 1409 // NOTE: RejectDuplicate is really not an accurate 1410 // reject code here, but it matches the reference 1411 // implementation and there isn't a better choice due 1412 // to the limited number of reject codes. Missing 1413 // inputs is assumed to mean they are already spent 1414 // which is not really always the case. 1415 str := fmt.Sprintf("orphan transaction %v references "+ 1416 "outputs of unknown or fully-spent "+ 1417 "transaction %v", tx.Hash(), missingParents[0]) 1418 return nil, txRuleError(wire.RejectDuplicate, str) 1419 } 1420 1421 // Potentially add the orphan transaction to the orphan pool. 1422 err = mp.maybeAddOrphan(tx, tag) 1423 return nil, err 1424 } 1425 1426 // Count returns the number of transactions in the main pool. It does not 1427 // include the orphan pool. 1428 // 1429 // This function is safe for concurrent access. 1430 func (mp *TxPool) Count() int { 1431 mp.mtx.RLock() 1432 count := len(mp.pool) 1433 mp.mtx.RUnlock() 1434 1435 return count 1436 } 1437 1438 // TxHashes returns a slice of hashes for all of the transactions in the memory 1439 // pool. 1440 // 1441 // This function is safe for concurrent access. 1442 func (mp *TxPool) TxHashes() []*chainhash.Hash { 1443 mp.mtx.RLock() 1444 hashes := make([]*chainhash.Hash, len(mp.pool)) 1445 i := 0 1446 for hash := range mp.pool { 1447 hashCopy := hash 1448 hashes[i] = &hashCopy 1449 i++ 1450 } 1451 mp.mtx.RUnlock() 1452 1453 return hashes 1454 } 1455 1456 // TxDescs returns a slice of descriptors for all the transactions in the pool. 1457 // The descriptors are to be treated as read only. 1458 // 1459 // This function is safe for concurrent access. 1460 func (mp *TxPool) TxDescs() []*TxDesc { 1461 mp.mtx.RLock() 1462 descs := make([]*TxDesc, len(mp.pool)) 1463 i := 0 1464 for _, desc := range mp.pool { 1465 descs[i] = desc 1466 i++ 1467 } 1468 mp.mtx.RUnlock() 1469 1470 return descs 1471 } 1472 1473 // MiningDescs returns a slice of mining descriptors for all the transactions 1474 // in the pool. 1475 // 1476 // This is part of the mining.TxSource interface implementation and is safe for 1477 // concurrent access as required by the interface contract. 1478 func (mp *TxPool) MiningDescs() []*mining.TxDesc { 1479 mp.mtx.RLock() 1480 descs := make([]*mining.TxDesc, len(mp.pool)) 1481 i := 0 1482 for _, desc := range mp.pool { 1483 descs[i] = &desc.TxDesc 1484 i++ 1485 } 1486 mp.mtx.RUnlock() 1487 1488 return descs 1489 } 1490 1491 // RawMempoolVerbose returns all of the entries in the mempool as a fully 1492 // populated btcjson result. 1493 // 1494 // This function is safe for concurrent access. 1495 func (mp *TxPool) RawMempoolVerbose() map[string]*btcjson.GetRawMempoolVerboseResult { 1496 mp.mtx.RLock() 1497 defer mp.mtx.RUnlock() 1498 1499 result := make(map[string]*btcjson.GetRawMempoolVerboseResult, 1500 len(mp.pool)) 1501 bestHeight := mp.cfg.BestHeight() 1502 1503 for _, desc := range mp.pool { 1504 // Calculate the current priority based on the inputs to 1505 // the transaction. Use zero if one or more of the 1506 // input transactions can't be found for some reason. 1507 tx := desc.Tx 1508 var currentPriority float64 1509 utxos, err := mp.fetchInputUtxos(tx) 1510 if err == nil { 1511 currentPriority = mining.CalcPriority(tx.MsgTx(), utxos, 1512 bestHeight+1) 1513 } 1514 1515 mpd := &btcjson.GetRawMempoolVerboseResult{ 1516 Size: int32(tx.MsgTx().SerializeSize()), 1517 Vsize: int32(GetTxVirtualSize(tx)), 1518 Weight: int32(blockchain.GetTransactionWeight(tx)), 1519 Fee: palcutil.Amount(desc.Fee).ToBTC(), 1520 Time: desc.Added.Unix(), 1521 Height: int64(desc.Height), 1522 StartingPriority: desc.StartingPriority, 1523 CurrentPriority: currentPriority, 1524 Depends: make([]string, 0), 1525 } 1526 for _, txIn := range tx.MsgTx().TxIn { 1527 hash := &txIn.PreviousOutPoint.Hash 1528 if mp.haveTransaction(hash) { 1529 mpd.Depends = append(mpd.Depends, 1530 hash.String()) 1531 } 1532 } 1533 1534 result[tx.Hash().String()] = mpd 1535 } 1536 1537 return result 1538 } 1539 1540 // LastUpdated returns the last time a transaction was added to or removed from 1541 // the main pool. It does not include the orphan pool. 1542 // 1543 // This function is safe for concurrent access. 1544 func (mp *TxPool) LastUpdated() time.Time { 1545 return time.Unix(atomic.LoadInt64(&mp.lastUpdated), 0) 1546 } 1547 1548 // New returns a new memory pool for validating and storing standalone 1549 // transactions until they are mined into a block. 1550 func New(cfg *Config) *TxPool { 1551 return &TxPool{ 1552 cfg: *cfg, 1553 pool: make(map[chainhash.Hash]*TxDesc), 1554 orphans: make(map[chainhash.Hash]*orphanTx), 1555 orphansByPrev: make(map[wire.OutPoint]map[chainhash.Hash]*palcutil.Tx), 1556 nextExpireScan: time.Now().Add(orphanExpireScanInterval), 1557 outpoints: make(map[wire.OutPoint]*palcutil.Tx), 1558 } 1559 }