I have been recently having a look through Bitmessage and would like to gain a greater understanding about why certain choices, e.g. Streams, were made etc.
So this is my understanding of the use of Streams & POW in Bitmessage. Please correct me if I am wrong...
[POW]
Proof of work acts as a limiter on the ability of someone to post a message over a broadcast channel.
- It serves to deter SPAM.
- By making it more expensive to send a message, it acts as a way to reduce the number of messages sent over a channel, reducing the bandwidth+storage costs of each node.
The POW difficulty need not be static but could adapt dynamically in an effort to constrain the bandwidth + storage requirements of each node to some fixed level
- One could have different POW requirements for each channel
[STREAMS]
If there were no Streams, we would be left with a best-effort broadcast channel.
- This would force each node to be responsible for the relaying and storage of a huge number of messages.
- Or the POW difficulty would be so high as to render the system useless
- It would not scale.
So we partition the network into a number of Streams, where each Stream is a best-effort broadcast channel.
- Each identity is assigned to one stream (it is fixed in the BM address).
- Some streams may be more active than others, node requirements(bandwidth/storage) will vary.
Partitioning is an effort to even out the network load.
- The only opportunity to do this load balancing and create a new partition is when a user wants to create an identity (BM address)
- If the current stream is deemed 'too busy', the identity will be created on a brand new stream
Once a stream is established, there is nothing the network can do to make itself more efficient and more evenly distribute the load on the nodes.
- It must resort to making it more difficult to post messages, by increasing POW difficulty
- This will likely not be in the user's interest
At my current level of understanding, it seems to me that Streams are quite a rigid mechanism. I see two problems:
- Once a stream is established, it cannot be re-partitioned because each identity is directly linked to a particular stream
- There is a trade-off between cost_to_run_a_node and level of anonymity. If a stream is quiet, the node's own messages will be less well hidden than if a stream was really chatty. In the current system, the user is less empowered to make a choice based on his own individual needs.
Thoughts ...?