Another thing we ought to do, if you would like, is to arrange a Skype
call with you soon. A live question-and-answer discussion is faster and
more productive that email messages back and forth, in my experience,
with the only drawback that the conversation is not available to others
afterwards.
Thanks to your initiative, in the next week or so I plan to
significantly expand the "Rhizome" page on our Wiki, with as much
information as I can, as clearly as possible, hopefully with diagrams.
Some ideas we have considered and rejected, for reasons that we have
not explained publicly, but ought to.
[…]
and how we plan to solve certain problems, and which problems we do
not want to solve.
Rhizome should be service-agnostic.
Rhizome software does not encapsulate any application-specific logic
Some ideas we have considered and rejected, for reasons that we have not explained publicly, but ought to.
Anyone should be able to write a service over Rhizome without modifying Rhizome protocol or implementation at all. In other words, Rhizome should support, as far as possible, any store-and-forward service, present or future.
If you accept this hypothesis, then all MeshMS related fields (sender, recipient, message signature…) should be moved out of Rhizome and implemented in MeshMS layer (in other words, in Rhizome payload).
the idea is to add ascore
field in Rhizome bundles […] which will be set only by the upper services.
Rhizome does not rank (prioritise) based on the content of payloads
most meta data is created by Rhizome to identify and prioritise the payload, eg,id
,filesize
,filehash
,version
, etc.
Rhizome does not record the originating or transited nodes of any payload, so nodes cannot rank (prioritise) payloads based on point of origin, only on available meta data
Some more thoughts/remarks/questions.
About services and current implementation
I said:Rhizome should be service-agnostic.
We seem to agree on that point:Rhizome software does not encapsulate any application-specific logic
However, the current implementation does (ex1, ex2).
Therefore, if someone wants to create a new service, they cannot without modifying Rhizome itself ("Unsupported service").
What do you think about it?
Do you think anyone should be able to create a new service over Rhizome without modifying it? Or is it one of the ideas you rejected?In other words, is it something to be fixed, or is it the expected behaviour?Some ideas we have considered and rejected, for reasons that we have not explained publicly, but ought to.
About layer separation
I wrote:
Anyone should be able to write a service over Rhizome without modifying Rhizome protocol or implementation at all. In other words, Rhizome should support, as far as possible, any store-and-forward service, present or future.
I think this is very important. But I added:If you accept this hypothesis, then all MeshMS related fields (sender, recipient, message signature…) should be moved out of Rhizome and implemented in MeshMS layer (in other words, in Rhizome payload).
I was wrong. I forgot one import point: Rhizome is not only a transfer protocol, it manages storage too. So a user must (at least) be able to extract bundles from some criteria (service, sender, recipient, …). Therefore, Rhizome must be able to identify some of these meta-data. The good news is that it does not prevent the service-agnosticism ;-)
About manifests table in database
Why do you store some fields both as manifests table columns and as key=value in manifests.manifest value?
About ranking
I wrote:
the idea is to add ascore
field in Rhizome bundles […] which will be set only by the upper services.
When I wrote that, I had in mind the ability to forget/delete old/irrelevant messages from a chatroom or a µ-blogging service. It can have some drawbacks (e.g. someone can force priority max for all its bundles).
You say exactly the opposite:Rhizome does not rank (prioritise) based on the content of payloads
Could you explain your reasons, please?
In that case, Rhizome can only prioritise by meta-data:
most meta data is created by Rhizome to identify and prioritise the payload, eg,id
,filesize
,filehash
,version
, etc.
But do you think these meta-data are interesting enough for prioritising?
Also, you wrote:Rhizome does not record the originating or transited nodes of any payload, so nodes cannot rank (prioritise) payloads based on point of origin, only on available meta data
I don't understand: what is manifests.sender in Rhizome database?
(but I agree, rank must not depend on originating nodes)
Thank you for your answers.
®om
--
About services and current implementation
I said:
Rhizome should be service-agnostic.We seem to agree on that point:
Rhizome software does not encapsulate any application-specific logicHowever, the current implementation does (ex1, ex2).
Therefore, if someone wants to create a new service, they cannot without modifying Rhizome itself ("Unsupported service").
About layer separation
I wrote:
Anyone should be able to write a service over Rhizome without modifying Rhizome protocol or implementation at all. In other words, Rhizome should support, as far as possible, any store-and-forward service, present or future.
�
I think this is very important. But I added:
The sender and recipient fields are potentially of use to applications besides MeshMS.� Any end-to-end protocol, such as voice mail, file transfer, email, etc, will need to use them.� We will formalise and standardise the way these fields are used by Rhizome, hopefully in the most useful and general manner, then applications can make use of their semantics as they wish.If you accept this hypothesis, then all MeshMS related fields (sender, recipient, message signature�) should be moved out of Rhizome and implemented in MeshMS layer (in other words, in Rhizome payload).
I was wrong. I forgot one import point: Rhizome is not only a transfer protocol, it manages storage too. So a user must (at least) be able to extract bundles from some criteria (service, sender, recipient, �). Therefore, Rhizome must be able to identify some of these meta-data. The good news is that it does not prevent the service-agnosticism ;-)
About manifests table in database
Why do you store some fields both as manifests table columns and as key=value in manifests.manifest value?
About ranking
I wrote:
the idea is to add ascore
field in Rhizome bundles [�] which will be set only by the upper services.
When I wrote that, I had in mind the ability to forget/delete old/irrelevant messages from a chatroom or a �-blogging service. It can have some drawbacks (e.g. someone can force priority max for all its bundles).
You say exactly the opposite:
Rhizome does not rank (prioritise) based on the content of payloads
Could you explain your reasons, please?
This is both a pragmatic and idealistic objective.
Also, you wrote:
Rhizome does not record the originating or transited nodes of any payload, so nodes cannot rank (prioritise) payloads based on point of origin, only on available meta data
I don't understand: what is manifests.sender in Rhizome database?
As you rightly point out, the manifest service field is a blatant violation of this requirement
We also discussed dividing the manifest into two grades of meta-data: that which is interpreted by Rhizome when ranking and transmitting, and that which is not.
The recipient could not decrypt the content if the sender was not present.
The encryption scheme we are supporting for meshms or other directed services needs to know one public key and one private key from the same pair
servald commandline could write binary results directly to stdin
You need to know the private key of the sender???The encryption scheme we are supporting for meshms or other directed services needs to know one public key and one private key from the same pair
About performance issues
If I want to retrieve the data contained in several bundles (imagine each bundle contains a µ-blog message), I have to:
- execute "servald rhizome list …" (ServalD.rhizomeList(…))
Thus, If there are n bundles, I have n+1 commands to execute. Each command will result in process creation and sqlite open/close. This is very inefficient (with only 2 bundles, it takes 800ms).
- get the bundle ids (parsing the result / using the Cursor)
- for each bundle id:
- execute "servald rhizome extract …" (ServalD.rhizomeExtractFile(…))
- parse the created file
Some ideas for later improvements (to be discussed):
- direct file storage instead of sqlite (open/close and writing is not so "lightweight"), which would avoid concurrency access issues too;
- servald commandline could write binary results directly to stdin (instead of writing to a file), with several results at once (bid1 | payload1_length | payload1 | bid2 | payload2_length | payload2 | …).
- any other?
Thank you for your time, ideas and discussions ;-)
®om
--