A number of solutions have been proposed to address the free-riding problem in peer-to-peer file sharing systems. The solutions are either imperfect-they allow some users to cheat the system with malicious behavior, or expensive-they require human intervention, require servers, or incur high mental transaction costs. We propose a method to address these weaknesses. Specifically, we introduce a utility function to capture contributions made by a user and an auditing scheme to ensure the integrity of a utility function's values. Our method enables us to reduce cheating by a malicious peer: we show that our approach can efficiently detect malicious peers with a probability over 98%.