github.com/BlockABC/godash@v0.0.0-20191112120524-f4aa3a32c566/server.go (about) 1 // Copyright (c) 2013-2016 The btcsuite developers 2 // Copyright (c) 2016 The Dash developers 3 // Use of this source code is governed by an ISC 4 // license that can be found in the LICENSE file. 5 6 package main 7 8 import ( 9 "bytes" 10 "crypto/rand" 11 "encoding/binary" 12 "errors" 13 "fmt" 14 "math" 15 mrand "math/rand" 16 "net" 17 "runtime" 18 "strconv" 19 "strings" 20 "sync" 21 "sync/atomic" 22 "time" 23 24 "github.com/BlockABC/godash/addrmgr" 25 "github.com/BlockABC/godash/blockchain" 26 "github.com/BlockABC/godash/blockchain/indexers" 27 "github.com/BlockABC/godash/chaincfg" 28 "github.com/BlockABC/godash/database" 29 "github.com/BlockABC/godash/mining" 30 "github.com/BlockABC/godash/peer" 31 "github.com/BlockABC/godash/txscript" 32 "github.com/BlockABC/godash/wire" 33 "github.com/BlockABC/godashutil" 34 "github.com/BlockABC/godashutil/bloom" 35 ) 36 37 const ( 38 // These constants are used by the DNS seed code to pick a random last 39 // seen time. 40 secondsIn3Days int32 = 24 * 60 * 60 * 3 41 secondsIn4Days int32 = 24 * 60 * 60 * 4 42 ) 43 44 const ( 45 // defaultServices describes the default services that are supported by 46 // the server. 47 defaultServices = wire.SFNodeNetwork | wire.SFNodeBloom 48 49 // defaultMaxOutbound is the default number of max outbound peers. 50 defaultMaxOutbound = 8 51 52 // connectionRetryInterval is the base amount of time to wait in between 53 // retries when connecting to persistent peers. It is adjusted by the 54 // number of retries such that there is a retry backoff. 55 connectionRetryInterval = time.Second * 5 56 57 // maxConnectionRetryInterval is the max amount of time retrying of a 58 // persistent peer is allowed to grow to. This is necessary since the 59 // retry logic uses a backoff mechanism which increases the interval 60 // base done the number of retries that have been done. 61 maxConnectionRetryInterval = time.Minute * 5 62 ) 63 64 var ( 65 // userAgentName is the user agent name and is used to help identify 66 // ourselves to other bitcoin peers. 67 userAgentName = "btcd" 68 69 // userAgentVersion is the user agent version and is used to help 70 // identify ourselves to other bitcoin peers. 71 userAgentVersion = fmt.Sprintf("%d.%d.%d", appMajor, appMinor, appPatch) 72 ) 73 74 // broadcastMsg provides the ability to house a bitcoin message to be broadcast 75 // to all connected peers except specified excluded peers. 76 type broadcastMsg struct { 77 message wire.Message 78 excludePeers []*serverPeer 79 } 80 81 // broadcastInventoryAdd is a type used to declare that the InvVect it contains 82 // needs to be added to the rebroadcast map 83 type broadcastInventoryAdd relayMsg 84 85 // broadcastInventoryDel is a type used to declare that the InvVect it contains 86 // needs to be removed from the rebroadcast map 87 type broadcastInventoryDel *wire.InvVect 88 89 // relayMsg packages an inventory vector along with the newly discovered 90 // inventory so the relay has access to that information. 91 type relayMsg struct { 92 invVect *wire.InvVect 93 data interface{} 94 } 95 96 // updatePeerHeightsMsg is a message sent from the blockmanager to the server 97 // after a new block has been accepted. The purpose of the message is to update 98 // the heights of peers that were known to announce the block before we 99 // connected it to the main chain or recognized it as an orphan. With these 100 // updates, peer heights will be kept up to date, allowing for fresh data when 101 // selecting sync peer candidacy. 102 type updatePeerHeightsMsg struct { 103 newSha *wire.ShaHash 104 newHeight int32 105 originPeer *serverPeer 106 } 107 108 // peerState maintains state of inbound, persistent, outbound peers as well 109 // as banned peers and outbound groups. 110 type peerState struct { 111 pendingPeers map[string]*serverPeer 112 inboundPeers map[int32]*serverPeer 113 outboundPeers map[int32]*serverPeer 114 persistentPeers map[int32]*serverPeer 115 banned map[string]time.Time 116 outboundGroups map[string]int 117 maxOutboundPeers int 118 } 119 120 // Count returns the count of all known peers. 121 func (ps *peerState) Count() int { 122 return len(ps.inboundPeers) + len(ps.outboundPeers) + 123 len(ps.persistentPeers) 124 } 125 126 // OutboundCount returns the count of known outbound peers. 127 func (ps *peerState) OutboundCount() int { 128 return len(ps.outboundPeers) + len(ps.persistentPeers) 129 } 130 131 // NeedMoreOutbound returns true if more outbound peers are required. 132 func (ps *peerState) NeedMoreOutbound() bool { 133 return ps.OutboundCount() < ps.maxOutboundPeers && 134 ps.Count() < cfg.MaxPeers 135 } 136 137 // NeedMoreTries returns true if more outbound peer attempts can be tried. 138 func (ps *peerState) NeedMoreTries() bool { 139 return len(ps.pendingPeers) < 2*(ps.maxOutboundPeers-ps.OutboundCount()) 140 } 141 142 // forAllOutboundPeers is a helper function that runs closure on all outbound 143 // peers known to peerState. 144 func (ps *peerState) forAllOutboundPeers(closure func(sp *serverPeer)) { 145 for _, e := range ps.outboundPeers { 146 closure(e) 147 } 148 for _, e := range ps.persistentPeers { 149 closure(e) 150 } 151 } 152 153 // forPendingPeers is a helper function that runs closure on all pending peers 154 // known to peerState. 155 func (ps *peerState) forPendingPeers(closure func(sp *serverPeer)) { 156 for _, e := range ps.pendingPeers { 157 closure(e) 158 } 159 } 160 161 // forAllPeers is a helper function that runs closure on all peers known to 162 // peerState. 163 func (ps *peerState) forAllPeers(closure func(sp *serverPeer)) { 164 for _, e := range ps.inboundPeers { 165 closure(e) 166 } 167 ps.forAllOutboundPeers(closure) 168 } 169 170 // server provides a bitcoin server for handling communications to and from 171 // bitcoin peers. 172 type server struct { 173 // The following variables must only be used atomically. 174 // Putting the uint64s first makes them 64-bit aligned for 32-bit systems. 175 bytesReceived uint64 // Total bytes received from all peers since start. 176 bytesSent uint64 // Total bytes sent by all peers since start. 177 started int32 178 shutdown int32 179 shutdownSched int32 180 181 listeners []net.Listener 182 chainParams *chaincfg.Params 183 addrManager *addrmgr.AddrManager 184 sigCache *txscript.SigCache 185 rpcServer *rpcServer 186 blockManager *blockManager 187 txMemPool *txMemPool 188 cpuMiner *CPUMiner 189 modifyRebroadcastInv chan interface{} 190 pendingPeers chan *serverPeer 191 newPeers chan *serverPeer 192 donePeers chan *serverPeer 193 banPeers chan *serverPeer 194 retryPeers chan *serverPeer 195 wakeup chan struct{} 196 query chan interface{} 197 relayInv chan relayMsg 198 broadcast chan broadcastMsg 199 peerHeightsUpdate chan updatePeerHeightsMsg 200 wg sync.WaitGroup 201 quit chan struct{} 202 nat NAT 203 db database.DB 204 timeSource blockchain.MedianTimeSource 205 services wire.ServiceFlag 206 207 // The following fields are used for optional indexes. They will be nil 208 // if the associated index is not enabled. These fields are set during 209 // initial creation of the server and never changed afterwards, so they 210 // do not need to be protected for concurrent access. 211 txIndex *indexers.TxIndex 212 addrIndex *indexers.AddrIndex 213 } 214 215 // serverPeer extends the peer to maintain state shared by the server and 216 // the blockmanager. 217 type serverPeer struct { 218 *peer.Peer 219 220 server *server 221 persistent bool 222 continueHash *wire.ShaHash 223 relayMtx sync.Mutex 224 disableRelayTx bool 225 requestQueue []*wire.InvVect 226 requestedTxns map[wire.ShaHash]struct{} 227 requestedBlocks map[wire.ShaHash]struct{} 228 filter *bloom.Filter 229 knownAddresses map[string]struct{} 230 banScore dynamicBanScore 231 quit chan struct{} 232 // The following chans are used to sync blockmanager and server. 233 txProcessed chan struct{} 234 blockProcessed chan struct{} 235 } 236 237 // newServerPeer returns a new serverPeer instance. The peer needs to be set by 238 // the caller. 239 func newServerPeer(s *server, isPersistent bool) *serverPeer { 240 return &serverPeer{ 241 server: s, 242 persistent: isPersistent, 243 requestedTxns: make(map[wire.ShaHash]struct{}), 244 requestedBlocks: make(map[wire.ShaHash]struct{}), 245 filter: bloom.LoadFilter(nil), 246 knownAddresses: make(map[string]struct{}), 247 quit: make(chan struct{}), 248 txProcessed: make(chan struct{}, 1), 249 blockProcessed: make(chan struct{}, 1), 250 } 251 } 252 253 // newestBlock returns the current best block hash and height using the format 254 // required by the configuration for the peer package. 255 func (sp *serverPeer) newestBlock() (*wire.ShaHash, int32, error) { 256 best := sp.server.blockManager.chain.BestSnapshot() 257 return best.Hash, best.Height, nil 258 } 259 260 // addKnownAddresses adds the given addresses to the set of known addreses to 261 // the peer to prevent sending duplicate addresses. 262 func (sp *serverPeer) addKnownAddresses(addresses []*wire.NetAddress) { 263 for _, na := range addresses { 264 sp.knownAddresses[addrmgr.NetAddressKey(na)] = struct{}{} 265 } 266 } 267 268 // addressKnown true if the given address is already known to the peer. 269 func (sp *serverPeer) addressKnown(na *wire.NetAddress) bool { 270 _, exists := sp.knownAddresses[addrmgr.NetAddressKey(na)] 271 return exists 272 } 273 274 // setDisableRelayTx toggles relaying of transactions for the given peer. 275 // It is safe for concurrent access. 276 func (sp *serverPeer) setDisableRelayTx(disable bool) { 277 sp.relayMtx.Lock() 278 sp.disableRelayTx = disable 279 sp.relayMtx.Unlock() 280 } 281 282 // relayTxDisabled returns whether or not relaying of transactions for the given 283 // peer is disabled. 284 // It is safe for concurrent access. 285 func (sp *serverPeer) relayTxDisabled() bool { 286 sp.relayMtx.Lock() 287 defer sp.relayMtx.Unlock() 288 289 return sp.disableRelayTx 290 } 291 292 // pushAddrMsg sends an addr message to the connected peer using the provided 293 // addresses. 294 func (sp *serverPeer) pushAddrMsg(addresses []*wire.NetAddress) { 295 // Filter addresses already known to the peer. 296 addrs := make([]*wire.NetAddress, 0, len(addresses)) 297 for _, addr := range addresses { 298 if !sp.addressKnown(addr) { 299 addrs = append(addrs, addr) 300 } 301 } 302 known, err := sp.PushAddrMsg(addrs) 303 if err != nil { 304 peerLog.Errorf("Can't push address message to %s: %v", sp.Peer, err) 305 sp.Disconnect() 306 return 307 } 308 sp.addKnownAddresses(known) 309 } 310 311 // addBanScore increases the persistent and decaying ban score fields by the 312 // values passed as parameters. If the resulting score exceeds half of the ban 313 // threshold, a warning is logged including the reason provided. Further, if 314 // the score is above the ban threshold, the peer will be banned and 315 // disconnected. 316 func (sp *serverPeer) addBanScore(persistent, transient uint32, reason string) { 317 // No warning is logged and no score is calculated if banning is disabled. 318 if cfg.DisableBanning { 319 return 320 } 321 warnThreshold := cfg.BanThreshold >> 1 322 if transient == 0 && persistent == 0 { 323 // The score is not being increased, but a warning message is still 324 // logged if the score is above the warn threshold. 325 score := sp.banScore.Int() 326 if score > warnThreshold { 327 peerLog.Warnf("Misbehaving peer %s: %s -- ban score is %d, "+ 328 "it was not increased this time", sp, reason, score) 329 } 330 return 331 } 332 score := sp.banScore.Increase(persistent, transient) 333 if score > warnThreshold { 334 peerLog.Warnf("Misbehaving peer %s: %s -- ban score increased to %d", 335 sp, reason, score) 336 if score > cfg.BanThreshold { 337 peerLog.Warnf("Misbehaving peer %s -- banning and disconnecting", 338 sp) 339 sp.server.BanPeer(sp) 340 sp.Disconnect() 341 } 342 } 343 } 344 345 // OnVersion is invoked when a peer receives a version bitcoin message 346 // and is used to negotiate the protocol version details as well as kick start 347 // the communications. 348 func (sp *serverPeer) OnVersion(p *peer.Peer, msg *wire.MsgVersion) { 349 // Add the remote peer time as a sample for creating an offset against 350 // the local clock to keep the network time in sync. 351 sp.server.timeSource.AddTimeSample(p.Addr(), msg.Timestamp) 352 353 // Signal the block manager this peer is a new sync candidate. 354 sp.server.blockManager.NewPeer(sp) 355 356 // Choose whether or not to relay transactions before a filter command 357 // is received. 358 sp.setDisableRelayTx(msg.DisableRelayTx) 359 360 // Update the address manager and request known addresses from the 361 // remote peer for outbound connections. This is skipped when running 362 // on the simulation test network since it is only intended to connect 363 // to specified peers and actively avoids advertising and connecting to 364 // discovered peers. 365 if !cfg.SimNet { 366 addrManager := sp.server.addrManager 367 // Outbound connections. 368 if !p.Inbound() { 369 // TODO(davec): Only do this if not doing the initial block 370 // download and the local address is routable. 371 if !cfg.DisableListen /* && isCurrent? */ { 372 // Get address that best matches. 373 lna := addrManager.GetBestLocalAddress(p.NA()) 374 if addrmgr.IsRoutable(lna) { 375 // Filter addresses the peer already knows about. 376 addresses := []*wire.NetAddress{lna} 377 sp.pushAddrMsg(addresses) 378 } 379 } 380 381 // Request known addresses if the server address manager needs 382 // more and the peer has a protocol version new enough to 383 // include a timestamp with addresses. 384 hasTimestamp := p.ProtocolVersion() >= 385 wire.NetAddressTimeVersion 386 if addrManager.NeedMoreAddresses() && hasTimestamp { 387 p.QueueMessage(wire.NewMsgGetAddr(), nil) 388 } 389 390 // Mark the address as a known good address. 391 addrManager.Good(p.NA()) 392 } else { 393 // A peer might not be advertising the same address that it 394 // actually connected from. One example of why this can happen 395 // is with NAT. Only add the address to the address manager if 396 // the addresses agree. 397 if addrmgr.NetAddressKey(&msg.AddrMe) == addrmgr.NetAddressKey(p.NA()) { 398 addrManager.AddAddress(p.NA(), p.NA()) 399 addrManager.Good(p.NA()) 400 } 401 } 402 } 403 404 // Add valid peer to the server. 405 sp.server.AddPeer(sp) 406 } 407 408 // OnMemPool is invoked when a peer receives a mempool bitcoin message. 409 // It creates and sends an inventory message with the contents of the memory 410 // pool up to the maximum inventory allowed per message. When the peer has a 411 // bloom filter loaded, the contents are filtered accordingly. 412 func (sp *serverPeer) OnMemPool(p *peer.Peer, msg *wire.MsgMemPool) { 413 // A decaying ban score increase is applied to prevent flooding. 414 // The ban score accumulates and passes the ban threshold if a burst of 415 // mempool messages comes from a peer. The score decays each minute to 416 // half of its value. 417 sp.addBanScore(0, 33, "mempool") 418 419 // Generate inventory message with the available transactions in the 420 // transaction memory pool. Limit it to the max allowed inventory 421 // per message. The NewMsgInvSizeHint function automatically limits 422 // the passed hint to the maximum allowed, so it's safe to pass it 423 // without double checking it here. 424 txMemPool := sp.server.txMemPool 425 txDescs := txMemPool.TxDescs() 426 invMsg := wire.NewMsgInvSizeHint(uint(len(txDescs))) 427 428 for i, txDesc := range txDescs { 429 // Another thread might have removed the transaction from the 430 // pool since the initial query. 431 hash := txDesc.Tx.Sha() 432 if !txMemPool.IsTransactionInPool(hash) { 433 continue 434 } 435 436 // Either add all transactions when there is no bloom filter, 437 // or only the transactions that match the filter when there is 438 // one. 439 if !sp.filter.IsLoaded() || sp.filter.MatchTxAndUpdate(txDesc.Tx) { 440 iv := wire.NewInvVect(wire.InvTypeTx, hash) 441 invMsg.AddInvVect(iv) 442 if i+1 >= wire.MaxInvPerMsg { 443 break 444 } 445 } 446 } 447 448 // Send the inventory message if there is anything to send. 449 if len(invMsg.InvList) > 0 { 450 p.QueueMessage(invMsg, nil) 451 } 452 } 453 454 // OnTx is invoked when a peer receives a tx bitcoin message. It blocks 455 // until the bitcoin transaction has been fully processed. Unlock the block 456 // handler this does not serialize all transactions through a single thread 457 // transactions don't rely on the previous one in a linear fashion like blocks. 458 func (sp *serverPeer) OnTx(p *peer.Peer, msg *wire.MsgTx) { 459 if cfg.BlocksOnly { 460 peerLog.Tracef("Ignoring tx %v from %v - blocksonly enabled", 461 msg.TxSha(), p) 462 return 463 } 464 465 // Add the transaction to the known inventory for the peer. 466 // Convert the raw MsgTx to a godashutil.Tx which provides some convenience 467 // methods and things such as hash caching. 468 tx := godashutil.NewTx(msg) 469 iv := wire.NewInvVect(wire.InvTypeTx, tx.Sha()) 470 p.AddKnownInventory(iv) 471 472 // Queue the transaction up to be handled by the block manager and 473 // intentionally block further receives until the transaction is fully 474 // processed and known good or bad. This helps prevent a malicious peer 475 // from queuing up a bunch of bad transactions before disconnecting (or 476 // being disconnected) and wasting memory. 477 sp.server.blockManager.QueueTx(tx, sp) 478 <-sp.txProcessed 479 } 480 481 // OnBlock is invoked when a peer receives a block bitcoin message. It 482 // blocks until the bitcoin block has been fully processed. 483 func (sp *serverPeer) OnBlock(p *peer.Peer, msg *wire.MsgBlock, buf []byte) { 484 // Convert the raw MsgBlock to a godashutil.Block which provides some 485 // convenience methods and things such as hash caching. 486 block := godashutil.NewBlockFromBlockAndBytes(msg, buf) 487 488 // Add the block to the known inventory for the peer. 489 iv := wire.NewInvVect(wire.InvTypeBlock, block.Sha()) 490 p.AddKnownInventory(iv) 491 492 // Queue the block up to be handled by the block 493 // manager and intentionally block further receives 494 // until the bitcoin block is fully processed and known 495 // good or bad. This helps prevent a malicious peer 496 // from queuing up a bunch of bad blocks before 497 // disconnecting (or being disconnected) and wasting 498 // memory. Additionally, this behavior is depended on 499 // by at least the block acceptance test tool as the 500 // reference implementation processes blocks in the same 501 // thread and therefore blocks further messages until 502 // the bitcoin block has been fully processed. 503 sp.server.blockManager.QueueBlock(block, sp) 504 <-sp.blockProcessed 505 } 506 507 // OnInv is invoked when a peer receives an inv bitcoin message and is 508 // used to examine the inventory being advertised by the remote peer and react 509 // accordingly. We pass the message down to blockmanager which will call 510 // QueueMessage with any appropriate responses. 511 func (sp *serverPeer) OnInv(p *peer.Peer, msg *wire.MsgInv) { 512 if !cfg.BlocksOnly { 513 if len(msg.InvList) > 0 { 514 sp.server.blockManager.QueueInv(msg, sp) 515 } 516 return 517 } 518 519 newInv := wire.NewMsgInvSizeHint(uint(len(msg.InvList))) 520 for _, invVect := range msg.InvList { 521 if invVect.Type == wire.InvTypeTx { 522 peerLog.Tracef("Ignoring tx %v in inv from %v -- "+ 523 "blocksonly enabled", invVect.Hash, p) 524 if p.ProtocolVersion() >= wire.BIP0037Version { 525 peerLog.Infof("Peer %v is announcing "+ 526 "transactions -- disconnecting", p) 527 p.Disconnect() 528 return 529 } 530 continue 531 } 532 err := newInv.AddInvVect(invVect) 533 if err != nil { 534 peerLog.Errorf("Failed to add inventory vector: %v", err) 535 break 536 } 537 } 538 539 if len(newInv.InvList) > 0 { 540 sp.server.blockManager.QueueInv(newInv, sp) 541 } 542 } 543 544 // OnHeaders is invoked when a peer receives a headers bitcoin 545 // message. The message is passed down to the block manager. 546 func (sp *serverPeer) OnHeaders(p *peer.Peer, msg *wire.MsgHeaders) { 547 sp.server.blockManager.QueueHeaders(msg, sp) 548 } 549 550 // handleGetData is invoked when a peer receives a getdata bitcoin message and 551 // is used to deliver block and transaction information. 552 func (sp *serverPeer) OnGetData(p *peer.Peer, msg *wire.MsgGetData) { 553 numAdded := 0 554 notFound := wire.NewMsgNotFound() 555 556 length := len(msg.InvList) 557 // A decaying ban score increase is applied to prevent exhausting resources 558 // with unusually large inventory queries. 559 // Requesting more than the maximum inventory vector length within a short 560 // period of time yields a score above the default ban threshold. Sustained 561 // bursts of small requests are not penalized as that would potentially ban 562 // peers performing IBD. 563 // This incremental score decays each minute to half of its value. 564 sp.addBanScore(0, uint32(length)*99/wire.MaxInvPerMsg, "getdata") 565 566 // We wait on this wait channel periodically to prevent queuing 567 // far more data than we can send in a reasonable time, wasting memory. 568 // The waiting occurs after the database fetch for the next one to 569 // provide a little pipelining. 570 var waitChan chan struct{} 571 doneChan := make(chan struct{}, 1) 572 573 for i, iv := range msg.InvList { 574 var c chan struct{} 575 // If this will be the last message we send. 576 if i == length-1 && len(notFound.InvList) == 0 { 577 c = doneChan 578 } else if (i+1)%3 == 0 { 579 // Buffered so as to not make the send goroutine block. 580 c = make(chan struct{}, 1) 581 } 582 var err error 583 switch iv.Type { 584 case wire.InvTypeTx: 585 err = sp.server.pushTxMsg(sp, &iv.Hash, c, waitChan) 586 case wire.InvTypeBlock: 587 err = sp.server.pushBlockMsg(sp, &iv.Hash, c, waitChan) 588 case wire.InvTypeFilteredBlock: 589 err = sp.server.pushMerkleBlockMsg(sp, &iv.Hash, c, waitChan) 590 default: 591 peerLog.Warnf("Unknown type in inventory request %d", 592 iv.Type) 593 continue 594 } 595 if err != nil { 596 notFound.AddInvVect(iv) 597 598 // When there is a failure fetching the final entry 599 // and the done channel was sent in due to there 600 // being no outstanding not found inventory, consume 601 // it here because there is now not found inventory 602 // that will use the channel momentarily. 603 if i == len(msg.InvList)-1 && c != nil { 604 <-c 605 } 606 } 607 numAdded++ 608 waitChan = c 609 } 610 if len(notFound.InvList) != 0 { 611 p.QueueMessage(notFound, doneChan) 612 } 613 614 // Wait for messages to be sent. We can send quite a lot of data at this 615 // point and this will keep the peer busy for a decent amount of time. 616 // We don't process anything else by them in this time so that we 617 // have an idea of when we should hear back from them - else the idle 618 // timeout could fire when we were only half done sending the blocks. 619 if numAdded > 0 { 620 <-doneChan 621 } 622 } 623 624 // OnGetBlocks is invoked when a peer receives a getblocks bitcoin 625 // message. 626 func (sp *serverPeer) OnGetBlocks(p *peer.Peer, msg *wire.MsgGetBlocks) { 627 // Return all block hashes to the latest one (up to max per message) if 628 // no stop hash was specified. 629 // Attempt to find the ending index of the stop hash if specified. 630 chain := sp.server.blockManager.chain 631 endIdx := int32(math.MaxInt32) 632 if !msg.HashStop.IsEqual(&zeroHash) { 633 height, err := chain.BlockHeightByHash(&msg.HashStop) 634 if err == nil { 635 endIdx = height + 1 636 } 637 } 638 639 // Find the most recent known block based on the block locator. 640 // Use the block after the genesis block if no other blocks in the 641 // provided locator are known. This does mean the client will start 642 // over with the genesis block if unknown block locators are provided. 643 // This mirrors the behavior in the reference implementation. 644 startIdx := int32(1) 645 for _, hash := range msg.BlockLocatorHashes { 646 height, err := chain.BlockHeightByHash(hash) 647 if err == nil { 648 // Start with the next hash since we know this one. 649 startIdx = height + 1 650 break 651 } 652 } 653 654 // Don't attempt to fetch more than we can put into a single message. 655 autoContinue := false 656 if endIdx-startIdx > wire.MaxBlocksPerMsg { 657 endIdx = startIdx + wire.MaxBlocksPerMsg 658 autoContinue = true 659 } 660 661 // Fetch the inventory from the block database. 662 hashList, err := chain.HeightRange(startIdx, endIdx) 663 if err != nil { 664 peerLog.Warnf("Block lookup failed: %v", err) 665 return 666 } 667 668 // Generate inventory message. 669 invMsg := wire.NewMsgInv() 670 for i := range hashList { 671 iv := wire.NewInvVect(wire.InvTypeBlock, &hashList[i]) 672 invMsg.AddInvVect(iv) 673 } 674 675 // Send the inventory message if there is anything to send. 676 if len(invMsg.InvList) > 0 { 677 invListLen := len(invMsg.InvList) 678 if autoContinue && invListLen == wire.MaxBlocksPerMsg { 679 // Intentionally use a copy of the final hash so there 680 // is not a reference into the inventory slice which 681 // would prevent the entire slice from being eligible 682 // for GC as soon as it's sent. 683 continueHash := invMsg.InvList[invListLen-1].Hash 684 sp.continueHash = &continueHash 685 } 686 p.QueueMessage(invMsg, nil) 687 } 688 } 689 690 // OnGetHeaders is invoked when a peer receives a getheaders bitcoin 691 // message. 692 func (sp *serverPeer) OnGetHeaders(p *peer.Peer, msg *wire.MsgGetHeaders) { 693 // Ignore getheaders requests if not in sync. 694 if !sp.server.blockManager.IsCurrent() { 695 return 696 } 697 698 // Attempt to look up the height of the provided stop hash. 699 chain := sp.server.blockManager.chain 700 endIdx := int32(math.MaxInt32) 701 height, err := chain.BlockHeightByHash(&msg.HashStop) 702 if err == nil { 703 endIdx = height + 1 704 } 705 706 // There are no block locators so a specific header is being requested 707 // as identified by the stop hash. 708 if len(msg.BlockLocatorHashes) == 0 { 709 // No blocks with the stop hash were found so there is nothing 710 // to do. Just return. This behavior mirrors the reference 711 // implementation. 712 if endIdx == math.MaxInt32 { 713 return 714 } 715 716 // Fetch the raw block header bytes from the database. 717 var headerBytes []byte 718 err := sp.server.db.View(func(dbTx database.Tx) error { 719 var err error 720 headerBytes, err = dbTx.FetchBlockHeader(&msg.HashStop) 721 return err 722 }) 723 if err != nil { 724 peerLog.Warnf("Lookup of known block hash failed: %v", 725 err) 726 return 727 } 728 729 // Deserialize the block header. 730 var header wire.BlockHeader 731 err = header.Deserialize(bytes.NewReader(headerBytes)) 732 if err != nil { 733 peerLog.Warnf("Block header deserialize failed: %v", 734 err) 735 return 736 } 737 738 headersMsg := wire.NewMsgHeaders() 739 headersMsg.AddBlockHeader(&header) 740 p.QueueMessage(headersMsg, nil) 741 return 742 } 743 744 // Find the most recent known block based on the block locator. 745 // Use the block after the genesis block if no other blocks in the 746 // provided locator are known. This does mean the client will start 747 // over with the genesis block if unknown block locators are provided. 748 // This mirrors the behavior in the reference implementation. 749 startIdx := int32(1) 750 for _, hash := range msg.BlockLocatorHashes { 751 height, err := chain.BlockHeightByHash(hash) 752 if err == nil { 753 // Start with the next hash since we know this one. 754 startIdx = height + 1 755 break 756 } 757 } 758 759 // Don't attempt to fetch more than we can put into a single message. 760 if endIdx-startIdx > wire.MaxBlockHeadersPerMsg { 761 endIdx = startIdx + wire.MaxBlockHeadersPerMsg 762 } 763 764 // Fetch the inventory from the block database. 765 hashList, err := chain.HeightRange(startIdx, endIdx) 766 if err != nil { 767 peerLog.Warnf("Header lookup failed: %v", err) 768 return 769 } 770 771 // Generate headers message and send it. 772 headersMsg := wire.NewMsgHeaders() 773 err = sp.server.db.View(func(dbTx database.Tx) error { 774 for i := range hashList { 775 headerBytes, err := dbTx.FetchBlockHeader(&hashList[i]) 776 if err != nil { 777 return err 778 } 779 780 var header wire.BlockHeader 781 err = header.Deserialize(bytes.NewReader(headerBytes)) 782 if err != nil { 783 return err 784 } 785 headersMsg.AddBlockHeader(&header) 786 } 787 788 return nil 789 }) 790 if err != nil { 791 peerLog.Warnf("Failed to build headers: %v", err) 792 return 793 } 794 795 p.QueueMessage(headersMsg, nil) 796 } 797 798 // OnFilterAdd is invoked when a peer receives a filteradd bitcoin 799 // message and is used by remote peers to add data to an already loaded bloom 800 // filter. The peer will be disconnected if a filter is not loaded when this 801 // message is received. 802 func (sp *serverPeer) OnFilterAdd(p *peer.Peer, msg *wire.MsgFilterAdd) { 803 if sp.filter.IsLoaded() { 804 peerLog.Debugf("%s sent a filteradd request with no filter "+ 805 "loaded -- disconnecting", p) 806 p.Disconnect() 807 return 808 } 809 810 sp.filter.Add(msg.Data) 811 } 812 813 // OnFilterClear is invoked when a peer receives a filterclear bitcoin 814 // message and is used by remote peers to clear an already loaded bloom filter. 815 // The peer will be disconnected if a filter is not loaded when this message is 816 // received. 817 func (sp *serverPeer) OnFilterClear(p *peer.Peer, msg *wire.MsgFilterClear) { 818 if !sp.filter.IsLoaded() { 819 peerLog.Debugf("%s sent a filterclear request with no "+ 820 "filter loaded -- disconnecting", p) 821 p.Disconnect() 822 return 823 } 824 825 sp.filter.Unload() 826 } 827 828 // OnFilterLoad is invoked when a peer receives a filterload bitcoin 829 // message and it used to load a bloom filter that should be used for 830 // delivering merkle blocks and associated transactions that match the filter. 831 func (sp *serverPeer) OnFilterLoad(p *peer.Peer, msg *wire.MsgFilterLoad) { 832 sp.setDisableRelayTx(false) 833 834 sp.filter.Reload(msg) 835 } 836 837 // OnGetAddr is invoked when a peer receives a getaddr bitcoin message 838 // and is used to provide the peer with known addresses from the address 839 // manager. 840 func (sp *serverPeer) OnGetAddr(p *peer.Peer, msg *wire.MsgGetAddr) { 841 // Don't return any addresses when running on the simulation test 842 // network. This helps prevent the network from becoming another 843 // public test network since it will not be able to learn about other 844 // peers that have not specifically been provided. 845 if cfg.SimNet { 846 return 847 } 848 849 // Do not accept getaddr requests from outbound peers. This reduces 850 // fingerprinting attacks. 851 if !p.Inbound() { 852 return 853 } 854 855 // Get the current known addresses from the address manager. 856 addrCache := sp.server.addrManager.AddressCache() 857 858 // Push the addresses. 859 sp.pushAddrMsg(addrCache) 860 } 861 862 // OnAddr is invoked when a peer receives an addr bitcoin message and is 863 // used to notify the server about advertised addresses. 864 func (sp *serverPeer) OnAddr(p *peer.Peer, msg *wire.MsgAddr) { 865 // Ignore addresses when running on the simulation test network. This 866 // helps prevent the network from becoming another public test network 867 // since it will not be able to learn about other peers that have not 868 // specifically been provided. 869 if cfg.SimNet { 870 return 871 } 872 873 // Ignore old style addresses which don't include a timestamp. 874 if p.ProtocolVersion() < wire.NetAddressTimeVersion { 875 return 876 } 877 878 // A message that has no addresses is invalid. 879 if len(msg.AddrList) == 0 { 880 peerLog.Errorf("Command [%s] from %s does not contain any addresses", 881 msg.Command(), p) 882 p.Disconnect() 883 return 884 } 885 886 for _, na := range msg.AddrList { 887 // Don't add more address if we're disconnecting. 888 if !p.Connected() { 889 return 890 } 891 892 // Set the timestamp to 5 days ago if it's more than 24 hours 893 // in the future so this address is one of the first to be 894 // removed when space is needed. 895 now := time.Now() 896 if na.Timestamp.After(now.Add(time.Minute * 10)) { 897 na.Timestamp = now.Add(-1 * time.Hour * 24 * 5) 898 } 899 900 // Add address to known addresses for this peer. 901 sp.addKnownAddresses([]*wire.NetAddress{na}) 902 } 903 904 // Add addresses to server address manager. The address manager handles 905 // the details of things such as preventing duplicate addresses, max 906 // addresses, and last seen updates. 907 // XXX bitcoind gives a 2 hour time penalty here, do we want to do the 908 // same? 909 sp.server.addrManager.AddAddresses(msg.AddrList, p.NA()) 910 } 911 912 // OnRead is invoked when a peer receives a message and it is used to update 913 // the bytes received by the server. 914 func (sp *serverPeer) OnRead(p *peer.Peer, bytesRead int, msg wire.Message, err error) { 915 sp.server.AddBytesReceived(uint64(bytesRead)) 916 } 917 918 // OnWrite is invoked when a peer sends a message and it is used to update 919 // the bytes sent by the server. 920 func (sp *serverPeer) OnWrite(p *peer.Peer, bytesWritten int, msg wire.Message, err error) { 921 sp.server.AddBytesSent(uint64(bytesWritten)) 922 } 923 924 // randomUint16Number returns a random uint16 in a specified input range. Note 925 // that the range is in zeroth ordering; if you pass it 1800, you will get 926 // values from 0 to 1800. 927 func randomUint16Number(max uint16) uint16 { 928 // In order to avoid modulo bias and ensure every possible outcome in 929 // [0, max) has equal probability, the random number must be sampled 930 // from a random source that has a range limited to a multiple of the 931 // modulus. 932 var randomNumber uint16 933 var limitRange = (math.MaxUint16 / max) * max 934 for { 935 binary.Read(rand.Reader, binary.LittleEndian, &randomNumber) 936 if randomNumber < limitRange { 937 return (randomNumber % max) 938 } 939 } 940 } 941 942 // AddRebroadcastInventory adds 'iv' to the list of inventories to be 943 // rebroadcasted at random intervals until they show up in a block. 944 func (s *server) AddRebroadcastInventory(iv *wire.InvVect, data interface{}) { 945 // Ignore if shutting down. 946 if atomic.LoadInt32(&s.shutdown) != 0 { 947 return 948 } 949 950 s.modifyRebroadcastInv <- broadcastInventoryAdd{invVect: iv, data: data} 951 } 952 953 // RemoveRebroadcastInventory removes 'iv' from the list of items to be 954 // rebroadcasted if present. 955 func (s *server) RemoveRebroadcastInventory(iv *wire.InvVect) { 956 // Ignore if shutting down. 957 if atomic.LoadInt32(&s.shutdown) != 0 { 958 return 959 } 960 961 s.modifyRebroadcastInv <- broadcastInventoryDel(iv) 962 } 963 964 // AnnounceNewTransactions generates and relays inventory vectors and notifies 965 // both websocket and getblocktemplate long poll clients of the passed 966 // transactions. This function should be called whenever new transactions 967 // are added to the mempool. 968 func (s *server) AnnounceNewTransactions(newTxs []*godashutil.Tx) { 969 // Generate and relay inventory vectors for all newly accepted 970 // transactions into the memory pool due to the original being 971 // accepted. 972 for _, tx := range newTxs { 973 // Generate the inventory vector and relay it. 974 iv := wire.NewInvVect(wire.InvTypeTx, tx.Sha()) 975 s.RelayInventory(iv, tx) 976 977 if s.rpcServer != nil { 978 // Notify websocket clients about mempool transactions. 979 s.rpcServer.ntfnMgr.NotifyMempoolTx(tx, true) 980 981 // Potentially notify any getblocktemplate long poll clients 982 // about stale block templates due to the new transaction. 983 s.rpcServer.gbtWorkState.NotifyMempoolTx( 984 s.txMemPool.LastUpdated()) 985 } 986 } 987 } 988 989 // pushTxMsg sends a tx message for the provided transaction hash to the 990 // connected peer. An error is returned if the transaction hash is not known. 991 func (s *server) pushTxMsg(sp *serverPeer, sha *wire.ShaHash, doneChan chan<- struct{}, waitChan <-chan struct{}) error { 992 // Attempt to fetch the requested transaction from the pool. A 993 // call could be made to check for existence first, but simply trying 994 // to fetch a missing transaction results in the same behavior. 995 tx, err := s.txMemPool.FetchTransaction(sha) 996 if err != nil { 997 peerLog.Tracef("Unable to fetch tx %v from transaction "+ 998 "pool: %v", sha, err) 999 1000 if doneChan != nil { 1001 doneChan <- struct{}{} 1002 } 1003 return err 1004 } 1005 1006 // Once we have fetched data wait for any previous operation to finish. 1007 if waitChan != nil { 1008 <-waitChan 1009 } 1010 1011 sp.QueueMessage(tx.MsgTx(), doneChan) 1012 1013 return nil 1014 } 1015 1016 // pushBlockMsg sends a block message for the provided block hash to the 1017 // connected peer. An error is returned if the block hash is not known. 1018 func (s *server) pushBlockMsg(sp *serverPeer, hash *wire.ShaHash, doneChan chan<- struct{}, waitChan <-chan struct{}) error { 1019 // Fetch the raw block bytes from the database. 1020 var blockBytes []byte 1021 err := sp.server.db.View(func(dbTx database.Tx) error { 1022 var err error 1023 blockBytes, err = dbTx.FetchBlock(hash) 1024 return err 1025 }) 1026 if err != nil { 1027 peerLog.Tracef("Unable to fetch requested block hash %v: %v", 1028 hash, err) 1029 1030 if doneChan != nil { 1031 doneChan <- struct{}{} 1032 } 1033 return err 1034 } 1035 1036 // Deserialize the block. 1037 var msgBlock wire.MsgBlock 1038 err = msgBlock.Deserialize(bytes.NewReader(blockBytes)) 1039 if err != nil { 1040 peerLog.Tracef("Unable to deserialize requested block hash "+ 1041 "%v: %v", hash, err) 1042 1043 if doneChan != nil { 1044 doneChan <- struct{}{} 1045 } 1046 return err 1047 } 1048 1049 // Once we have fetched data wait for any previous operation to finish. 1050 if waitChan != nil { 1051 <-waitChan 1052 } 1053 1054 // We only send the channel for this message if we aren't sending 1055 // an inv straight after. 1056 var dc chan<- struct{} 1057 continueHash := sp.continueHash 1058 sendInv := continueHash != nil && continueHash.IsEqual(hash) 1059 if !sendInv { 1060 dc = doneChan 1061 } 1062 sp.QueueMessage(&msgBlock, dc) 1063 1064 // When the peer requests the final block that was advertised in 1065 // response to a getblocks message which requested more blocks than 1066 // would fit into a single message, send it a new inventory message 1067 // to trigger it to issue another getblocks message for the next 1068 // batch of inventory. 1069 if sendInv { 1070 best := sp.server.blockManager.chain.BestSnapshot() 1071 invMsg := wire.NewMsgInvSizeHint(1) 1072 iv := wire.NewInvVect(wire.InvTypeBlock, best.Hash) 1073 invMsg.AddInvVect(iv) 1074 sp.QueueMessage(invMsg, doneChan) 1075 sp.continueHash = nil 1076 } 1077 return nil 1078 } 1079 1080 // pushMerkleBlockMsg sends a merkleblock message for the provided block hash to 1081 // the connected peer. Since a merkle block requires the peer to have a filter 1082 // loaded, this call will simply be ignored if there is no filter loaded. An 1083 // error is returned if the block hash is not known. 1084 func (s *server) pushMerkleBlockMsg(sp *serverPeer, hash *wire.ShaHash, doneChan chan<- struct{}, waitChan <-chan struct{}) error { 1085 // Do not send a response if the peer doesn't have a filter loaded. 1086 if !sp.filter.IsLoaded() { 1087 if doneChan != nil { 1088 doneChan <- struct{}{} 1089 } 1090 return nil 1091 } 1092 1093 // Fetch the raw block bytes from the database. 1094 blk, err := sp.server.blockManager.chain.BlockByHash(hash) 1095 if err != nil { 1096 peerLog.Tracef("Unable to fetch requested block hash %v: %v", 1097 hash, err) 1098 1099 if doneChan != nil { 1100 doneChan <- struct{}{} 1101 } 1102 return err 1103 } 1104 1105 // Generate a merkle block by filtering the requested block according 1106 // to the filter for the peer. 1107 merkle, matchedTxIndices := bloom.NewMerkleBlock(blk, sp.filter) 1108 1109 // Once we have fetched data wait for any previous operation to finish. 1110 if waitChan != nil { 1111 <-waitChan 1112 } 1113 1114 // Send the merkleblock. Only send the done channel with this message 1115 // if no transactions will be sent afterwards. 1116 var dc chan<- struct{} 1117 if len(matchedTxIndices) == 0 { 1118 dc = doneChan 1119 } 1120 sp.QueueMessage(merkle, dc) 1121 1122 // Finally, send any matched transactions. 1123 blkTransactions := blk.MsgBlock().Transactions 1124 for i, txIndex := range matchedTxIndices { 1125 // Only send the done channel on the final transaction. 1126 var dc chan<- struct{} 1127 if i == len(matchedTxIndices)-1 { 1128 dc = doneChan 1129 } 1130 if txIndex < uint32(len(blkTransactions)) { 1131 sp.QueueMessage(blkTransactions[txIndex], dc) 1132 } 1133 } 1134 1135 return nil 1136 } 1137 1138 // handleUpdatePeerHeight updates the heights of all peers who were known to 1139 // announce a block we recently accepted. 1140 func (s *server) handleUpdatePeerHeights(state *peerState, umsg updatePeerHeightsMsg) { 1141 state.forAllPeers(func(sp *serverPeer) { 1142 // The origin peer should already have the updated height. 1143 if sp == umsg.originPeer { 1144 return 1145 } 1146 1147 // This is a pointer to the underlying memory which doesn't 1148 // change. 1149 latestBlkSha := sp.LastAnnouncedBlock() 1150 1151 // Skip this peer if it hasn't recently announced any new blocks. 1152 if latestBlkSha == nil { 1153 return 1154 } 1155 1156 // If the peer has recently announced a block, and this block 1157 // matches our newly accepted block, then update their block 1158 // height. 1159 if *latestBlkSha == *umsg.newSha { 1160 sp.UpdateLastBlockHeight(umsg.newHeight) 1161 sp.UpdateLastAnnouncedBlock(nil) 1162 } 1163 }) 1164 } 1165 1166 // handleAddPeerMsg deals with adding new peers. It is invoked from the 1167 // peerHandler goroutine. 1168 func (s *server) handleAddPeerMsg(state *peerState, sp *serverPeer) bool { 1169 if sp == nil { 1170 return false 1171 } 1172 1173 // Ignore new peers if we're shutting down. 1174 if atomic.LoadInt32(&s.shutdown) != 0 { 1175 srvrLog.Infof("New peer %s ignored - server is shutting down", sp) 1176 sp.Disconnect() 1177 return false 1178 } 1179 1180 // Disconnect banned peers. 1181 host, _, err := net.SplitHostPort(sp.Addr()) 1182 if err != nil { 1183 srvrLog.Debugf("can't split hostport %v", err) 1184 sp.Disconnect() 1185 return false 1186 } 1187 if banEnd, ok := state.banned[host]; ok { 1188 if time.Now().Before(banEnd) { 1189 srvrLog.Debugf("Peer %s is banned for another %v - disconnecting", 1190 host, banEnd.Sub(time.Now())) 1191 sp.Disconnect() 1192 return false 1193 } 1194 1195 srvrLog.Infof("Peer %s is no longer banned", host) 1196 delete(state.banned, host) 1197 } 1198 1199 // TODO: Check for max peers from a single IP. 1200 1201 // Limit max outbound peers. 1202 if _, ok := state.pendingPeers[sp.Addr()]; ok { 1203 if state.OutboundCount() >= state.maxOutboundPeers { 1204 srvrLog.Infof("Max outbound peers reached [%d] - disconnecting "+ 1205 "peer %s", state.maxOutboundPeers, sp) 1206 sp.Disconnect() 1207 return false 1208 } 1209 } 1210 1211 // Limit max number of total peers. 1212 if state.Count() >= cfg.MaxPeers { 1213 srvrLog.Infof("Max peers reached [%d] - disconnecting peer %s", 1214 cfg.MaxPeers, sp) 1215 sp.Disconnect() 1216 // TODO(oga) how to handle permanent peers here? 1217 // they should be rescheduled. 1218 return false 1219 } 1220 1221 // Add the new peer and start it. 1222 srvrLog.Debugf("New peer %s", sp) 1223 if sp.Inbound() { 1224 state.inboundPeers[sp.ID()] = sp 1225 } else { 1226 state.outboundGroups[addrmgr.GroupKey(sp.NA())]++ 1227 if sp.persistent { 1228 state.persistentPeers[sp.ID()] = sp 1229 } else { 1230 state.outboundPeers[sp.ID()] = sp 1231 } 1232 // Remove from pending peers. 1233 delete(state.pendingPeers, sp.Addr()) 1234 } 1235 1236 return true 1237 } 1238 1239 // handleDonePeerMsg deals with peers that have signalled they are done. It is 1240 // invoked from the peerHandler goroutine. 1241 func (s *server) handleDonePeerMsg(state *peerState, sp *serverPeer) { 1242 if _, ok := state.pendingPeers[sp.Addr()]; ok { 1243 delete(state.pendingPeers, sp.Addr()) 1244 srvrLog.Debugf("Removed pending peer %s", sp) 1245 return 1246 } 1247 1248 var list map[int32]*serverPeer 1249 if sp.persistent { 1250 list = state.persistentPeers 1251 } else if sp.Inbound() { 1252 list = state.inboundPeers 1253 } else { 1254 list = state.outboundPeers 1255 } 1256 if _, ok := list[sp.ID()]; ok { 1257 // Issue an asynchronous reconnect if the peer was a 1258 // persistent outbound connection. 1259 if !sp.Inbound() && sp.persistent && atomic.LoadInt32(&s.shutdown) == 0 { 1260 // Retry peer 1261 sp2 := s.newOutboundPeer(sp.Addr(), sp.persistent) 1262 if sp2 != nil { 1263 go s.retryConn(sp2, false) 1264 } 1265 } 1266 if !sp.Inbound() && sp.VersionKnown() { 1267 state.outboundGroups[addrmgr.GroupKey(sp.NA())]-- 1268 } 1269 delete(list, sp.ID()) 1270 srvrLog.Debugf("Removed peer %s", sp) 1271 return 1272 } 1273 1274 // Update the address' last seen time if the peer has acknowledged 1275 // our version and has sent us its version as well. 1276 if sp.VerAckReceived() && sp.VersionKnown() && sp.NA() != nil { 1277 s.addrManager.Connected(sp.NA()) 1278 } 1279 1280 // If we get here it means that either we didn't know about the peer 1281 // or we purposefully deleted it. 1282 } 1283 1284 // handleBanPeerMsg deals with banning peers. It is invoked from the 1285 // peerHandler goroutine. 1286 func (s *server) handleBanPeerMsg(state *peerState, sp *serverPeer) { 1287 host, _, err := net.SplitHostPort(sp.Addr()) 1288 if err != nil { 1289 srvrLog.Debugf("can't split ban peer %s %v", sp.Addr(), err) 1290 return 1291 } 1292 direction := directionString(sp.Inbound()) 1293 srvrLog.Infof("Banned peer %s (%s) for %v", host, direction, 1294 cfg.BanDuration) 1295 state.banned[host] = time.Now().Add(cfg.BanDuration) 1296 } 1297 1298 // handleRelayInvMsg deals with relaying inventory to peers that are not already 1299 // known to have it. It is invoked from the peerHandler goroutine. 1300 func (s *server) handleRelayInvMsg(state *peerState, msg relayMsg) { 1301 state.forAllPeers(func(sp *serverPeer) { 1302 if !sp.Connected() { 1303 return 1304 } 1305 1306 // If the inventory is a block and the peer prefers headers, 1307 // generate and send a headers message instead of an inventory 1308 // message. 1309 if msg.invVect.Type == wire.InvTypeBlock && sp.WantsHeaders() { 1310 blockHeader, ok := msg.data.(wire.BlockHeader) 1311 if !ok { 1312 peerLog.Warnf("Underlying data for headers" + 1313 " is not a block header") 1314 return 1315 } 1316 msgHeaders := wire.NewMsgHeaders() 1317 if err := msgHeaders.AddBlockHeader(&blockHeader); err != nil { 1318 peerLog.Errorf("Failed to add block"+ 1319 " header: %v", err) 1320 return 1321 } 1322 sp.QueueMessage(msgHeaders, nil) 1323 return 1324 } 1325 1326 if msg.invVect.Type == wire.InvTypeTx { 1327 // Don't relay the transaction to the peer when it has 1328 // transaction relaying disabled. 1329 if sp.relayTxDisabled() { 1330 return 1331 } 1332 // Don't relay the transaction if there is a bloom 1333 // filter loaded and the transaction doesn't match it. 1334 if sp.filter.IsLoaded() { 1335 tx, ok := msg.data.(*godashutil.Tx) 1336 if !ok { 1337 peerLog.Warnf("Underlying data for tx" + 1338 " inv relay is not a transaction") 1339 return 1340 } 1341 1342 if !sp.filter.MatchTxAndUpdate(tx) { 1343 return 1344 } 1345 } 1346 } 1347 1348 // Queue the inventory to be relayed with the next batch. 1349 // It will be ignored if the peer is already known to 1350 // have the inventory. 1351 sp.QueueInventory(msg.invVect) 1352 }) 1353 } 1354 1355 // handleBroadcastMsg deals with broadcasting messages to peers. It is invoked 1356 // from the peerHandler goroutine. 1357 func (s *server) handleBroadcastMsg(state *peerState, bmsg *broadcastMsg) { 1358 state.forAllPeers(func(sp *serverPeer) { 1359 if !sp.Connected() { 1360 return 1361 } 1362 1363 for _, ep := range bmsg.excludePeers { 1364 if sp == ep { 1365 return 1366 } 1367 } 1368 1369 sp.QueueMessage(bmsg.message, nil) 1370 }) 1371 } 1372 1373 type getConnCountMsg struct { 1374 reply chan int32 1375 } 1376 1377 type getPeersMsg struct { 1378 reply chan []*serverPeer 1379 } 1380 1381 type getAddedNodesMsg struct { 1382 reply chan []*serverPeer 1383 } 1384 1385 type disconnectNodeMsg struct { 1386 cmp func(*serverPeer) bool 1387 reply chan error 1388 } 1389 1390 type connectNodeMsg struct { 1391 addr string 1392 permanent bool 1393 reply chan error 1394 } 1395 1396 type removeNodeMsg struct { 1397 cmp func(*serverPeer) bool 1398 reply chan error 1399 } 1400 1401 // handleQuery is the central handler for all queries and commands from other 1402 // goroutines related to peer state. 1403 func (s *server) handleQuery(state *peerState, querymsg interface{}) { 1404 switch msg := querymsg.(type) { 1405 case getConnCountMsg: 1406 nconnected := int32(0) 1407 state.forAllPeers(func(sp *serverPeer) { 1408 if sp.Connected() { 1409 nconnected++ 1410 } 1411 }) 1412 msg.reply <- nconnected 1413 1414 case getPeersMsg: 1415 peers := make([]*serverPeer, 0, state.Count()) 1416 state.forAllPeers(func(sp *serverPeer) { 1417 if !sp.Connected() { 1418 return 1419 } 1420 peers = append(peers, sp) 1421 }) 1422 msg.reply <- peers 1423 1424 case connectNodeMsg: 1425 // XXX(oga) duplicate oneshots? 1426 for _, peer := range state.persistentPeers { 1427 if peer.Addr() == msg.addr { 1428 if msg.permanent { 1429 msg.reply <- errors.New("peer already connected") 1430 } else { 1431 msg.reply <- errors.New("peer exists as a permanent peer") 1432 } 1433 return 1434 } 1435 } 1436 1437 // TODO(oga) if too many, nuke a non-perm peer. 1438 sp := s.newOutboundPeer(msg.addr, msg.permanent) 1439 if sp != nil { 1440 go s.peerConnHandler(sp) 1441 msg.reply <- nil 1442 } else { 1443 msg.reply <- errors.New("failed to add peer") 1444 } 1445 case removeNodeMsg: 1446 found := disconnectPeer(state.persistentPeers, msg.cmp, func(sp *serverPeer) { 1447 // Keep group counts ok since we remove from 1448 // the list now. 1449 state.outboundGroups[addrmgr.GroupKey(sp.NA())]-- 1450 }) 1451 1452 if found { 1453 msg.reply <- nil 1454 } else { 1455 msg.reply <- errors.New("peer not found") 1456 } 1457 // Request a list of the persistent (added) peers. 1458 case getAddedNodesMsg: 1459 // Respond with a slice of the relavent peers. 1460 peers := make([]*serverPeer, 0, len(state.persistentPeers)) 1461 for _, sp := range state.persistentPeers { 1462 peers = append(peers, sp) 1463 } 1464 msg.reply <- peers 1465 case disconnectNodeMsg: 1466 // Check inbound peers. We pass a nil callback since we don't 1467 // require any additional actions on disconnect for inbound peers. 1468 found := disconnectPeer(state.inboundPeers, msg.cmp, nil) 1469 if found { 1470 msg.reply <- nil 1471 return 1472 } 1473 1474 // Check outbound peers. 1475 found = disconnectPeer(state.outboundPeers, msg.cmp, func(sp *serverPeer) { 1476 // Keep group counts ok since we remove from 1477 // the list now. 1478 state.outboundGroups[addrmgr.GroupKey(sp.NA())]-- 1479 }) 1480 if found { 1481 // If there are multiple outbound connections to the same 1482 // ip:port, continue disconnecting them all until no such 1483 // peers are found. 1484 for found { 1485 found = disconnectPeer(state.outboundPeers, msg.cmp, func(sp *serverPeer) { 1486 state.outboundGroups[addrmgr.GroupKey(sp.NA())]-- 1487 }) 1488 } 1489 msg.reply <- nil 1490 return 1491 } 1492 1493 msg.reply <- errors.New("peer not found") 1494 } 1495 } 1496 1497 // disconnectPeer attempts to drop the connection of a tageted peer in the 1498 // passed peer list. Targets are identified via usage of the passed 1499 // `compareFunc`, which should return `true` if the passed peer is the target 1500 // peer. This function returns true on success and false if the peer is unable 1501 // to be located. If the peer is found, and the passed callback: `whenFound' 1502 // isn't nil, we call it with the peer as the argument before it is removed 1503 // from the peerList, and is disconnected from the server. 1504 func disconnectPeer(peerList map[int32]*serverPeer, compareFunc func(*serverPeer) bool, whenFound func(*serverPeer)) bool { 1505 for addr, peer := range peerList { 1506 if compareFunc(peer) { 1507 if whenFound != nil { 1508 whenFound(peer) 1509 } 1510 1511 // This is ok because we are not continuing 1512 // to iterate so won't corrupt the loop. 1513 delete(peerList, addr) 1514 peer.Disconnect() 1515 return true 1516 } 1517 } 1518 return false 1519 } 1520 1521 // newPeerConfig returns the configuration for the given serverPeer. 1522 func newPeerConfig(sp *serverPeer) *peer.Config { 1523 return &peer.Config{ 1524 Listeners: peer.MessageListeners{ 1525 OnVersion: sp.OnVersion, 1526 OnMemPool: sp.OnMemPool, 1527 OnTx: sp.OnTx, 1528 OnBlock: sp.OnBlock, 1529 OnInv: sp.OnInv, 1530 OnHeaders: sp.OnHeaders, 1531 OnGetData: sp.OnGetData, 1532 OnGetBlocks: sp.OnGetBlocks, 1533 OnGetHeaders: sp.OnGetHeaders, 1534 OnFilterAdd: sp.OnFilterAdd, 1535 OnFilterClear: sp.OnFilterClear, 1536 OnFilterLoad: sp.OnFilterLoad, 1537 OnGetAddr: sp.OnGetAddr, 1538 OnAddr: sp.OnAddr, 1539 OnRead: sp.OnRead, 1540 OnWrite: sp.OnWrite, 1541 1542 // Note: The reference client currently bans peers that send alerts 1543 // not signed with its key. We could verify against their key, but 1544 // since the reference client is currently unwilling to support 1545 // other implementations' alert messages, we will not relay theirs. 1546 OnAlert: nil, 1547 }, 1548 NewestBlock: sp.newestBlock, 1549 BestLocalAddress: sp.server.addrManager.GetBestLocalAddress, 1550 HostToNetAddress: sp.server.addrManager.HostToNetAddress, 1551 Proxy: cfg.Proxy, 1552 UserAgentName: userAgentName, 1553 UserAgentVersion: userAgentVersion, 1554 ChainParams: sp.server.chainParams, 1555 Services: sp.server.services, 1556 DisableRelayTx: cfg.BlocksOnly, 1557 ProtocolVersion: wire.SendHeadersVersion, 1558 } 1559 } 1560 1561 // listenHandler is the main listener which accepts incoming connections for the 1562 // server. It must be run as a goroutine. 1563 func (s *server) listenHandler(listener net.Listener) { 1564 srvrLog.Infof("Server listening on %s", listener.Addr()) 1565 for atomic.LoadInt32(&s.shutdown) == 0 { 1566 conn, err := listener.Accept() 1567 if err != nil { 1568 // Only log the error if we're not forcibly shutting down. 1569 if atomic.LoadInt32(&s.shutdown) == 0 { 1570 srvrLog.Errorf("Can't accept connection: %v", err) 1571 } 1572 continue 1573 } 1574 sp := newServerPeer(s, false) 1575 sp.Peer = peer.NewInboundPeer(newPeerConfig(sp)) 1576 go s.peerDoneHandler(sp) 1577 sp.Connect(conn) 1578 } 1579 s.wg.Done() 1580 srvrLog.Tracef("Listener handler done for %s", listener.Addr()) 1581 } 1582 1583 // seedFromDNS uses DNS seeding to populate the address manager with peers. 1584 func (s *server) seedFromDNS() { 1585 // Nothing to do if DNS seeding is disabled. 1586 if cfg.DisableDNSSeed { 1587 return 1588 } 1589 1590 for _, seeder := range activeNetParams.DNSSeeds { 1591 go func(seeder string) { 1592 randSource := mrand.New(mrand.NewSource(time.Now().UnixNano())) 1593 1594 seedpeers, err := dnsDiscover(seeder) 1595 if err != nil { 1596 discLog.Infof("DNS discovery failed on seed %s: %v", seeder, err) 1597 return 1598 } 1599 numPeers := len(seedpeers) 1600 1601 discLog.Infof("%d addresses found from DNS seed %s", numPeers, seeder) 1602 1603 if numPeers == 0 { 1604 return 1605 } 1606 addresses := make([]*wire.NetAddress, len(seedpeers)) 1607 // if this errors then we have *real* problems 1608 intPort, _ := strconv.Atoi(activeNetParams.DefaultPort) 1609 for i, peer := range seedpeers { 1610 addresses[i] = new(wire.NetAddress) 1611 addresses[i].SetAddress(peer, uint16(intPort)) 1612 // bitcoind seeds with addresses from 1613 // a time randomly selected between 3 1614 // and 7 days ago. 1615 addresses[i].Timestamp = time.Now().Add(-1 * 1616 time.Second * time.Duration(secondsIn3Days+ 1617 randSource.Int31n(secondsIn4Days))) 1618 } 1619 1620 // Bitcoind uses a lookup of the dns seeder here. This 1621 // is rather strange since the values looked up by the 1622 // DNS seed lookups will vary quite a lot. 1623 // to replicate this behaviour we put all addresses as 1624 // having come from the first one. 1625 s.addrManager.AddAddresses(addresses, addresses[0]) 1626 }(seeder) 1627 } 1628 } 1629 1630 // newOutboundPeer initializes a new outbound peer and setups the message 1631 // listeners. 1632 func (s *server) newOutboundPeer(addr string, persistent bool) *serverPeer { 1633 sp := newServerPeer(s, persistent) 1634 p, err := peer.NewOutboundPeer(newPeerConfig(sp), addr) 1635 if err != nil { 1636 srvrLog.Errorf("Cannot create outbound peer %s: %v", addr, err) 1637 return nil 1638 } 1639 sp.Peer = p 1640 go s.peerDoneHandler(sp) 1641 return sp 1642 } 1643 1644 // peerConnHandler handles peer connections. It must be run in a goroutine. 1645 func (s *server) peerConnHandler(sp *serverPeer) { 1646 err := s.establishConn(sp) 1647 if err != nil { 1648 srvrLog.Debugf("Failed to connect to %s: %v", sp.Addr(), err) 1649 sp.Disconnect() 1650 } 1651 } 1652 1653 // peerDoneHandler handles peer disconnects by notifiying the server that it's 1654 // done. 1655 func (s *server) peerDoneHandler(sp *serverPeer) { 1656 sp.WaitForDisconnect() 1657 s.donePeers <- sp 1658 1659 // Only tell block manager we are gone if we ever told it we existed. 1660 if sp.VersionKnown() { 1661 s.blockManager.DonePeer(sp) 1662 } 1663 close(sp.quit) 1664 } 1665 1666 // establishConn establishes a connection to the peer. 1667 func (s *server) establishConn(sp *serverPeer) error { 1668 srvrLog.Debugf("Attempting to connect to %s", sp.Addr()) 1669 conn, err := btcdDial("tcp", sp.Addr()) 1670 if err != nil { 1671 return err 1672 } 1673 sp.Connect(conn) 1674 s.addrManager.Attempt(sp.NA()) 1675 return nil 1676 } 1677 1678 // retryConn retries connection to the peer after the given duration. It must 1679 // be run as a goroutine. 1680 func (s *server) retryConn(sp *serverPeer, initialAttempt bool) { 1681 retryDuration := connectionRetryInterval 1682 for { 1683 if initialAttempt { 1684 retryDuration = 0 1685 initialAttempt = false 1686 } else { 1687 srvrLog.Debugf("Retrying connection to %s in %s", sp.Addr(), 1688 retryDuration) 1689 } 1690 select { 1691 case <-time.After(retryDuration): 1692 err := s.establishConn(sp) 1693 if err != nil { 1694 retryDuration += connectionRetryInterval 1695 if retryDuration > maxConnectionRetryInterval { 1696 retryDuration = maxConnectionRetryInterval 1697 } 1698 continue 1699 } 1700 return 1701 1702 case <-sp.quit: 1703 return 1704 1705 case <-s.quit: 1706 return 1707 } 1708 } 1709 } 1710 1711 // peerHandler is used to handle peer operations such as adding and removing 1712 // peers to and from the server, banning peers, and broadcasting messages to 1713 // peers. It must be run in a goroutine. 1714 func (s *server) peerHandler() { 1715 // Start the address manager and block manager, both of which are needed 1716 // by peers. This is done here since their lifecycle is closely tied 1717 // to this handler and rather than adding more channels to sychronize 1718 // things, it's easier and slightly faster to simply start and stop them 1719 // in this handler. 1720 s.addrManager.Start() 1721 s.blockManager.Start() 1722 1723 srvrLog.Tracef("Starting peer handler") 1724 1725 state := &peerState{ 1726 pendingPeers: make(map[string]*serverPeer), 1727 inboundPeers: make(map[int32]*serverPeer), 1728 persistentPeers: make(map[int32]*serverPeer), 1729 outboundPeers: make(map[int32]*serverPeer), 1730 banned: make(map[string]time.Time), 1731 maxOutboundPeers: defaultMaxOutbound, 1732 outboundGroups: make(map[string]int), 1733 } 1734 if cfg.MaxPeers < state.maxOutboundPeers { 1735 state.maxOutboundPeers = cfg.MaxPeers 1736 } 1737 // Add peers discovered through DNS to the address manager. 1738 s.seedFromDNS() 1739 1740 // Start up persistent peers. 1741 permanentPeers := cfg.ConnectPeers 1742 if len(permanentPeers) == 0 { 1743 permanentPeers = cfg.AddPeers 1744 } 1745 for _, addr := range permanentPeers { 1746 sp := s.newOutboundPeer(addr, true) 1747 if sp != nil { 1748 go s.retryConn(sp, true) 1749 } 1750 } 1751 1752 // if nothing else happens, wake us up soon. 1753 time.AfterFunc(10*time.Second, func() { s.wakeup <- struct{}{} }) 1754 1755 out: 1756 for { 1757 select { 1758 // New peers connected to the server. 1759 case p := <-s.newPeers: 1760 s.handleAddPeerMsg(state, p) 1761 1762 // Disconnected peers. 1763 case p := <-s.donePeers: 1764 s.handleDonePeerMsg(state, p) 1765 1766 // Block accepted in mainchain or orphan, update peer height. 1767 case umsg := <-s.peerHeightsUpdate: 1768 s.handleUpdatePeerHeights(state, umsg) 1769 1770 // Peer to ban. 1771 case p := <-s.banPeers: 1772 s.handleBanPeerMsg(state, p) 1773 1774 // New inventory to potentially be relayed to other peers. 1775 case invMsg := <-s.relayInv: 1776 s.handleRelayInvMsg(state, invMsg) 1777 1778 // Message to broadcast to all connected peers except those 1779 // which are excluded by the message. 1780 case bmsg := <-s.broadcast: 1781 s.handleBroadcastMsg(state, &bmsg) 1782 1783 // Used by timers below to wake us back up. 1784 case <-s.wakeup: 1785 // this page left intentionally blank 1786 1787 case qmsg := <-s.query: 1788 s.handleQuery(state, qmsg) 1789 1790 case <-s.quit: 1791 // Disconnect all peers on server shutdown. 1792 state.forAllPeers(func(sp *serverPeer) { 1793 srvrLog.Tracef("Shutdown peer %s", sp) 1794 sp.Disconnect() 1795 }) 1796 break out 1797 } 1798 1799 // Don't try to connect to more peers when running on the 1800 // simulation test network. The simulation network is only 1801 // intended to connect to specified peers and actively avoid 1802 // advertising and connecting to discovered peers. 1803 if cfg.SimNet { 1804 continue 1805 } 1806 1807 // Only try connect to more peers if we actually need more. 1808 if !state.NeedMoreOutbound() || len(cfg.ConnectPeers) > 0 || 1809 atomic.LoadInt32(&s.shutdown) != 0 { 1810 state.forPendingPeers(func(sp *serverPeer) { 1811 srvrLog.Tracef("Shutdown peer %s", sp) 1812 sp.Disconnect() 1813 }) 1814 continue 1815 } 1816 tries := 0 1817 for state.NeedMoreOutbound() && 1818 state.NeedMoreTries() && 1819 atomic.LoadInt32(&s.shutdown) == 0 { 1820 addr := s.addrManager.GetAddress("any") 1821 if addr == nil { 1822 break 1823 } 1824 key := addrmgr.GroupKey(addr.NetAddress()) 1825 // Address will not be invalid, local or unroutable 1826 // because addrmanager rejects those on addition. 1827 // Just check that we don't already have an address 1828 // in the same group so that we are not connecting 1829 // to the same network segment at the expense of 1830 // others. 1831 if state.outboundGroups[key] != 0 { 1832 break 1833 } 1834 1835 // Check that we don't have a pending connection to this addr. 1836 addrStr := addrmgr.NetAddressKey(addr.NetAddress()) 1837 if _, ok := state.pendingPeers[addrStr]; ok { 1838 continue 1839 } 1840 1841 tries++ 1842 // After 100 bad tries exit the loop and we'll try again 1843 // later. 1844 if tries > 100 { 1845 break 1846 } 1847 1848 // XXX if we have limited that address skip 1849 1850 // only allow recent nodes (10mins) after we failed 30 1851 // times 1852 if tries < 30 && time.Now().Sub(addr.LastAttempt()) < 10*time.Minute { 1853 continue 1854 } 1855 1856 // allow nondefault ports after 50 failed tries. 1857 if fmt.Sprintf("%d", addr.NetAddress().Port) != 1858 activeNetParams.DefaultPort && tries < 50 { 1859 continue 1860 } 1861 1862 tries = 0 1863 sp := s.newOutboundPeer(addrStr, false) 1864 if sp != nil { 1865 go s.peerConnHandler(sp) 1866 state.pendingPeers[sp.Addr()] = sp 1867 } 1868 } 1869 1870 // We need more peers, wake up in ten seconds and try again. 1871 if state.NeedMoreOutbound() { 1872 time.AfterFunc(10*time.Second, func() { 1873 s.wakeup <- struct{}{} 1874 }) 1875 } 1876 } 1877 1878 s.blockManager.Stop() 1879 s.addrManager.Stop() 1880 1881 // Drain channels before exiting so nothing is left waiting around 1882 // to send. 1883 cleanup: 1884 for { 1885 select { 1886 case <-s.newPeers: 1887 case <-s.donePeers: 1888 case <-s.peerHeightsUpdate: 1889 case <-s.relayInv: 1890 case <-s.broadcast: 1891 case <-s.wakeup: 1892 case <-s.query: 1893 default: 1894 break cleanup 1895 } 1896 } 1897 s.wg.Done() 1898 srvrLog.Tracef("Peer handler done") 1899 } 1900 1901 // AddPeer adds a new peer that has already been connected to the server. 1902 func (s *server) AddPeer(sp *serverPeer) { 1903 s.newPeers <- sp 1904 } 1905 1906 // BanPeer bans a peer that has already been connected to the server by ip. 1907 func (s *server) BanPeer(sp *serverPeer) { 1908 s.banPeers <- sp 1909 } 1910 1911 // RelayInventory relays the passed inventory vector to all connected peers 1912 // that are not already known to have it. 1913 func (s *server) RelayInventory(invVect *wire.InvVect, data interface{}) { 1914 s.relayInv <- relayMsg{invVect: invVect, data: data} 1915 } 1916 1917 // BroadcastMessage sends msg to all peers currently connected to the server 1918 // except those in the passed peers to exclude. 1919 func (s *server) BroadcastMessage(msg wire.Message, exclPeers ...*serverPeer) { 1920 // XXX: Need to determine if this is an alert that has already been 1921 // broadcast and refrain from broadcasting again. 1922 bmsg := broadcastMsg{message: msg, excludePeers: exclPeers} 1923 s.broadcast <- bmsg 1924 } 1925 1926 // ConnectedCount returns the number of currently connected peers. 1927 func (s *server) ConnectedCount() int32 { 1928 replyChan := make(chan int32) 1929 1930 s.query <- getConnCountMsg{reply: replyChan} 1931 1932 return <-replyChan 1933 } 1934 1935 // AddedNodeInfo returns an array of btcjson.GetAddedNodeInfoResult structures 1936 // describing the persistent (added) nodes. 1937 func (s *server) AddedNodeInfo() []*serverPeer { 1938 replyChan := make(chan []*serverPeer) 1939 s.query <- getAddedNodesMsg{reply: replyChan} 1940 return <-replyChan 1941 } 1942 1943 // Peers returns an array of all connected peers. 1944 func (s *server) Peers() []*serverPeer { 1945 replyChan := make(chan []*serverPeer) 1946 1947 s.query <- getPeersMsg{reply: replyChan} 1948 1949 return <-replyChan 1950 } 1951 1952 // DisconnectNodeByAddr disconnects a peer by target address. Both outbound and 1953 // inbound nodes will be searched for the target node. An error message will 1954 // be returned if the peer was not found. 1955 func (s *server) DisconnectNodeByAddr(addr string) error { 1956 replyChan := make(chan error) 1957 1958 s.query <- disconnectNodeMsg{ 1959 cmp: func(sp *serverPeer) bool { return sp.Addr() == addr }, 1960 reply: replyChan, 1961 } 1962 1963 return <-replyChan 1964 } 1965 1966 // DisconnectNodeByID disconnects a peer by target node id. Both outbound and 1967 // inbound nodes will be searched for the target node. An error message will be 1968 // returned if the peer was not found. 1969 func (s *server) DisconnectNodeByID(id int32) error { 1970 replyChan := make(chan error) 1971 1972 s.query <- disconnectNodeMsg{ 1973 cmp: func(sp *serverPeer) bool { return sp.ID() == id }, 1974 reply: replyChan, 1975 } 1976 1977 return <-replyChan 1978 } 1979 1980 // RemoveNodeByAddr removes a peer from the list of persistent peers if 1981 // present. An error will be returned if the peer was not found. 1982 func (s *server) RemoveNodeByAddr(addr string) error { 1983 replyChan := make(chan error) 1984 1985 s.query <- removeNodeMsg{ 1986 cmp: func(sp *serverPeer) bool { return sp.Addr() == addr }, 1987 reply: replyChan, 1988 } 1989 1990 return <-replyChan 1991 } 1992 1993 // RemoveNodeByID removes a peer by node ID from the list of persistent peers 1994 // if present. An error will be returned if the peer was not found. 1995 func (s *server) RemoveNodeByID(id int32) error { 1996 replyChan := make(chan error) 1997 1998 s.query <- removeNodeMsg{ 1999 cmp: func(sp *serverPeer) bool { return sp.ID() == id }, 2000 reply: replyChan, 2001 } 2002 2003 return <-replyChan 2004 } 2005 2006 // ConnectNode adds `addr' as a new outbound peer. If permanent is true then the 2007 // peer will be persistent and reconnect if the connection is lost. 2008 // It is an error to call this with an already existing peer. 2009 func (s *server) ConnectNode(addr string, permanent bool) error { 2010 replyChan := make(chan error) 2011 2012 s.query <- connectNodeMsg{addr: addr, permanent: permanent, reply: replyChan} 2013 2014 return <-replyChan 2015 } 2016 2017 // AddBytesSent adds the passed number of bytes to the total bytes sent counter 2018 // for the server. It is safe for concurrent access. 2019 func (s *server) AddBytesSent(bytesSent uint64) { 2020 atomic.AddUint64(&s.bytesSent, bytesSent) 2021 } 2022 2023 // AddBytesReceived adds the passed number of bytes to the total bytes received 2024 // counter for the server. It is safe for concurrent access. 2025 func (s *server) AddBytesReceived(bytesReceived uint64) { 2026 atomic.AddUint64(&s.bytesReceived, bytesReceived) 2027 } 2028 2029 // NetTotals returns the sum of all bytes received and sent across the network 2030 // for all peers. It is safe for concurrent access. 2031 func (s *server) NetTotals() (uint64, uint64) { 2032 return atomic.LoadUint64(&s.bytesReceived), 2033 atomic.LoadUint64(&s.bytesSent) 2034 } 2035 2036 // UpdatePeerHeights updates the heights of all peers who have have announced 2037 // the latest connected main chain block, or a recognized orphan. These height 2038 // updates allow us to dynamically refresh peer heights, ensuring sync peer 2039 // selection has access to the latest block heights for each peer. 2040 func (s *server) UpdatePeerHeights(latestBlkSha *wire.ShaHash, latestHeight int32, updateSource *serverPeer) { 2041 s.peerHeightsUpdate <- updatePeerHeightsMsg{ 2042 newSha: latestBlkSha, 2043 newHeight: latestHeight, 2044 originPeer: updateSource, 2045 } 2046 } 2047 2048 // rebroadcastHandler keeps track of user submitted inventories that we have 2049 // sent out but have not yet made it into a block. We periodically rebroadcast 2050 // them in case our peers restarted or otherwise lost track of them. 2051 func (s *server) rebroadcastHandler() { 2052 // Wait 5 min before first tx rebroadcast. 2053 timer := time.NewTimer(5 * time.Minute) 2054 pendingInvs := make(map[wire.InvVect]interface{}) 2055 2056 out: 2057 for { 2058 select { 2059 case riv := <-s.modifyRebroadcastInv: 2060 switch msg := riv.(type) { 2061 // Incoming InvVects are added to our map of RPC txs. 2062 case broadcastInventoryAdd: 2063 pendingInvs[*msg.invVect] = msg.data 2064 2065 // When an InvVect has been added to a block, we can 2066 // now remove it, if it was present. 2067 case broadcastInventoryDel: 2068 if _, ok := pendingInvs[*msg]; ok { 2069 delete(pendingInvs, *msg) 2070 } 2071 } 2072 2073 case <-timer.C: 2074 // Any inventory we have has not made it into a block 2075 // yet. We periodically resubmit them until they have. 2076 for iv, data := range pendingInvs { 2077 ivCopy := iv 2078 s.RelayInventory(&ivCopy, data) 2079 } 2080 2081 // Process at a random time up to 30mins (in seconds) 2082 // in the future. 2083 timer.Reset(time.Second * 2084 time.Duration(randomUint16Number(1800))) 2085 2086 case <-s.quit: 2087 break out 2088 } 2089 } 2090 2091 timer.Stop() 2092 2093 // Drain channels before exiting so nothing is left waiting around 2094 // to send. 2095 cleanup: 2096 for { 2097 select { 2098 case <-s.modifyRebroadcastInv: 2099 default: 2100 break cleanup 2101 } 2102 } 2103 s.wg.Done() 2104 } 2105 2106 // Start begins accepting connections from peers. 2107 func (s *server) Start() { 2108 // Already started? 2109 if atomic.AddInt32(&s.started, 1) != 1 { 2110 return 2111 } 2112 2113 srvrLog.Trace("Starting server") 2114 2115 // Start all the listeners. There will not be any if listening is 2116 // disabled. 2117 for _, listener := range s.listeners { 2118 s.wg.Add(1) 2119 go s.listenHandler(listener) 2120 } 2121 2122 // Start the peer handler which in turn starts the address and block 2123 // managers. 2124 s.wg.Add(1) 2125 go s.peerHandler() 2126 2127 if s.nat != nil { 2128 s.wg.Add(1) 2129 go s.upnpUpdateThread() 2130 } 2131 2132 if !cfg.DisableRPC { 2133 s.wg.Add(1) 2134 2135 // Start the rebroadcastHandler, which ensures user tx received by 2136 // the RPC server are rebroadcast until being included in a block. 2137 go s.rebroadcastHandler() 2138 2139 s.rpcServer.Start() 2140 } 2141 2142 // Start the CPU miner if generation is enabled. 2143 if cfg.Generate { 2144 s.cpuMiner.Start() 2145 } 2146 } 2147 2148 // Stop gracefully shuts down the server by stopping and disconnecting all 2149 // peers and the main listener. 2150 func (s *server) Stop() error { 2151 // Make sure this only happens once. 2152 if atomic.AddInt32(&s.shutdown, 1) != 1 { 2153 srvrLog.Infof("Server is already in the process of shutting down") 2154 return nil 2155 } 2156 2157 srvrLog.Warnf("Server shutting down") 2158 2159 // Stop all the listeners. There will not be any listeners if 2160 // listening is disabled. 2161 for _, listener := range s.listeners { 2162 err := listener.Close() 2163 if err != nil { 2164 return err 2165 } 2166 } 2167 2168 // Stop the CPU miner if needed 2169 s.cpuMiner.Stop() 2170 2171 // Shutdown the RPC server if it's not disabled. 2172 if !cfg.DisableRPC { 2173 s.rpcServer.Stop() 2174 } 2175 2176 // Signal the remaining goroutines to quit. 2177 close(s.quit) 2178 return nil 2179 } 2180 2181 // WaitForShutdown blocks until the main listener and peer handlers are stopped. 2182 func (s *server) WaitForShutdown() { 2183 s.wg.Wait() 2184 } 2185 2186 // ScheduleShutdown schedules a server shutdown after the specified duration. 2187 // It also dynamically adjusts how often to warn the server is going down based 2188 // on remaining duration. 2189 func (s *server) ScheduleShutdown(duration time.Duration) { 2190 // Don't schedule shutdown more than once. 2191 if atomic.AddInt32(&s.shutdownSched, 1) != 1 { 2192 return 2193 } 2194 srvrLog.Warnf("Server shutdown in %v", duration) 2195 go func() { 2196 remaining := duration 2197 tickDuration := dynamicTickDuration(remaining) 2198 done := time.After(remaining) 2199 ticker := time.NewTicker(tickDuration) 2200 out: 2201 for { 2202 select { 2203 case <-done: 2204 ticker.Stop() 2205 s.Stop() 2206 break out 2207 case <-ticker.C: 2208 remaining = remaining - tickDuration 2209 if remaining < time.Second { 2210 continue 2211 } 2212 2213 // Change tick duration dynamically based on remaining time. 2214 newDuration := dynamicTickDuration(remaining) 2215 if tickDuration != newDuration { 2216 tickDuration = newDuration 2217 ticker.Stop() 2218 ticker = time.NewTicker(tickDuration) 2219 } 2220 srvrLog.Warnf("Server shutdown in %v", remaining) 2221 } 2222 } 2223 }() 2224 } 2225 2226 // parseListeners splits the list of listen addresses passed in addrs into 2227 // IPv4 and IPv6 slices and returns them. This allows easy creation of the 2228 // listeners on the correct interface "tcp4" and "tcp6". It also properly 2229 // detects addresses which apply to "all interfaces" and adds the address to 2230 // both slices. 2231 func parseListeners(addrs []string) ([]string, []string, bool, error) { 2232 ipv4ListenAddrs := make([]string, 0, len(addrs)*2) 2233 ipv6ListenAddrs := make([]string, 0, len(addrs)*2) 2234 haveWildcard := false 2235 2236 for _, addr := range addrs { 2237 host, _, err := net.SplitHostPort(addr) 2238 if err != nil { 2239 // Shouldn't happen due to already being normalized. 2240 return nil, nil, false, err 2241 } 2242 2243 // Empty host or host of * on plan9 is both IPv4 and IPv6. 2244 if host == "" || (host == "*" && runtime.GOOS == "plan9") { 2245 ipv4ListenAddrs = append(ipv4ListenAddrs, addr) 2246 ipv6ListenAddrs = append(ipv6ListenAddrs, addr) 2247 haveWildcard = true 2248 continue 2249 } 2250 2251 // Strip IPv6 zone id if present since net.ParseIP does not 2252 // handle it. 2253 zoneIndex := strings.LastIndex(host, "%") 2254 if zoneIndex > 0 { 2255 host = host[:zoneIndex] 2256 } 2257 2258 // Parse the IP. 2259 ip := net.ParseIP(host) 2260 if ip == nil { 2261 return nil, nil, false, fmt.Errorf("'%s' is not a "+ 2262 "valid IP address", host) 2263 } 2264 2265 // To4 returns nil when the IP is not an IPv4 address, so use 2266 // this determine the address type. 2267 if ip.To4() == nil { 2268 ipv6ListenAddrs = append(ipv6ListenAddrs, addr) 2269 } else { 2270 ipv4ListenAddrs = append(ipv4ListenAddrs, addr) 2271 } 2272 } 2273 return ipv4ListenAddrs, ipv6ListenAddrs, haveWildcard, nil 2274 } 2275 2276 func (s *server) upnpUpdateThread() { 2277 // Go off immediately to prevent code duplication, thereafter we renew 2278 // lease every 15 minutes. 2279 timer := time.NewTimer(0 * time.Second) 2280 lport, _ := strconv.ParseInt(activeNetParams.DefaultPort, 10, 16) 2281 first := true 2282 out: 2283 for { 2284 select { 2285 case <-timer.C: 2286 // TODO(oga) pick external port more cleverly 2287 // TODO(oga) know which ports we are listening to on an external net. 2288 // TODO(oga) if specific listen port doesn't work then ask for wildcard 2289 // listen port? 2290 // XXX this assumes timeout is in seconds. 2291 listenPort, err := s.nat.AddPortMapping("tcp", int(lport), int(lport), 2292 "btcd listen port", 20*60) 2293 if err != nil { 2294 srvrLog.Warnf("can't add UPnP port mapping: %v", err) 2295 } 2296 if first && err == nil { 2297 // TODO(oga): look this up periodically to see if upnp domain changed 2298 // and so did ip. 2299 externalip, err := s.nat.GetExternalAddress() 2300 if err != nil { 2301 srvrLog.Warnf("UPnP can't get external address: %v", err) 2302 continue out 2303 } 2304 na := wire.NewNetAddressIPPort(externalip, uint16(listenPort), 2305 s.services) 2306 err = s.addrManager.AddLocalAddress(na, addrmgr.UpnpPrio) 2307 if err != nil { 2308 // XXX DeletePortMapping? 2309 } 2310 srvrLog.Warnf("Successfully bound via UPnP to %s", addrmgr.NetAddressKey(na)) 2311 first = false 2312 } 2313 timer.Reset(time.Minute * 15) 2314 case <-s.quit: 2315 break out 2316 } 2317 } 2318 2319 timer.Stop() 2320 2321 if err := s.nat.DeletePortMapping("tcp", int(lport), int(lport)); err != nil { 2322 srvrLog.Warnf("unable to remove UPnP port mapping: %v", err) 2323 } else { 2324 srvrLog.Debugf("succesfully disestablished UPnP port mapping") 2325 } 2326 2327 s.wg.Done() 2328 } 2329 2330 // newServer returns a new btcd server configured to listen on addr for the 2331 // bitcoin network type specified by chainParams. Use start to begin accepting 2332 // connections from peers. 2333 func newServer(listenAddrs []string, db database.DB, chainParams *chaincfg.Params) (*server, error) { 2334 services := defaultServices 2335 if cfg.NoPeerBloomFilters { 2336 services &^= wire.SFNodeBloom 2337 } 2338 2339 amgr := addrmgr.New(cfg.DataDir, btcdLookup) 2340 2341 var listeners []net.Listener 2342 var nat NAT 2343 if !cfg.DisableListen { 2344 ipv4Addrs, ipv6Addrs, wildcard, err := 2345 parseListeners(listenAddrs) 2346 if err != nil { 2347 return nil, err 2348 } 2349 listeners = make([]net.Listener, 0, len(ipv4Addrs)+len(ipv6Addrs)) 2350 discover := true 2351 if len(cfg.ExternalIPs) != 0 { 2352 discover = false 2353 // if this fails we have real issues. 2354 port, _ := strconv.ParseUint( 2355 activeNetParams.DefaultPort, 10, 16) 2356 2357 for _, sip := range cfg.ExternalIPs { 2358 eport := uint16(port) 2359 host, portstr, err := net.SplitHostPort(sip) 2360 if err != nil { 2361 // no port, use default. 2362 host = sip 2363 } else { 2364 port, err := strconv.ParseUint( 2365 portstr, 10, 16) 2366 if err != nil { 2367 srvrLog.Warnf("Can not parse "+ 2368 "port from %s for "+ 2369 "externalip: %v", sip, 2370 err) 2371 continue 2372 } 2373 eport = uint16(port) 2374 } 2375 na, err := amgr.HostToNetAddress(host, eport, 2376 services) 2377 if err != nil { 2378 srvrLog.Warnf("Not adding %s as "+ 2379 "externalip: %v", sip, err) 2380 continue 2381 } 2382 2383 err = amgr.AddLocalAddress(na, addrmgr.ManualPrio) 2384 if err != nil { 2385 amgrLog.Warnf("Skipping specified external IP: %v", err) 2386 } 2387 } 2388 } else if discover && cfg.Upnp { 2389 nat, err = Discover() 2390 if err != nil { 2391 srvrLog.Warnf("Can't discover upnp: %v", err) 2392 } 2393 // nil nat here is fine, just means no upnp on network. 2394 } 2395 2396 // TODO(oga) nonstandard port... 2397 if wildcard { 2398 port, err := 2399 strconv.ParseUint(activeNetParams.DefaultPort, 2400 10, 16) 2401 if err != nil { 2402 // I can't think of a cleaner way to do this... 2403 goto nowc 2404 } 2405 addrs, err := net.InterfaceAddrs() 2406 for _, a := range addrs { 2407 ip, _, err := net.ParseCIDR(a.String()) 2408 if err != nil { 2409 continue 2410 } 2411 na := wire.NewNetAddressIPPort(ip, 2412 uint16(port), services) 2413 if discover { 2414 err = amgr.AddLocalAddress(na, addrmgr.InterfacePrio) 2415 if err != nil { 2416 amgrLog.Debugf("Skipping local address: %v", err) 2417 } 2418 } 2419 } 2420 } 2421 nowc: 2422 2423 for _, addr := range ipv4Addrs { 2424 listener, err := net.Listen("tcp4", addr) 2425 if err != nil { 2426 srvrLog.Warnf("Can't listen on %s: %v", addr, 2427 err) 2428 continue 2429 } 2430 listeners = append(listeners, listener) 2431 2432 if discover { 2433 if na, err := amgr.DeserializeNetAddress(addr); err == nil { 2434 err = amgr.AddLocalAddress(na, addrmgr.BoundPrio) 2435 if err != nil { 2436 amgrLog.Warnf("Skipping bound address: %v", err) 2437 } 2438 } 2439 } 2440 } 2441 2442 for _, addr := range ipv6Addrs { 2443 listener, err := net.Listen("tcp6", addr) 2444 if err != nil { 2445 srvrLog.Warnf("Can't listen on %s: %v", addr, 2446 err) 2447 continue 2448 } 2449 listeners = append(listeners, listener) 2450 if discover { 2451 if na, err := amgr.DeserializeNetAddress(addr); err == nil { 2452 err = amgr.AddLocalAddress(na, addrmgr.BoundPrio) 2453 if err != nil { 2454 amgrLog.Debugf("Skipping bound address: %v", err) 2455 } 2456 } 2457 } 2458 } 2459 2460 if len(listeners) == 0 { 2461 return nil, errors.New("no valid listen address") 2462 } 2463 } 2464 2465 s := server{ 2466 listeners: listeners, 2467 chainParams: chainParams, 2468 addrManager: amgr, 2469 newPeers: make(chan *serverPeer, cfg.MaxPeers), 2470 donePeers: make(chan *serverPeer, cfg.MaxPeers), 2471 banPeers: make(chan *serverPeer, cfg.MaxPeers), 2472 retryPeers: make(chan *serverPeer, cfg.MaxPeers), 2473 wakeup: make(chan struct{}), 2474 query: make(chan interface{}), 2475 relayInv: make(chan relayMsg, cfg.MaxPeers), 2476 broadcast: make(chan broadcastMsg, cfg.MaxPeers), 2477 quit: make(chan struct{}), 2478 modifyRebroadcastInv: make(chan interface{}), 2479 peerHeightsUpdate: make(chan updatePeerHeightsMsg), 2480 nat: nat, 2481 db: db, 2482 timeSource: blockchain.NewMedianTime(), 2483 services: services, 2484 sigCache: txscript.NewSigCache(cfg.SigCacheMaxSize), 2485 } 2486 2487 // Create the transaction and address indexes if needed. 2488 // 2489 // CAUTION: the txindex needs to be first in the indexes array because 2490 // the addrindex uses data from the txindex during catchup. If the 2491 // addrindex is run first, it may not have the transactions from the 2492 // current block indexed. 2493 var indexes []indexers.Indexer 2494 if cfg.TxIndex || cfg.AddrIndex { 2495 // Enable transaction index if address index is enabled since it 2496 // requires it. 2497 if !cfg.TxIndex { 2498 indxLog.Infof("Transaction index enabled because it " + 2499 "is required by the address index") 2500 cfg.TxIndex = true 2501 } else { 2502 indxLog.Info("Transaction index is enabled") 2503 } 2504 2505 s.txIndex = indexers.NewTxIndex(db) 2506 indexes = append(indexes, s.txIndex) 2507 } 2508 if cfg.AddrIndex { 2509 indxLog.Info("Address index is enabled") 2510 s.addrIndex = indexers.NewAddrIndex(db, chainParams) 2511 indexes = append(indexes, s.addrIndex) 2512 } 2513 2514 // Create an index manager if any of the optional indexes are enabled. 2515 var indexManager blockchain.IndexManager 2516 if len(indexes) > 0 { 2517 indexManager = indexers.NewManager(db, indexes) 2518 } 2519 bm, err := newBlockManager(&s, indexManager) 2520 if err != nil { 2521 return nil, err 2522 } 2523 s.blockManager = bm 2524 2525 txC := mempoolConfig{ 2526 Policy: mempoolPolicy{ 2527 DisableRelayPriority: cfg.NoRelayPriority, 2528 FreeTxRelayLimit: cfg.FreeTxRelayLimit, 2529 MaxOrphanTxs: cfg.MaxOrphanTxs, 2530 MaxOrphanTxSize: defaultMaxOrphanTxSize, 2531 MaxSigOpsPerTx: blockchain.MaxSigOpsPerBlock / 5, 2532 MinRelayTxFee: cfg.minRelayTxFee, 2533 }, 2534 FetchUtxoView: s.blockManager.chain.FetchUtxoView, 2535 Chain: s.blockManager.chain, 2536 SigCache: s.sigCache, 2537 TimeSource: s.timeSource, 2538 AddrIndex: s.addrIndex, 2539 } 2540 s.txMemPool = newTxMemPool(&txC) 2541 2542 // Create the mining policy based on the configuration options. 2543 // NOTE: The CPU miner relies on the mempool, so the mempool has to be 2544 // created before calling the function to create the CPU miner. 2545 policy := mining.Policy{ 2546 BlockMinSize: cfg.BlockMinSize, 2547 BlockMaxSize: cfg.BlockMaxSize, 2548 BlockPrioritySize: cfg.BlockPrioritySize, 2549 TxMinFreeFee: cfg.minRelayTxFee, 2550 } 2551 s.cpuMiner = newCPUMiner(&policy, &s) 2552 2553 if !cfg.DisableRPC { 2554 s.rpcServer, err = newRPCServer(cfg.RPCListeners, &policy, &s) 2555 if err != nil { 2556 return nil, err 2557 } 2558 } 2559 2560 return &s, nil 2561 } 2562 2563 // dynamicTickDuration is a convenience function used to dynamically choose a 2564 // tick duration based on remaining time. It is primarily used during 2565 // server shutdown to make shutdown warnings more frequent as the shutdown time 2566 // approaches. 2567 func dynamicTickDuration(remaining time.Duration) time.Duration { 2568 switch { 2569 case remaining <= time.Second*5: 2570 return time.Second 2571 case remaining <= time.Second*15: 2572 return time.Second * 5 2573 case remaining <= time.Minute: 2574 return time.Second * 15 2575 case remaining <= time.Minute*5: 2576 return time.Minute 2577 case remaining <= time.Minute*15: 2578 return time.Minute * 5 2579 case remaining <= time.Hour: 2580 return time.Minute * 15 2581 } 2582 return time.Hour 2583 }