World Model

Holochain rests on an agent-centric view of the world.  One concequence of this approach means that every Holochain node keeps a representation of what it thinks other nodes are thinking.  We call this representation a node's World-Model.  

We divide this world model into two parts, the "holding" model about what entries in the DHT nodes expect other nodes to be holding, and the "behavior" model of other nodes, i.e. what's their up-time, and latency, have played by the rules, etc.  You can think of the behavior model as a set of metrics each node keeps about other nodes.

Alpha 0 implemented the "holding" part of the world model by using a gossip protocol about the data each node holds by neighborhoods. In this protocol, nodes gossip with eachother about the "DHT puts" they had received as a monotocially increasing index along with the put message fingerprint. 

Alpha 1 includes a different implementation of holding, using an analysis of a node's views on other node's closeness to given entires and thus an assesment of who is "responsible" for holding the entries.  The world model protocol becomes much simpler then because it simply entails asking all other nodes believed to be responsible for an entry to hold that entry.  The response should either be a signed affirmation of holding, or proof that some other node is closer, allowing the request node to update their world model of who's responsible.

This implementation has not been rigorously tested, and futher development on it will be moved to the rust refactor.  To enable the world model holding you can either set the EnableWorldModel property in the app's config.json file, or you can use the HC_HOLDING_INTERVAL=<seconds> environment variable.