I've noticed that Parity and Geth will return the following error when sending a standard transaction with less than 21,000 gas:
"Transaction gas is too low. There is not enough gas to cover minimal cost of the transaction (minimal: 21000, got: X). Try increasing supplied gas."
Is this enforced at the protocol level? Or is it possible for someone to run a custom node and generate a valid transaction that can be broadcast to the network with less than the minimum gas? (even though I'm assuming if this is possible the transaction will just get included in a block and run out of gas).