Understanding Byzantine Failures in Distributed Systems