iZiFinance เป็นโปรโตคอลการเงินแบบกระจายศูนย์ที่ใช้ zkSync ซึ่งเป็นโซลูชันการปรับขนาดเลเยอร์ 2 สำหรับ Ethereum zkSync เปิดใช้งานธุรกรรมที่รวดเร็วและต้นทุนต่ำบน Ethereum ในขณะที่ยังคงรักษาความปลอดภัยและความสามารถในการรวมของเครือข่ายเลเยอร์ 1 อย่างไรก็ตาม การเพิ่มประสิทธิภาพก๊าซยังคงเป็นส่วนสำคัญเมื่อทำการพัฒนาสัญญาอัจฉริยะบน zkSync เนื่องจากจะส่งผลต่อประสิทธิภาพและความสามารถในการทำกำไรของโปรโตคอล
ในการวิเคราะห์นี้ เราจะตรวจสอบหนึ่งในสัญญาหลักของ iZiFinance ซึ่งก็คือ iZiSwapPool.sol และหาวิธีง่ายๆ ในการลดการใช้ก๊าซโดยกำจัดการแสดงออกที่ซ้ำซ้อน
สัญญา iZiSwapPool
สัญญา iZiSwapPool ใช้ตรรกะของกลุ่มสภาพคล่องและการแลกเปลี่ยนโทเค็นบน iZiFinance เป็นไปตามอินเทอร์เฟซ IiZiSwapPool ซึ่งกำหนดฟังก์ชันและกิจกรรมของสัญญา หนึ่งในฟังก์ชันเหล่านี้คือ modifiedFeeChargePercent ซึ่งช่วยให้เจ้าของสัญญาสามารถปรับเปอร์เซ็นต์การเรียกเก็บค่าธรรมเนียมต่อกลุ่มได้ เปอร์เซ็นต์การเก็บค่าธรรมเนียมเป็นพารามิเตอร์ที่กำหนดการกระจายค่าธรรมเนียมการแลกเปลี่ยนระหว่างผู้ให้บริการสภาพคล่องและโปรโตคอล รหัสของฟังก์ชัน modifiedFeeChargePercent เป็นดังนี้:
ฟังก์ชันนี้ยอมรับพารามิเตอร์ประเภท uint24 ที่เรียกว่า newFeeChargePercent ซึ่งแสดงถึงเปอร์เซ็นต์การเรียกเก็บค่าธรรมเนียมใหม่ที่จะตั้งค่า นอกจากนี้ยังมีตัวแก้ไขบางอย่างและต้องมีคำสั่งเพื่อให้แน่ใจว่าเจ้าของเท่านั้นที่สามารถเรียกใช้ฟังก์ชันได้ และ newFeeChargePercent นั้นถูกต้อง การวิเคราะห์รหัส รหัสสัญญานี้เขียนขึ้นใน Solidity ซึ่งแสดงถึงฟังก์ชันของการปรับเปลี่ยนเปอร์เซ็นต์การเก็บค่าธรรมเนียม ดูเหมือนว่าจะได้รับการออกแบบในลักษณะที่ปลอดภัย โดยคำนึงถึงข้อจำกัดที่ใช้ก่อนการปรับเปลี่ยนจริง (บรรทัดที่ 534-536)
อย่างไรก็ตาม บรรทัด 535 need(newFeeChargePercent >= 0, "FP0"); ไม่จำเป็นจริงๆ นี่เป็นเพราะใน Solidity ชนิดข้อมูล uint (จำนวนเต็มที่ไม่ได้ลงนาม) ไม่สามารถเป็นค่าลบได้ uint24 เป็นประเภทจำนวนเต็มที่ไม่ได้ลงนาม ซึ่งมีตั้งแต่ 0 ถึง 2^24 - 1
ดังนั้น การตรวจสอบว่า newFeeChargePercent มากกว่าหรือเท่ากับ 0 นั้นถือเป็นการสรุปซ้ำ เนื่องจากจำนวนเต็มที่ไม่ได้ลงนามต้องไม่น้อยกว่า 0 ตามคำจำกัดความ ดังนั้น บรรทัดนี้ถือเป็นคำซ้ำซากและสามารถลบออกได้อย่างปลอดภัยโดยไม่กระทบต่อการทำงานของโค้ดหรือทำให้เกิดช่องโหว่ด้านความปลอดภัยใดๆ บรรทัดที่ต่อท้าย ต้อง (newFeeChargePercent <= 100, "FP0"); ก็เพียงพอแล้วที่จะทำให้แน่ใจว่า newFeeChargePercent อยู่ในช่วงที่คาดไว้ (0-100)
ความเสี่ยงจากการรวมศูนย์
เรายังระบุความเสี่ยงของการรวมศูนย์ที่อาจส่งผลต่อความปลอดภัยของโปรโตคอลและความปลอดภัยของทรัพย์สินของผู้ใช้
ความเสี่ยงจากการรวมศูนย์
เรายังระบุความเสี่ยงของการรวมศูนย์ที่อาจส่งผลต่อความปลอดภัยของโปรโตคอลและความปลอดภัยของทรัพย์สินของผู้ใช้
คำแนะนำด้านความปลอดภัย
สำหรับทีมโครงการ iZiFinance ต่อไปนี้เป็นเคล็ดลับความปลอดภัย 10 ข้อเพื่อปกป้องสินทรัพย์บนเครือข่ายของผู้ใช้จากความเสี่ยงจากการรวมศูนย์
- การล็อกเวลาถูกกำหนดให้กับฟังก์ชันหลัก เช่น setFarm() และ setWrapToken() ซึ่งอนุญาตให้แก้ไขในเวลาที่กำหนดเท่านั้นในอนาคต ทำให้ชุมชนมีเวลาพูดคุยและบรรลุฉันทามติ
- ต้องการการอนุมัติหลายลายเซ็นของที่อยู่กระเป๋าเงินหลายแห่งเพื่อเรียกใช้ฟังก์ชัน เช่น enableFeeAmount() และ newPool() ที่ส่งผลต่อค่าธรรมเนียมและรางวัล
- ใช้การควบคุมการเข้าถึงตามบทบาทสำหรับฟังก์ชัน เช่น expandObservationQueue() และ CollectFeeCharged() โดยจำกัดเฉพาะบทบาทที่ระบุในการเรียก
- เมื่อมีการปรับใช้สัญญา ทำให้พารามิเตอร์หลัก เช่น startBlock, endBlock, rewardPerBlock ไม่เปลี่ยนรูป และไม่อนุญาตให้ทำการเปลี่ยนแปลงในภายหลัง
- สร้างโครงสร้างการกำกับดูแลของ DAO ที่ต้องมีข้อเสนอของชุมชนและการลงคะแนนเสียงสำหรับการเรียกไปยังหน้าที่ที่ละเอียดอ่อน
- ใช้สถาปัตยกรรมโมดูลาร์เพื่อแยกความรับผิดชอบและหลีกเลี่ยงการรวมศูนย์มากเกินไปของโมดูลใดโมดูลหนึ่ง
- สร้างกลไกหยุดฉุกเฉินด้วยการรับรองความถูกต้องหลายลายเซ็น ซึ่งสามารถระงับข้อตกลงได้หากมีสิ่งผิดปกติเกิดขึ้น
- ดำเนินการตรวจสอบความปลอดภัยภายนอกเป็นประจำและจัดการกับปัญหาที่พบในเวลาที่เหมาะสมเพื่อลดความเสี่ยงจากการควบคุมจากส่วนกลาง
- ในระหว่างการพัฒนา ให้ใช้วิธี fuzzing และวิธีการอื่นๆ เพื่อระบุและกำจัดช่องโหว่ของการควบคุมจากส่วนกลาง
- ปฏิบัติตามหลักการของสิทธิ์ขั้นต่ำ และให้สิทธิ์ที่จำเป็นขั้นต่ำแก่บทบาทและบัญชีเท่านั้น
ความเสี่ยงจากการรวมศูนย์เหล่านี้เกิดจากข้อเท็จจริงที่ว่าเจ้าของสัญญาอาจควบคุมพารามิเตอร์และฟังก์ชันของสัญญามากเกินไป ซึ่งอาจทำให้เจ้าของสามารถปรับเปลี่ยนโปรโตคอลหรือเป็นอันตรายต่อผู้ใช้ได้ นอกจากนี้ เรายังหวังว่าการวิเคราะห์นี้จะให้ข้อมูลเชิงลึกที่เป็นประโยชน์และคำแนะนำด้านความปลอดภัยสำหรับการปรับปรุงสัญญาอัจฉริยะของ iZiFinance
ตามเรามา
ทวิตเตอร์: @MetaTrustLabs
เว็บไซต์: metatrust.io
ความคิดเห็นทั้งหมด