All the Substrate-based chains that I know of have no transactions in the genesis block.
The genesis block is the same data structure as all other blocks and therefore does have a body and a
Vec<Extrinsic> that could have some extrinsics in it.
I'm curious: was Substrate intentionally designed this way, or it just kind of turned out this way. And if it was not an intentional design decision, where might I look to make a genesis block that does have transactions in it?
Semantics of Genesis Transactions
I can think of two reasonable ways the semantics of such transactions might work.
They are not executed and are basically just grafitti. They are a way to summarize the chain's pre-history at launch time.
They are executed on top of some pre-state just like every other block. If this approach is taken, it would mean that any state set up in eg a chain spec file would be genesis pre-state.
Note that these two semantics are identical in the edge case where there are no transactions in the genesis block. So picking either one of them would be safe and not "break" old chains in any way.
Usecases for Genesis Transactions
I can think of a few usecases for having transactions in the genesis block.
Setting a timestamp inherent in the genesis block.
Remark: Chancellor on brink of Second bailout for Banks. (See also this question.)
A more elegant way to express genesis state. This usecase relies on semantics #2. Many chains could start with a truly empty genesis pre-state, and then execute the genesis transactions to get the desired genesis state. As a classic example, consider a cryptocurrency that has no coins existing in the genesis pre-state and then has some mint extrinsics in the genesis block to create the initial distribution. This has the advantage that the genesis state can be constructed from the genesis block itself instead of distributed separately.