|
@@ -8,33 +8,34 @@ been read from other nodes in the network.
|
|
|
|
|
|
|
|
The protocol classify the Events by their state:
|
|
The protocol classify the Events by their state:
|
|
|
|
|
|
|
|
- | Unread | read_confirms < `MAX_CONFIMRS` |
|
|
|
|
|
- | Read | read_confirms >= `MAX_CONFIMRS` |
|
|
|
|
|
|
|
+ Unread: read_confirms < `MAX_CONFIMRS`
|
|
|
|
|
+ Read: read_confirms >= `MAX_CONFIMRS`
|
|
|
|
|
|
|
|
-## Receiving a new `Event`
|
|
|
|
|
|
|
|
|
|
-The new received `Event` with unread status gets add to the `UnreadMessages` buffer after
|
|
|
|
|
-increasing the read_confirms by one.
|
|
|
|
|
|
|
+## InvId
|
|
|
|
|
|
|
|
-The `Event` with read status gets add to the `Model`.
|
|
|
|
|
|
|
+ type InvId = u64;
|
|
|
|
|
|
|
|
-The protocol broadcast the received `Event` to the network again, to ensure every nodes
|
|
|
|
|
-in the network get the Event.
|
|
|
|
|
|
|
+## InvItem
|
|
|
|
|
|
|
|
-## Sending an `Event`
|
|
|
|
|
|
|
+| Description | Data Type | Comments |
|
|
|
|
|
+|-------------- | -------------------- | -------------------------- |
|
|
|
|
|
+| Id | `InvId` | Unique generated integer |
|
|
|
|
|
+| Hash | `EventId` | Hash of Event |
|
|
|
|
|
|
|
|
-A new created `Event` has unread status with read_confirms equal to 0.
|
|
|
|
|
|
|
+## Inv
|
|
|
|
|
|
|
|
-The protocol broadcast the `Event` to the network after adding it to the
|
|
|
|
|
-`UnreadMessages`.
|
|
|
|
|
|
|
+| Description | Data Type | Comments |
|
|
|
|
|
+|-------------- | -------------------- | -------------------------- |
|
|
|
|
|
+| Invs | Vec<`InvItem`> | A list of `InvItem` |
|
|
|
|
|
|
|
|
-## Receiving an `Inv` message
|
|
|
|
|
|
|
+### Receiving an `Inv` message
|
|
|
|
|
|
|
|
An `Inv` message is a confirmation from a node in the network that the `Event`
|
|
An `Inv` message is a confirmation from a node in the network that the `Event`
|
|
|
has been read.
|
|
has been read.
|
|
|
|
|
|
|
|
Confirmation for an `Event` not exist in the `UnreadMessages` list,
|
|
Confirmation for an `Event` not exist in the `UnreadMessages` list,
|
|
|
-A `GetData` message must send back to request the missing `Event`.
|
|
|
|
|
|
|
+The protocol send a `GetData` message to request the missing `Event`.
|
|
|
|
|
|
|
|
The protocol update the `Event` in the `UnreadMessages` list by increasing the
|
|
The protocol update the `Event` in the `UnreadMessages` list by increasing the
|
|
|
read_confirms by one.
|
|
read_confirms by one.
|
|
@@ -44,25 +45,30 @@ The state for updated `Event` change to read when the read_confirms exceed
|
|
|
|
|
|
|
|
The protocol rebroadcast the received `Inv` to the network.
|
|
The protocol rebroadcast the received `Inv` to the network.
|
|
|
|
|
|
|
|
-## Sending an `Inv` message
|
|
|
|
|
|
|
+### Sending an `Inv` message
|
|
|
|
|
|
|
|
On receiving an `Event` with unread status from the network, The protocol send back
|
|
On receiving an `Event` with unread status from the network, The protocol send back
|
|
|
an `Inv` message to confirm that the `Event` has been read.
|
|
an `Inv` message to confirm that the `Event` has been read.
|
|
|
|
|
|
|
|
-## Receiving a `GetData` message
|
|
|
|
|
|
|
+## GetData
|
|
|
|
|
+
|
|
|
|
|
+| Description | Data Type | Comments |
|
|
|
|
|
+|-------------- | -------------------- | -------------------------- |
|
|
|
|
|
+| Invs | Vec<`EventId`> | A list of `EventId` |
|
|
|
|
|
+
|
|
|
|
|
+### Receiving a `GetData` message
|
|
|
|
|
|
|
|
The protocol search in both `Model` and `UnreadMessages` for requested `Event`
|
|
The protocol search in both `Model` and `UnreadMessages` for requested `Event`
|
|
|
in `GetData` message.
|
|
in `GetData` message.
|
|
|
|
|
|
|
|
-## Add new `Event` to `Model`
|
|
|
|
|
|
|
|
|
|
-For the `Event` to be successfully add to the `Model`, the protocol check if
|
|
|
|
|
-the previous `Event`'s hash inside the `Event` is exist in the `Model`.
|
|
|
|
|
|
|
+## UnreadMessages
|
|
|
|
|
|
|
|
-In case the check for previous `Event` failed The protocol
|
|
|
|
|
-send a `GetData` message requesting the previous `Event`.
|
|
|
|
|
|
|
+| Description | Data Type | Comments |
|
|
|
|
|
+|-------------|---------------------------- | -------------------------------------------------------------------------------------|
|
|
|
|
|
+| Messages | HashMap<`EventId`, `Event`> | Hold all the `Event`s that have broadcasted to other nodes but haven't confirmed yet |
|
|
|
|
|
|
|
|
-## Add new `Event` to `UnreadMessages`
|
|
|
|
|
|
|
+### Add new `Event` to `UnreadMessages`
|
|
|
|
|
|
|
|
To add an `Event` to `UnreadMessages`, the protocol first must check the validity of
|
|
To add an `Event` to `UnreadMessages`, the protocol first must check the validity of
|
|
|
`Event`.
|
|
`Event`.
|
|
@@ -70,13 +76,19 @@ To add an `Event` to `UnreadMessages`, the protocol first must check the validit
|
|
|
The `Event` is not valid in the network if it's too far in the future from now,
|
|
The `Event` is not valid in the network if it's too far in the future from now,
|
|
|
or too far in the past from now.
|
|
or too far in the past from now.
|
|
|
|
|
|
|
|
-## Updating `UnreadMessages` list
|
|
|
|
|
|
|
+### Updating `UnreadMessages` list
|
|
|
|
|
|
|
|
The protocol continually broadcast unread `Event` to the network
|
|
The protocol continually broadcast unread `Event` to the network
|
|
|
after a certain period of time(`SEND_UNREAD_EVENTS_INTERVAL`),
|
|
after a certain period of time(`SEND_UNREAD_EVENTS_INTERVAL`),
|
|
|
Until the state of `Event` updated to read.
|
|
Until the state of `Event` updated to read.
|
|
|
|
|
|
|
|
-## Synchronization
|
|
|
|
|
|
|
+## SyncEvent
|
|
|
|
|
+
|
|
|
|
|
+| Description | Data Type | Comments |
|
|
|
|
|
+|-------------|---------------- |------------------------------ |
|
|
|
|
|
+| Leaves | Vec<`EventId`> | hash of `Event`s |
|
|
|
|
|
+
|
|
|
|
|
+### Synchronization
|
|
|
|
|
|
|
|
To achieve complete synchronization between nodes, the protocol send a
|
|
To achieve complete synchronization between nodes, the protocol send a
|
|
|
`SyncEvent` message every 2 seconds to other nodes in the network.
|
|
`SyncEvent` message every 2 seconds to other nodes in the network.
|
|
@@ -87,3 +99,37 @@ On receiving `SyncEvent` message, The leaves in `SyncEvent` should match the
|
|
|
leaves in the `Model`'s tree, Otherwise the protocol send `Event`s which are the childern of
|
|
leaves in the `Model`'s tree, Otherwise the protocol send `Event`s which are the childern of
|
|
|
`Event`s in `SyncEvent`
|
|
`Event`s in `SyncEvent`
|
|
|
|
|
|
|
|
|
|
+## Seen<ObjectId>
|
|
|
|
|
+
|
|
|
|
|
+This used to prevent receiving duplicate Objects.
|
|
|
|
|
+The list will contains only 2^16 ids.
|
|
|
|
|
+
|
|
|
|
|
+| Description | Data Type | Comments |
|
|
|
|
|
+|-------------|--------------- |------------------------------ |
|
|
|
|
|
+| Ids | Vec<ObjectId> | Contains objects ids |
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+## Receiving a new `Event`
|
|
|
|
|
+
|
|
|
|
|
+The new received `Event` with unread status add to the `UnreadMessages` buffer after
|
|
|
|
|
+increasing the read_confirms by one.
|
|
|
|
|
+
|
|
|
|
|
+The `Event` with read status add to the `Model`.
|
|
|
|
|
+
|
|
|
|
|
+The protocol broadcast the received `Event` to the network again, to ensure every nodes
|
|
|
|
|
+in the network get the Event.
|
|
|
|
|
+
|
|
|
|
|
+## Sending an `Event`
|
|
|
|
|
+
|
|
|
|
|
+A new created `Event` has unread status with read_confirms equal to 0.
|
|
|
|
|
+
|
|
|
|
|
+The protocol broadcast the `Event` to the network after adding it to the
|
|
|
|
|
+`UnreadMessages`.
|
|
|
|
|
+
|
|
|
|
|
+## Add new `Event` to `Model`
|
|
|
|
|
+
|
|
|
|
|
+For the `Event` to be successfully add to the `Model`, the protocol check if
|
|
|
|
|
+the previous `Event`'s hash inside the `Event` is exist in the `Model`.
|
|
|
|
|
+
|
|
|
|
|
+In case the check for previous `Event` failed The protocol
|
|
|
|
|
+send a `GetData` message requesting the previous `Event`.
|