Skip to content

gossipsub partial messages extension: Avoid sending update message that could be inferred. #704

@MarcoPolo

Description

@MarcoPolo

Consider this simple example:

A message has three parts and there are two nodes A and B. Node A has the first part and node B has all parts. They exchange the following messages.

Node A sends partsMetadata = 100 to Node B.
Node B responds with the second part (and its partsMetadata = 111)
Node A sends Node B partsMetadata = 111.

Notice that the last message is not necessary. Node B knows it has given the second part to node A. Node B can infer that Node A's partsMetadata will be 111 when it receives the message.

Node A tracks its peer's view of its own partsMetadata and SHOULD send updates when that view is incorrect.

In the above case Node A should know that Node B has updated its view of A's partsMetadata to be 111 and thus not need to send an update.

This should work whether the validation of a message part is async or not. It should work if A got part 2 from another peer and have an updated partsMetadata of 110. "Should work" is short hand for "Peer A should not send a updated partsMetadata to Peer B".

There are different solutions to this problem, but I'd like to focus on solutions that don't involve changes to the protocol messages (e.g. adding more data in messages). I'll follow up here with one possible solution.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions