  Blockchain systems are designed, built and operated in the presence of
failures. There are two dominant failure models, namely crash fault and
Byzantine fault. Byzantine fault tolerance (BFT) protocols offer stronger
security guarantees, and thus are widely used in blockchain systems. However,
their security guarantees come at a dear cost to their performance and
scalability. Several works have improved BFT protocols, and Trusted Execution
Environment (TEE) has been shown to be an effective solution. However, existing
such works typically assume that each participating node is equipped with TEE.
For blockchain systems wherein participants typically have different hardware
configurations, i.e., some nodes feature TEE while others do not, existing
TEE-based BFT protocols are not applicable.
  This work studies the setting wherein not all participating nodes feature
TEE, under which we propose a new fault model called mixed fault. We explore a
new approach to designing efficient distributed fault-tolerant protocols under
the mixed fault model. In general, mixed fault tolerance (MFT) protocols assume
a network of $n$ nodes, among which up to $f = \frac{n-2}{3}$ can be subject to
mixed faults. We identify two key principles for designing efficient MFT
protocols, namely, (i) prioritizing non-equivocating nodes in leading the
protocol, and (ii) advocating the use of public-key cryptographic primitives
that allow authenticated messages to be aggregated. We showcase these design
principles by prescribing an MFT protocol, namely MRaft.
  We implemented a prototype of MRaft using Intel SGX, integrated it into the
CCF blockchain framework, conducted experiments, and showed that MFT protocols
can obtain the same security guarantees as their BFT counterparts while still
providing better performance (both transaction throughput and latency) and
scalability.
