Twine uses IPLD to encode its data. There are two data structures: Pulses, and Chain metadata.
Pulses are logically grouped as chains, which act as proxies for ownership. Generally, a chain is produced for a single purpose or use case by a single process and owner. Every pulse of every chain is also linked (via hash-linking) to pulses of other chains, thus forming the larger Tapestry. Chain metadata stores meta information about the construction of the chain, including the public key for provenance verification.
Hash-linking of the data structures is facilitated by the process of content addressing and CIDs. With content addressing, data is referenced by its hash instead of its location using a special identifier called a Content ID (CID). A CID is constructed using the hash of serialized data, meta-information about the serialization method, hash algorithm, format, and version of the CID itself. This self-descriptive CID is used as both an identifier for retrieval of the original data, as well as a checksum to verify its integrity. Since CIDs contain a hash of the data, they can be used for the purposes of hash-linking.
Content addressing and CIDs were established as part of the distributed peer-to-peer filesystem IPFS, however IPFS is not necessary for Twine data.
Both Pulses and Chain metadata follow a similar outer structure. What distinguishes them is the type of their `content` property.
Chain Metadata structures store information about the chain as a whole. They must be retrieved in order to verify the signatures of Twine data structures.