We've been using the metaphor of a letter: the envelope is where the sending and receiving addresses are written. To protect metadata privacy, both the sending and receiving addresses need to be updated frequently.
NIP-EE group events
{
"id":
"kind": 445,
"created_at":
"pubkey":
"content":
"tags": [
["h",
],
"sig":
}
In the NIP-EE group event, the content field is first encrypted using MLS, and then encrypted again using NIP-44. The NIP-44 encryption is done using a Nostr keypair generated from the MLS exporter_secret to calculate the conversation key value. Keychat follows the same approach. The public key—used as the sender address—is randomly generated, and Keychat does this as well.
The difference lies in the receiving address. In NIP-EE, the receiving address is set using:
"tags": [ ["h",
The h tag represents the Nostr group ID (from the Nostr Group Data Extension). Updating the group ID requires a member to send a commit message.
Keychat, on the other hand, uses:
"tags": [ ["p",
This receiverPublicKey is derived from the MLS exporter_secret, so it updates automatically without the need for a separate commit message.
Keychat uses kind: 1059, as it satisfies the constraints of kind 1059, enabling the integration of both MLS messages and NIP-17 DMs in a unified format.