**types** provides the custom data types used throughout the rest of the JSON.
**storage** defines all the storage items managed by your contract and how to ultimately access them.
**spec** stores information about the callable functions like constructors and messages a user can call to interact with the contract. It also has helpful information like the events that are emitted by the contract or any docs.
If you look closely at the **constructors** and **messages**, you will also notice a selector which contains a 4-byte hash of the function name and is used to route your contract calls to the correct functions.