Terminology
These words are used throughout the spec. Here's their canonical definition:
A container is a generic word for a set of files, folders, and symlinks. It is
also a protobuf message that encodes information about a set of files, folders and
symlinks such as their path (relative to the container's root), permissions and sizes,
but not their contents.
A diff is the result of a comparison between two containers, old and new.
It contains a list of operations required to build new's files from old's files,
re-using data when possible.
A patch contains all the information needed to apply an upgrade: both the old
and new container, and their diff. Patches are stored in a standard file format.
A signature contains one container and a series of hashes corresponding to fixed-size blocks
of the container's files. Signatures are stored in a standard file format.
/dev/null is the empty container: it contains no files, folders or symlinks.
A diff against /dev/null is a suitable way to store the initial version of
a container.
An archive is a compressed container stored in a single file (e.g. build.zip,
build.7z, etc.). They're the preferred way of storing a particular version of
a container, and are suitable for diffing, although at the cost of on-the-fly
decompression.
A block is a fixed-size series of bytes that belong to a file. Folders and symlinks
do not have blocks. Files usually end with short blocks, which are smaller than
regular blocks, except if their size is a multiple of the block size.