When a new opennet node is created, we create 40 ConnectionTokens.

A ConnectionToken is basically just a public/private keypair.

In order to validate the tokens and thus be able to use them, we ask 5 
seednodes to sign our tokens. The seednodes require CAPTCHAs or some similar 
basic scarcity mechanism that can be dealt with during the installation process 
(one CAPTCHA per node, to sign the whole batch of tokens). Unlike WoT CAPTCHAs, 
these can be generated once for each challenge, with limits on how many can be 
sent per connection and IP address (no more than N over period T). These limits 
could perhaps be shared between the seednodes, possibly stored on Freenet in a 
similar mechanism to what is described below. CAPTCHAs would also have a time 
limit, to make it harder to reuse them or farm them out. Also, we can use any 
kind of centralised or networked captcha - for instance, the 
OCR-of-ancient-texts form - because the seednodes are not even pretending to be 
invisible. If you need to be invisible you need to use darknet, period.

To actually use our tokens:
- When we connect to a node, we present a ConnectionToken, with its initial 
validation.
- Every X period, each node we are connected to issues a challenge. This is 
just a random nonce (with an appropriate prefix), plus the current time and our 
current IP address. We sign it using the token and return it. The token is then 
inserted, to two separate locations (for robustness). If the inserts collide, 
we disconnect and remove the node from our peers list. 

The location we insert a ConnectionToken to will depend on the hash of the 
pubkey and the time (quantised to the period X). The original token signature 
is checked, and so are the validation signatures. Hence these cannot be forged 
to boot a node off the network.

Up to this point, we have created scarcity in simultaneous connections: For the 
price of solving a few CAPTCHAs, plus limits on IP address reuse, the announcee 
gains the ability to use 40 connections.

We can then add two more layers:

1. We can limit by IP address overall.

We route the inserts by IP+time, rather than (or as well as) by hash+time. 
Since every node involved can verify the validation signatures, there is no 
serious danger of spam attacks. We allow a certain, limited number of 
collisions - given an authority and a size limit, it is safe and reasonable to 
allow a single slot to return multiple results.

A possible attack would be obtaining a bunch of tokens and then inserting 
tokens with a bogus IP address to deny access to a specific IP address or IP 
range. One way to deal with that would be forcing the inserter to prove 
posession of the IP address, e.g. by getting several seednodes to sign a dated 
certificate. This would mean more load on seednodes, and traffic to the 
seednodes every time you change IP address, but it would be small, and traffic 
to the seednodes every time you change IP is pretty much the reality already.

Whether we want to limit by larger ranges is another question. It's possible 
but there are worries that if Freenet is popular on a specific ISP, there might 
be a legitimate reason for many people being on the same IP range?

2. We can require hashcash for renewals.

Hashcash is problematic because slow computers and fast computers differ by a 
large factor in their abilities. However, if an attacker can obtain lots of 
CAPTCHA solutions relatively cheaply, it would be useful to have an ongoing 
cost for each announced identity. Even if that ongoing cost is relatively small 
it could be costly if the attacker is trying to overwhelm a large network.

So the proposal is that initially we allow the node to connect just on the 
strength of the CAPTCHA, but after a certain time period we require a hashcash 
solution. This could be based on the identity hash, but it would probably be 
better if it was issued by the currently connected peer. It would be included 
in the insert, and would include the time of issuance with a fixed deadline for 
completion. It would be provably solvable (e.g. H(A | X) last N bits = Y, find 
X), and ideally would involve enough branching that GPUs don't help much. If 
the node changes connections, it would not go away, because the node would look 
up the previous insert and see the puzzle there. The deadline could be adjusted 
automatically for downtime: We don't want to make life more difficult for 
low-uptime nodes. We would use a TUK-style request, similar to what is proposed 
for IP addresses, to find the last such insert for the identity.


Longer-term question: Can this help to solve the problem of WoT introduction 
without using CAPTCHAs? We could have the seednodes mint blind coins, possibly 
using scarcity in IPs and hashcash as well e.g. requesting a coin on the basis 
of a token? Interesting idea, but there is probably a simpler solution: We 
could assume the anti-Sybil mechanism described above works, and use exactly 
the same mechanism proposed for darknet: Each connection can generate one 
introduction token or Scarce SSK per X period per link. Which gives us an 
unspammable space which can be used for introduction to the WoT or DNS-style 
services.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part.
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20101203/45d160da/attachment.pgp>

Reply via email to