If I was to build bitcoin from scratch, I would probably define CBlock and CTransaction, and not CBlock, CTransaction, and CMutableTransaction; CMutableTransaction seems to me to be what should be CTransaction and CTransaction what should be const CTransaction just like there's CBlock and const CBlock and then there is CTransactionRef which could easily be made into std::shared_ptr<const CTransaction> (wait, I think it already is).
There's a bunch of code changes which concern themselves with that distinction, some rejected/closed, some merged:
This seems to be a constant source of confusion and for unnecessary code churn. Would it not maybe be better to get rid of CMutableTransaction once and for all in favor of a clear distinction as in CTransaction and const CTransaction?