mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00

* [NOD-58] Replace lastBlock with selected tip in version message (#210) * [NOD-58] Replace lastBlock with selected tip in version message * [NOD-58] Fix typo in comment * [NOD-58] Add mutex to SelectedTipHash * [NOD-58] Remove redundant comment * [NOD-58] Remove wantStartingHeight from peerStats * [NOD-58] Remove lock from SelectedTipHash * Nod 53 change getheaders message to handle new block locator (#213) * [NOD-53] Change getheaders message to handle the new block locator mechanism * [NOD-53] Use heap in locateHeaders * [NOD-53] Create a constructor for each heap direction * [NOD-57] Check if a node is synced only by timestamps (#214) * [NOD-60] implement isSyncCandidate (#218) * [NOD-60] Implement isSyncCandidate * [NOD-60] Fix typo * [NOD-65] Fix netsync related tests and remove fields optionality from… (#220) * [NOD-65] Fix netsync related tests and remove fields optionality from msgversion * [NOD-65] gofmt rpcserver.go * [NOD-65] add missing test for verRelayTxFalse * [NOD-62] Change getblocks message to handle the new block locator mechanism (#219) * [NOD-62] Change getblocks message to handle the new block locator mechanism * [NOD-62] Add locateBlockNodes function * [NOD-68] Adjust orphan parents requesting for a DAG (#222) * [NOD-68] Adjust orphan parents requesting for a DAG * [NOD-68] add sendInvsFromRequestedQueue and trigger it when requested blocks slice is empty, or immediatly if we're not in sync mode * [NOD-68] Prevent duplicates from entering to state.requestQueue and add wrapping locks to addBlocksToRequestQueue * [NOD-68] Fix Lock -> Unlock in sendInvsFromRequestedQueue * [NOD-74] Starts syncing again when the current sync peer is done (#225) * [NOD-74] Starts syncing again when the current sync peer is done * [NOD-74] Unlock mtx before netsync is restarted * [NOD-74] Fix name isSyncPeerFree -> isWaitingForBlocks * [NOD-75] fixing netsync bugs (#227) * [NOD-74] Starts syncing again when the current sync peer is done * [NOD-74] Unlock mtx before netsync is restarted * [NOD-75] Fixing netsync bugs * [NOD-80] Request block data from block propagation just after you are… (#231) * [NOD-80] Request block data from block propagation just after you are current * [NOD-80] Fix adding to both queues in addInvToRequestQueue * [NOD-81] Start to mine on top of genesis iff all peers selected tip is genesis (#232) * [NOD-81] Start to mine on top of genesis only if all of your peers' selected tip is genesis * [NOD-81] Explain forAllPeers/forAllOutboundPeers shouldContinue behaviour in comments * [NOD-81] Add forAllInboundPeers and add return values for forAllPeers/forAllOutboundPeers/forAllInboundPeers functions * [NOD-16] Add pushSet to the BlockHeap type * [NOD-16] Fixed syntax error
114 lines
3.3 KiB
Go
114 lines
3.3 KiB
Go
// Copyright (c) 2015-2016 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package peer_test
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/daglabs/btcd/dagconfig"
|
|
"github.com/daglabs/btcd/peer"
|
|
"github.com/daglabs/btcd/util/subnetworkid"
|
|
"github.com/daglabs/btcd/wire"
|
|
)
|
|
|
|
// mockRemotePeer creates a basic inbound peer listening on the simnet port for
|
|
// use with Example_peerConnection. It does not return until the listner is
|
|
// active.
|
|
func mockRemotePeer() error {
|
|
// Configure peer to act as a simnet node that offers no services.
|
|
peerCfg := &peer.Config{
|
|
UserAgentName: "peer", // User agent name to advertise.
|
|
UserAgentVersion: "1.0.0", // User agent version to advertise.
|
|
DAGParams: &dagconfig.SimNetParams,
|
|
SubnetworkID: subnetworkid.SubnetworkIDSupportsAll,
|
|
SelectedTip: fakeSelectedTipFn,
|
|
}
|
|
|
|
// Accept connections on the simnet port.
|
|
listener, err := net.Listen("tcp", "127.0.0.1:18555")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
go func() {
|
|
conn, err := listener.Accept()
|
|
if err != nil {
|
|
fmt.Printf("Accept: error %v\n", err)
|
|
return
|
|
}
|
|
|
|
// Create and start the inbound peer.
|
|
p := peer.NewInboundPeer(peerCfg)
|
|
p.AssociateConnection(conn)
|
|
}()
|
|
|
|
return nil
|
|
}
|
|
|
|
// This example demonstrates the basic process for initializing and creating an
|
|
// outbound peer. Peers negotiate by exchanging version and verack messages.
|
|
// For demonstration, a simple handler for version message is attached to the
|
|
// peer.
|
|
func Example_newOutboundPeer() {
|
|
// Ordinarily this will not be needed since the outbound peer will be
|
|
// connecting to a remote peer, however, since this example is executed
|
|
// and tested, a mock remote peer is needed to listen for the outbound
|
|
// peer.
|
|
if err := mockRemotePeer(); err != nil {
|
|
fmt.Printf("mockRemotePeer: unexpected error %v\n", err)
|
|
return
|
|
}
|
|
|
|
// Create an outbound peer that is configured to act as a simnet node
|
|
// that offers no services and has listeners for the version and verack
|
|
// messages. The verack listener is used here to signal the code below
|
|
// when the handshake has been finished by signalling a channel.
|
|
verack := make(chan struct{})
|
|
peerCfg := &peer.Config{
|
|
UserAgentName: "peer", // User agent name to advertise.
|
|
UserAgentVersion: "1.0.0", // User agent version to advertise.
|
|
DAGParams: &dagconfig.SimNetParams,
|
|
Services: 0,
|
|
Listeners: peer.MessageListeners{
|
|
OnVersion: func(p *peer.Peer, msg *wire.MsgVersion) {
|
|
fmt.Println("outbound: received version")
|
|
},
|
|
OnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) {
|
|
verack <- struct{}{}
|
|
},
|
|
},
|
|
SubnetworkID: subnetworkid.SubnetworkIDSupportsAll,
|
|
SelectedTip: fakeSelectedTipFn,
|
|
}
|
|
p, err := peer.NewOutboundPeer(peerCfg, "127.0.0.1:18555")
|
|
if err != nil {
|
|
fmt.Printf("NewOutboundPeer: error %v\n", err)
|
|
return
|
|
}
|
|
|
|
// Establish the connection to the peer address and mark it connected.
|
|
conn, err := net.Dial("tcp", p.Addr())
|
|
if err != nil {
|
|
fmt.Printf("net.Dial: error %v\n", err)
|
|
return
|
|
}
|
|
p.AssociateConnection(conn)
|
|
|
|
// Wait for the verack message or timeout in case of failure.
|
|
select {
|
|
case <-verack:
|
|
case <-time.After(time.Second * 1):
|
|
fmt.Printf("Example_peerConnection: verack timeout")
|
|
}
|
|
|
|
// Disconnect the peer.
|
|
p.Disconnect()
|
|
p.WaitForDisconnect()
|
|
|
|
// Output:
|
|
// outbound: received version
|
|
}
|