Reentrancy ใน compound V2
มาอ่าน audit report ไวๆกัน
พอดีกำลังอ่าน audit report ของ compound V2 ตาม link https://github.com/trailofbits/publications/blob/master/reviews/compound-2.pdf เลยขอมาสรุปไวๆ ไว้หน่อย
โดยในตัว contract มีโอกาสที่จะเกิด reentrancy ได้ตาม code
เนื่องจาก doTransferOut เป็น external call ซึ่งทำให้สามารถ reentrancy เข้ามาใน function นี้ใหม่ได้
จริงๆโดยปกติแล้วการแก้ reentrancy ทำได้ด้วย pattern check-effects-interactions เช่นตัวอย่าง code ด้านล่าง
ซึ่ง doTransferOut เป็นการ interaction แต่การ update state เป็น effect
ดังนั้นเราควรย้าย code เป็นแบบนี้
แต่ปัญหาคือ ถ้าเราย้าย code ไปแล้ว เมื่อ doTransferOut เกิดการ error ตัว state ที่ทำการเปลี่ยนค่าไปแล้วจะไม่ได้ถูก revert
เพราะการ return fail ไม่ได้ revert transaction
ถ้าอยากให้ state revert ได้ จะต้องทำการ manual revert เอง โดยจำค่าก่อน update ไว้ แล้ว rollback ค่าแต่ละ state เอง
ตรงนี้งานค่อนข้างหนักเลย ทาง trail of bit เลยแนะนำให้ไปใช้การ revert/require ปกติ แทนการ return error ตามภาพ
Referrence
https://github.com/trailofbits/publications/blob/master/reviews/compound-2.pdf