Storm is the Gzz "storage module." Storm provides an abstraction over storage both on a disk and on the network, meaning that everything above this layer usually doesn't know whether data is stored locally or on the 'net.
Storm stores data in blocks. A block is an immutable sequence of bytes with a MIME-like header. Blocks are identified by a cryptographic hash of their content. Because of this, you really cannot ever change the bytes in a block: If you did, the hash would change, thus the id would change, and thus you would be talking about a different block than before. Just for the flavor, an example block id looks like this: storm:block:01A83D35CADC52B61F125E9884859D0612B5E6BE05.
A block can be used pretty much like a file (where we know the type of the file not from its extension, but from the Content-Type header of the block), except that it cannot be modified. For example, we could store a KWord document in a Storm block, but if we changed anything in the document, we would have to create a new block. The information in a block cannot be updated.
Storm supports pointers as references that can be updated. When we first put the document into Storm, we create a new pointer and make it point to the block. When we have changed the document, we create a new block and make the pointer point to it. After we have changed a pointer's target, its old target is still available on request. This allows us to access the old version of our document if we want to.
(In reality, to save space, we will not the complete versions in different blocks; we'll only store the differences. The details of this are outside the scope of this document.)