134 Commits

Author SHA1 Message Date
tomFlowee 7163605b00 Make sure login messages are sent first
When the client sent a message in the onConnected callback, it managed
to get in front of the login message. This fixes that.
2022-12-03 23:30:01 +01:00
tomFlowee 126de2a231 Add new NetworkConnection::setLoginMessageCreator() 2022-11-03 23:40:31 +01:00
tomFlowee 6f4ef3bbdb Detect when outgoing connection died
The server always sends pongs in response to our pings, but we assumed
that the underlying OS would close a connection when the other side
isn't replying (ACKs).

Now we take this responsibility in the code and when no pongs are
registered we also close and re-establish the connection.

This additionally shortens the ping time to 30 seconds and the timeout
to 90 seconds.
2022-04-20 11:41:15 +02:00
tomFlowee df002c4973 Count the 'endofheader' byte too.
A header is actually never empty, but lets not make that assumption in
code.
2022-04-20 11:37:33 +02:00
tomFlowee 4cf26ee529 Fix a very niche bug. 2021-08-05 22:42:58 +02:00
tomFlowee d355c5f0ab Make the reconnect timeout more agressive.
The first bunch of times we want to reconnect much faster so we have less
downtime and faster response.

After a while it goes up to a slower timeout in order to not overload
logs and other such.
2021-08-05 22:42:58 +02:00
tomFlowee 56f083e3b6 Ensure sane queue size
This is based on the fact that a ringbuffer is not very happy if its only
got one element.
2021-08-05 22:02:45 +02:00
tomFlowee 9ec0bf9aec Don't re-connect when user calls connect()
User code may not check if it was already connected before calling
connect(), so we do it for them.
2021-07-15 12:47:27 +02:00
tomFlowee 3447230371 [NVM] Make ipv6 based error messages better.
Avoid just appending the portnumber with a colon as that does not help
readability on ipv6 type addresses.
This now neatly adds the square brackets as needed.
2021-07-15 00:08:50 +02:00
tomFlowee e6b02da76b Add secure way to do login on incoming connections.
This adds a baseclass for clients to inherit to make it even easier to
do login. Check ConnectionAuthorizer
2021-06-27 12:37:46 +02:00
tomFlowee 0196bc8bca Remove unused variable. 2021-06-27 11:42:47 +02:00
tomFlowee ea38ab6de5 Make ping more agressive.
For native connections we ping in order to disconnect stale connections.
This ensures that pings are sent more agressive, via the priority queue,
and we delay the disconnect to 150s.

So, pings more agressive, disconnects less agressive.
2021-04-19 11:31:53 +02:00
tomFlowee 4d5e7bfb09 Protect node with user-limits for the API.
This introduces several options for public node operators to limit their
nodes usage by 3rd parties, this is aimed at usage of resource-hungry
areas.

We allow limiting the amount of connections any single IP can keep open
with us.
We limit the amount of reconnects we allow in a short number of seconds.
We allow limiting the number of addresses (or scriptHashes) a peer can
register for the node to scan.
The last one is for both the addressMonitorService as well as for the
getBlock filters.

For node operators these items become available using command line
options or config-file options. By default these limits are unlimited as
we assume default usage to be private.
2021-02-26 15:14:14 +01:00
tomFlowee 0824cabbee Sanitize log
Seems some systems are not happy if we print a string that has zeros in it.
This sanitizes the message to replace zeros with spaces.
2021-02-03 13:13:21 +01:00
tomFlowee 3fe98afce9 Minor cleanup
This removes some unused includes from common headers and dead code
from some C++ files.
2021-01-05 22:05:25 +01:00
tomFlowee 9748d3988f Cleanups and improvements. 2020-12-25 23:51:06 +01:00
TomZ 4054b9a7d4 Avoid (re)connecting to incoming peer. 2020-10-26 18:21:52 +01:00
TomZ ff58ae6a36 Implement the first ASync API command
This implements the sendTransaction command using the async framework,
allowing clients to benefit from multi-core systems to process
transactions in parallel when being submitted to the Hub.
2020-10-26 18:21:52 +01:00
TomZ 331f1ec773 Fix regression in NWM that disconnects sometimes
This fixes the logic that finds out it should resume an interrupted
process. The code had false positives in case of a message split over
multiple TCP frames.
2020-10-25 23:42:49 +01:00
TomZ 3b553fd80b Make sure we handle a close() correctly.
When we close() the receiveStream is cleared and we should not be
reading from it after. So detect and handle this.
2020-09-17 21:51:37 +02:00
TomZ 7afefefa41 Improve NWM flow-control
The NetworkManager now has more mature flow-control which means that we
send our buffers more regularly and we delay parsing received data if the
sending takes too long.

The direct effect should be that creating of a large number of messages
in response to incoming messages is no longer a problem in many cases.
2020-09-17 21:04:28 +02:00
TomZ 84ee1bc3fe Minor: comments and whitespace. 2020-09-17 20:53:56 +02:00
TomZ f0375c09a7 Fix bad memory access on sending prio message
Don't ask the size of an unitialized buffer.
2020-09-17 20:51:06 +02:00
TomZ 79a92cf2ce NWM: work better with large concurrency
The asio stuff is quite broken when it comes to, ironically,
concurrency.
Connecting to peers lead to lots of 'canceled' (sic) errors being
generated internally in asio and other such issues.
Even though they were called on separate objects.

Adding a mutex around the async_connect calls made the amount of
failures go down dramatically.

This patch also includes upgrading boost::mutex to the std-lib
versions.
2020-05-11 13:19:10 +02:00
TomZ ed5b100ca5 Delete ununsed connections on shutdown. 2020-05-10 22:03:22 +02:00
TomZ 0b3dc7a8f5 NWM: fix reconnects/reuse of connection 2020-05-10 16:02:14 +02:00
TomZ 00453d52c4 NWM: Reuse connection objects
Avoid deleting and creating connections, which is really a rather rare
event anyway, and simply remember the connection object and reuse it
when a new one is requested.
2020-05-10 16:01:08 +02:00
TomZ d49b1ae5e2 Make NetworkManager connections leaner
The NetworkManager usage was mostly for low connection counts and this
made defaults selection easy.
With more usages it is important to allow the NWM-connection to be more
configurable about memory usage and leaner in general.

This changes the headers-buffers (used to create envelopes) to not be per
connection anymore but per thread using the tread_local keyword.

This changes the ring-buffers to become configurable using
NetworkConnections::setMessageQueueSizes().

Also removing some include statements where they were not really needed
in the P2PNet lib.
2020-05-09 20:23:05 +02:00
TomZ 5bb095f8a2 Minor fixes in usage of shared pointers. 2020-05-07 18:26:41 +02:00
TomZ 9a78e770ac P2PNet: handle errors better
This changes handling to also remove peers that fail with:
  "Cannot assign requested address"
An error seen in a Docker container on a system supporting IPv6.

Additionally we now always assign a error level so an unknown error will
still cause the node to be banned after 5 attempts.
2020-05-07 16:07:12 +02:00
TomZ bf76c5ab36 Write all bytes after command to zero.
Instead of just a single trailing zero, write all bytes of the
command-section. This is required by the protocol.
2020-05-05 10:54:26 +02:00
TomZ e5ee37fd87 Fix larger messages in LegacyP2P mode.
Splitting up the bigger message in chunks is not supported on the legacy
p2p network, so don't attempt.
2020-04-16 17:12:57 +02:00
TomZ 436535647f Add several new features to networkmanager
Allow user to shutdown a connection, making it instantly invalid.
Allow user to register a callback for errors.
And fix pinging to be disabled on legacyP2P style connections.
2020-04-01 20:24:04 +02:00
TomZ 24e557f566 Stop double applying of offset.
We already removed the bytes in Message::header()
2020-04-01 20:22:55 +02:00
TomZ bf24ed042b Add support for legacy p2p network envelope in networkmanager 2020-03-29 12:55:12 +02:00
TomZ e042fb90f5 Cancel timer on shutdown 2020-01-12 18:05:09 +01:00
TomZ aef124e523 Merge branch '2019.10' 2019-12-17 17:58:34 +01:00
TomZ 1143a71a92 Fix assignment typo 2019-12-17 17:57:08 +01:00
TomZ f4d8870001 NWM: tweaks to logs. 2019-12-17 17:36:15 +01:00
TomZ 8c842fa108 Catch exceptions on usage of socket
This should fix the issue where the NWM stopped listening due to us not
calling the proper setupCallback()

Also add some logging.
2019-12-11 23:47:21 +01:00
TomZ 152efb2c5d Print more details on making NWM connection. 2019-11-29 20:09:28 +01:00
TomZ a471d919eb Improve logging of not-acceptable connections
Log IP of remote that tries to talk to us but doesn't know the protocol.
2019-11-29 10:59:58 +01:00
TomZ 191bc3758d Add a simpliefied NetworkManager::bind() method
One that doesn't require a callback to be passed in.
2019-08-24 22:25:10 +02:00
TomZ df7de2ecd2 Clean up the hairy ball of util.cpp
Move some globals and all stuff pulling in crypto to the
server/serverutil.cpp file

Remove dead code.

Move several items that were used in only one place to the respective
files using them.

Move the class WaitUntilFinishedHelper into its own file.

Made sure no header includes utils.h
remove a handfull of files including utils.h for nothing.
2019-08-24 22:25:09 +02:00
TomZ f311073312 Avoid DNS lookups and better logging
When users type an IP address as hostname we optimistically try
to parse them in order to avoid asking the DNS anyway.
2019-08-19 21:43:08 +02:00
TomZ a56b67caf2 NWM; Create a new socket before reconnect 2019-06-22 10:59:47 +02:00
TomZ e5233fba32 On close, reset the chunked internal data. 2019-06-13 12:21:38 +02:00
TomZ 0a916c21e9 Add UTXO support to APIs
Generically this looks like this;

IsUnspent
[
  { "txid": "0x111111", "output": 1 },
  { "txid": "0x111111", "output": 11 }
]
IsUnspentReply
[
  { "blockHeight": 1111, "offsetInBlock": 1111, "unspent": true },
  { "unspent": false }
]

GetUnspentOutput
[
  { "txid": "0x111111", "output": 1 },
  { "txid": "0x111111", "output": 0 }
]
GetUnspentOutputReply
[
  { "blockHeight": 1111, "offsetInBlock": 1111, "unspent": true,
    "amount": 1111, "outputscript": "bytearray" },
  { "unspent": false }
]

note: txids are naturally always sha256s.
2019-06-10 21:02:15 +02:00
TomZ e168e3904d Respond to error. 2019-06-07 09:53:05 +02:00
TomZ 0c9f415eb8 Several NetworkManager fixes
This adds all the header ints to chunked messages, solving the problem
of losing RequestId on roundtrips if the answer was too big.

Added a unit test for this "new" features.

This makes callbacks all use shared_from_this() in order to avoid
callbacks being done on deleted instances (thanks boost!).

Last, special case when the user doesn't connect but just sends messages
which caused a send of data, only to realize the connection wasn't open,
and then a connect.
This makes sure we immediately start a connect on queue of a message.
2019-06-04 21:40:02 +02:00