/// import { Blockchain } from '../blockchain'; import { Event } from '../event'; import { PeerStore } from '../fileStores/peerStore'; import { Logger } from '../logger'; import { MetricsMonitor } from '../metrics'; import { FullNode } from '../node'; import { Transaction } from '../primitives'; import { Block } from '../primitives/block'; import { BlockHash, BlockHeader } from '../primitives/blockheader'; import { TransactionHash } from '../primitives/transaction'; import { Telemetry } from '../telemetry'; import { Identity, PrivateIdentity } from './identity'; import { LocalPeer } from './peers/localPeer'; import { Peer } from './peers/peer'; import { PeerManager } from './peers/peerManager'; import { IsomorphicWebSocketConstructor } from './types'; export type TransactionOrHash = { type: 'FULL'; value: Transaction; } | { type: 'HASH'; value: TransactionHash; }; /** * Entry point for the peer-to-peer network. Manages connections to other peers on the network * and provides abstractions for several methods of sending/receiving network messages. */ export declare class PeerNetwork { private readonly networkId; private webSocketServer?; private readonly incomingWebSocketWhitelist; readonly localPeer: LocalPeer; readonly peerManager: PeerManager; readonly onIsReadyChanged: Event<[boolean]>; readonly onTransactionAccepted: Event<[transaction: Transaction, received: Date]>; readonly onBlockGossipReceived: Event<[BlockHeader]>; readonly onTransactionGossipReceived: Event<[transaction: Transaction, valid: boolean]>; private started; private readonly minPeers; private readonly bootstrapNodes; private readonly listen; private readonly peerConnectionManager; private readonly logger; private readonly metrics; private readonly telemetry; private readonly node; private readonly chain; private readonly requests; private readonly enableSyncing; private readonly blockFetcher; private readonly transactionFetcher; private readonly recentlyAddedToChain; private readonly knownTransactionFilter; /** * If the peer network is ready for messages to be sent or not */ private _isReady; get isReady(): boolean; constructor(options: { networkId: number; identity: PrivateIdentity; agent?: string; webSocket: IsomorphicWebSocketConstructor; listen?: boolean; port?: number; bootstrapNodes?: string[]; stunServers?: string[]; name?: string | null; maxPeers?: number; minPeers?: number; targetPeers?: number; enableSyncing?: boolean; logPeerMessages?: boolean; logger?: Logger; metrics?: MetricsMonitor; telemetry: Telemetry; node: FullNode; chain: Blockchain; peerStore: PeerStore; incomingWebSocketWhitelist?: string[]; keepOpenPeerSlot?: boolean; }); start(): void; private startWebSocketServer; private connectToBootstrapNodes; private connectToPriorWebsocketConnections; /** * Call close when shutting down the PeerNetwork to clean up * outstanding connections. */ stop(): Promise; /** * Send a compact block to a sqrt subset of peers who haven't yet received the block */ private broadcastBlock; /** * Send a block hash to all connected peers who haven't yet received the block. */ private broadcastBlockHash; /** * Send out the transaction only to peers that have not yet heard about it. * The full transaction will be sent to a subset of sqrt(num_peers) * and the rest of the peers will receive the transaction hash */ broadcastTransaction(transaction: Transaction): void; knowsTransaction(hash: TransactionHash, peerId: Identity): boolean; private markKnowsTransaction; private connectedPeersWithoutTransaction; private connectedPeersWithoutBlock; /** * Fire an RPC request to the given peer identity. Returns a promise that * will resolve when the response is received, or will be rejected if the * request cannot be completed before timing out. */ private requestFrom; getBlockHeaders(peer: Peer, start: number | Buffer, limit: number, skip?: number, reverse?: boolean): Promise<{ headers: BlockHeader[]; time: number; }>; getBlocks(peer: Peer, start: Buffer, limit: number): Promise<{ blocks: Block[]; time: number; isMessageFull: boolean; }>; private handleMessage; /** * Handle an incoming RPC message. This may be an incoming request for some * data, or an incoming response to one of our requests. * * If it is a request, we pass it to the handler registered for it. * If a response, we resolve the promise waiting for it. * * The handler for a given request should either return a payload or throw * a CannotSatisfyRequest error */ private handleRpcMessage; private handleNewBlockHashesMessage; private onNewBlockTransactions; private onNewCompactBlock; private handleNewPooledTransactionHashes; private updateIsReady; private onGetBlockHeadersRequest; private onGetBlocksRequest; private onPooledTransactionsRequest; private onGetBlockTransactionsRequest; private onGetCompactBlockRequest; private handleRequestedBlock; private onNewFullBlock; private shouldProcessNewBlocks; private shouldProcessTransactions; alreadyHaveBlock(headerOrHash: BlockHeader | BlockHash): Promise; private onNewTransaction; } //# sourceMappingURL=peerNetwork.d.ts.map