ipfs / specs

Technical specifications for the IPFS protocol stack
https://specs.ipfs.tech
1.15k stars 232 forks source link

New IPNS key types #448

Open ianopolous opened 8 months ago

ianopolous commented 8 months ago

We're hoping to use new post-quantum (or hybrid) key types in IPNS in the next few years in Peergos and wanted to start a discussion about how to add new key types. In particular, ones that have 8k-17k signatures. The latter of which would put them over the 10k IPNS record limit.

The bigger issue is that you can't start using a new key type until most clients have upgraded to support it.

NB: I'm not talking about peerIds here if they can be decoupled.

aschmahmann commented 8 months ago

Some thoughts here:

In order to support the new key types as a MAY along with Secp256k1 and ECDSA we need one of two things:

  1. libp2p adopts these keys and adds them to the supported key types with new numbers in the KeyType enum https://github.com/libp2p/specs/blob/d2106f43e878ae4c3a1c6465a7c329835290fe22/peer-ids/peer-ids.md#keys
  2. We introduce a new way to refer to IPNS identifiers as strings that does not match the PeerID format since the current format is tied to the libp2p-key codec https://github.com/ipfs/specs/blob/f68df0cbdeaddea8e5efc33d85ac54e43e929017/src/ipns/ipns-record.md?plain=1#L118-L127

Make it libp2p's problem

Diverge from libp2p-key


Even if going with libp2p-key there's still the issue of whether increasing the record size everywhere even makes sense.

Also, as a bonus the approach where you store pointers instead of records in places like the Amino DHT also means that fewer systems need to upgrade to support new key types in order for the end-to-end user experience to work (e.g. no need for the Amino DHT network to update to support the new key type, just for the providing and client nodes).

lidel commented 8 months ago

Realistically, decoupling IPNS from libp2p-key codec across ecosystem will be way more work than the actual work related to adding a new key type. A side-quest that is bigger than the main quest of adding new key type.

Due to ecosystem effects, keeping them in sync always be way less work than decoupling, and (imo) as long it is specified as MAY, we don't have to add new key type support to every libp2p impl., just reserve the number in protobuf defn. to ensure libp2p and IPNS do not end up with conflicting codes.

@ianopolous if you are interested in pushing the IPNS specification work forward, and want to focus on new key type alone, introducing a new key type by reserving enum in libp2p-key protobuf definitions at both places feels like the first step.

Itwill ensure peerid and ipns remain in sync, and we don't run into problems when libp2p adds something new:

  1. Open PR that adds it to https://github.com/libp2p/specs/blob/master/peer-ids/peer-ids.md#keys (and include information on how signature is generated)
  2. Open IPIP (template) that adds the same to https://specs.ipfs.tech/ipns/ipns-record/#key-serialization-format

Other details, such as increasing max size of IPNS record, would be part of the IPIP PR.

ianopolous commented 8 months ago

Thanks @lidel ! It will be some time before I can get to this, but I will do that.