Erasure Codes for Optimal Node Repairs in Distributed Storage Systems