Replies: 11 comments 15 replies
-
Thanks for putting this together. This is great. A few questions:
|
Beta Was this translation helpful? Give feedback.
-
This is very logical.
|
Beta Was this translation helpful? Give feedback.
-
Just to clarify, this would be handled inside the Client? When would that cache be invalidated/updated? |
Beta Was this translation helpful? Give feedback.
-
Why not just make this a |
Beta Was this translation helpful? Give feedback.
-
For encryption, I think the thing that makes the most sense here is actually to write a small ECIES library in Rust and expose it to all the other SDKs via FFI. There is a decent looking ECIES crate we can use, and we can create some protos that add a signature inside the encrypted payload. It's a good warm-up for our future WASM needs. Gives us a very small library we can expose via WASM that'll be way less complicated than v3, so we can verify it's working end to end. |
Beta Was this translation helpful? Give feedback.
-
Updated the proposal to just remove the client option since adding the flag means no changes need to happen to existing APIs. I also included the new field on conversation that denotes its allowed state. |
Beta Was this translation helpful? Give feedback.
-
Hi everyone! I like the approach the protocol is taking in general, but I think the block list should understand more than just addresses. From what I've seen, most of the time, spammers use a different address for each message. This would make blocking addresses kind of useless and might end up converting "pending tabs" into spam folders that no one would check. The problem with managing blocking at the address level is that creating addresses is virtually free. The only cases I saw a spammer reusing an address is when it is associated with an ENS. For example, I received messages from "cb-security.eth" on multiple wallets. If the block list is only at the address level, it could be profitable for the spammer to spam hundreds of users once a day, move the ENS to a different address, and repeat. However, if the block list also includes ENS/UD, then the user can block a certain domain forever. This will also be good for a UX perspective. An end-user that blocks certain ENS and the other day receives again a message from than ENS might believe the protocol is broken (without realizing the ENS is on a different address). I believe when a user blocks a conversation (normally displayed with an ENS/UD), the block should happen both at the address and domain level. This suggestion shouldn't imply a big change in the implementation. Instead of accepting addresses, the protocol could accept to block/allow any string. Then, when an app is blocking an address, it can send both the address and the displayed domain. The same when checking if an address is allowed/blocked. |
Beta Was this translation helpful? Give feedback.
-
I support the idea of defaulting conversations to If the majority of addresses are going to be
|
Beta Was this translation helpful? Give feedback.
-
@nakajima I think we can do better on the privacy front here. There is no reason other users on the network need to be able to find this data, so I don't see any reason to make the topic associated with a particular account. The existing private-store data needs to be in an obvious location because of a chicken and egg problem (how can I create an unguessable topic without my keys...which are found in the privatestore). Seeing when messages were written to these topics would leak times that the user was online and actively blocking/allowing users. We could derive some sort of topic identifier using HKDF of encryption keys used for the topic. That way only the holder of the keys would know where to look. This would be very similar to our solution to deterministic topics used for V2 conversations. |
Beta Was this translation helpful? Give feedback.
-
Thank you very much @saulmc for this proposal. Following some of the comments here, I think it is crucial for most clients to synchronise on how we'll migrate from client-based consent to protocol-based consent, and how we'll keep being synced in the future. Please find below a proposition on how to handle it as clients. Constraints
Principles
Solution
After that
Overall, the most crucial aspect is to respect a previous input by another client in order to avoid clients constantly overwriting the state of a given user. |
Beta Was this translation helpful? Give feedback.
-
As we wrap up implementation, we are looking for feedback on two proposed refinements to the original proposal: 1) Rename "Allowed / Blocked" to "Allowed / Denied".The terms "Allowed / Blocked" closely resemble the ubiquitous "Accept / Block" UI pattern. Although this UI pattern is compatible with portable consent, other patterns such as "Subscribe" and "Enable notifications" are also supported. The protocol's language should avoid implying specific user interface decisions. "Allowed / Denied" provides a more UI-neutral terminology. This also paves the way for the use of the increasingly common terms "allowlist" and "denylist" when referencing lists of allowed/denied addresses. For reference, consider Google's style guide on the matter. 2) Include business logic for implied consent scenariosWhen a user initiates a new conversation, developers need to add the new conversation peer to the user's allowlist. Failing to do this makes the new conversation hard to locate in apps that filter Similarly, responding to a conversation in apps lacking portable consent leaves consent as Given these situations, it's reasonable to believe the user wants to continue the conversation. To address this, we'll automatically set the consent state to |
Beta Was this translation helpful? Give feedback.
-
Authors: @nakajima, @saulmc
Stage: Draft
Abstract
Make consent portable by introducing network-level allow and block lists.
Problem
To safeguard users, XMTP inbox apps are adopting UX designs that categorize conversation consent into three states: allowed, blocked, and pending (neither allowed nor blocked). For instance, an app may place pending conversations on a separate tab, while fully hiding conversations from blocked addresses.
As there is currently no standard method to share consent state changes across the network, actions taken in one app won’t reflect in others. This leads to inconsistent experiences for users and hinders the potential network effect of XMTP for developers.
Proposed Solution
We should give clients the ability to send and retrieve background messages that indicate when users allow or block addresses. This enhancement will mitigate spam at the network level by empowering users with a “block once, block everywhere” capability, while also providing developers with explicit indications of user consent.
Functional Requirements
As a user, I can
As a client app developer, I can
Specification
We propose introducing a new message topic: "privatestore-(address)/allowlist"
Messages published to this topic should be encrypted
AllowList
objects:Clients will be able to generate lists of “allowed” and “blocked” addresses by replaying the messages in this topic.
SDK Support
A new
ConsentState
type will be introduced to describe the state of the conversation based on whether the peer address is allowed or blocked.Conversation
will have a new field,consentState
that will return anConsentState
for the conversation. Apps can use this to filter out unknown or blocked conversations from their main conversation lists and show blocked/unknown conversations in a more appropriate place in their UIs.client.contacts.allowed()
client.contacts.blocked()
client.contacts.allow([string])
client.contacts.block([string])
Other considerations
Clients will need to locally cache the allow and block lists in order to properly apply filters to conversations on initial load.
Clients are free to use conversation consent state as they see fit to deliver the best inbox experience to their users.
Beta Was this translation helpful? Give feedback.
All reactions