Tue Mar 24 00:43:20 2026 UTC
Ladies and gentlemen,
I'm pleased to announce the source tarball for the version 0.0.50; the tarball is available in the downloads section.
Long things short, this time the fedaserv daemon instances
just became capable of exchanging node keys, checking them and storing the
results.
The problem I had to solve is that taking a yespower hash is a resource-consuming thing; low-end VPS machines are barely capable to perform it and it is too much stress for them, and older 32-bit computers can not do it at all. Besides that, even for a more or less powerful hardware this hash taking is obviously risky in respect of DoS attacks. So, first, it should be possible to delegate the tasks involving hash computation to a physical computer other than the one running the node, and, second, in case we're asked by a stranger from the Internet to verify a previously-unknown node's hash, we should let the stranger demonstrate some proof-of-work... well, technically in the present version it means we let the stranger take four hashes of things we supply, and only then we agree to take one hash of a thing the stranger supplies.
Three new peer types are implemented; from the
doc/peer_types.txt:
****** TYPE: trustncc Trusted node certificate center. Basically, we trust this peer (its node+point's key) in the sense of accepting foreign nodes' keys _without_ _computing_ _their_ _hashes_; furthermore, in case an unknown node tries to connect us, we can ask all (or some of) known&active trustncc peers whether they know the node, and they might send us the node's master cert (signed by them) so we can accept that node without computing the hash. For a point, it may be useful (although not necessary) to declare the point's own node as trustncc, specially if the point has good conectivity conditions and plans to establish direct connections with others. Besides, it may be useful for a node to declare some friendly peers as trustncc, just to save time and the CPU power. It is not strictly necessary to get their permission to do so; presently all fedanet instances respond to the respective type of requests properly. However, it might be a good idea to ask if they really don't mind. ****** TYPE: certhub This peer (which possibly belongs to another node, although this is not necessary) works as a ``hub'' for distributing node certs. This means it generally accepts introductions from new nodes, checks their hashes, saves checked keys in its local database and responds on requests for the stored certs. Technically, specifying this flag means our daemon will suggest newcomers with unknown node IDs to introduce themselves to this peer; hence, peers of this type must be specified as ip:port. You might want to always use the ``trustncc'' flag for peers of this type. At that peer, the fedaserv daemon must be configured accordinly, which means it must have the lines 'allow_nodehash yes' and 'intro_accept yes' in its configuration file, AND the properly generated challenge-response table file. ****** TYPE: introducer This peer, typically a more powerful machine working within the same node (e.g., a home machine of the node master), agrees to act as an introducer, which means that we can ask it to introduce our node to the given instance of fedaserv, so that we don't have to do this on our own. Besides, this peer checks foreign node certs forwarded by its siblings (that is, points of the same node), primarily the node itself. This is intended primarily for nodes that run on low-end machines, so that they can delegate introducing work to something powerful. This peer type may (and should, although is not obliged to) be specified by the node.point pair, not by the ip:port, so that the introcuder machine may run behind a NAT of any type, and once it establishes the cryptographic association with the node, the node becomes able to use its service. You might want to use the ``trustncc'' flag for peers of this type. If this flag is not specified, an introducer peer is still able to introduce its node to others, but its cert-checking job is fruitless. Please note the introducer peer MUST run as a point of the same node, otherwise it won't accept our requests.
The intended use for them is something like the following. Nodes are still run mostly on VPS machines. To change this, another major piece of the functionality must be implemented, namely network-wide broadcast messages; those messages will carry announces of the nodes sitting on temporary ports; well, we don't have the thing yet. So let's stick to VPS machines as of now, assuming they are not capable of computing the hashes. Every nodemaster perhaps has a more or less powerful computer at home, for which it's not a problem to take a hash or two, but the problem is that such computers are typically not accessible from the Internet.
So, to run your own introducer/certhub, you just configure a dedicated
fedaserv instance on such a machine (it is strongly
recommended to use a dedicated pseudo-user for this purpose); let this
instance be visible for the Internet using the fedaproxy feature on your
node instance; and configure it to be the introducer peer for
your node, basing on the node.point pair. Be sure to enable the
functions in your serv.conf; see the options
allow_nodehash, intro_issue and
intro_accept, a self-documented example of the file is
doc/serv.conf.
To give you a real-world example, I run my main node at
45.13.38.102:5080, that's the
c508097bd6c347a4a317.254 instance; the same daemon provides a
proxy port for one of the points, namely
c508097bd6c347a4a317.206 (206 is 0xCE in
hexadecimal), and the proxy port number is 52871 (0xCE87).
The point itself runs at my home machine behind NATs. Here's the
respective point configuration on the node instance:
peer c508_ce type proxyuser trustncc introducer node_id c508097bd6c347a4a317 point 206 proxyport 52871
The point itself has the following in its serv.conf:
peer brizo type mynode proxy ip 45.13.38.102 port 5080 # [ . . . ] allow_nodehash yes intro_issue yes intro_accept yes
Everyone's welcome (well, let's say "as of now") to use it as their
certhub/trustncc; to do so, add the following to your
serv.conf:
peer c508_ce type persist trustncc certhub ip 45.13.38.102 port 52871 node_id c508097bd6c347a4a317 point 206
Your daemon will then, first, ask this instance about unknown nodes whether the instance knows them, and will trust node certs signed by this point, without actually computing the hashes; second, your daemon will recommend strangers from the Internet to introduce their nodes to this instance.
However, I hope this certhub will not remain alone for long; please run your own certhubs and share their ip:port locations and node.point IDs.
The daemon's control console (that fedactl thing) now allows
to order your daemon to introduce your node to a hub at the given ip:port.
See the intro command.
Unfortunately, we are still unable to grow the network without human intervention; broadcast message distribution is needed for that. However, we don't have to manually exchange node cert files any longer, and any new network member can connect to existing nodes without asking their masters to do anything; once ready, such a new member can announce the new node (e.g. here on the site, in comments), so we add his/her node as a peer.
Doing this way, we can build a kind of a backbone, which we will need to distribute the broadcast messages (including node location announces). I think 10-12 nodes connected each with all others, running 5-6 publicly available certhubs, will be sufficient for the network to start functioning once I manage to implement node announce distribution.
Thanks to everyone who follows the project and specially to those who supported it with donations!