Substrate is configurable enough that extrinsics can take any format, in theory. In practice, runtimes tend to use our UncheckedExtrinsic
type to represent extrinsics. In Polkadot, this is configured here at the time of writing.
What follows is a description of how extrinsics based on this type are encoded into bytes. These bytes can then be submitted to a chain for inclusion in a block (this is how we make changes to the state of a chain), and are ultimately stored in the body of a block.
At a high level, all extrinsics are formed from concatenating some details together, ie: