ในฐานะแพลตฟอร์มบล็อกเชนประสิทธิภาพสูงที่เกิดขึ้นใหม่ Sui มีเทคโนโลยีที่เป็นนวัตกรรมและมีเอกลักษณ์มากมาย ขณะเดียวกันก็มุ่งเน้นไปที่การมอบประสบการณ์การทำธุรกรรมที่รวดเร็วและปลอดภัยสำหรับสถานการณ์การใช้งานต่างๆ ความรู้พื้นฐานเกี่ยวกับ Sui สามารถพบได้ใน Exploring Sui: เทคโนโลยีและความปลอดภัยของสัญญาที่อยู่เบื้องหลังประสิทธิภาพสูง แตกต่างจากภาษาโปรแกรมอื่นๆ ที่ใช้กันทั่วไปในบล็อกเชน (เช่น Solidity) Sui ใช้ภาษา Move ซึ่งสามารถแก้ปัญหาช่องโหว่ที่พบได้ทั่วไปใน Solidity ได้ในระดับหนึ่ง เช่น การโจมตีซ้ำ การล้นจำนวนเต็ม , การใช้จ่ายซ้ำซ้อน, การโจมตี DoS และปัญหาคอมไพเลอร์ แต่ไม่สามารถป้องกันนักพัฒนาจากการแนะนำข้อผิดพลาดในโค้ดได้ ดังนั้น นักพัฒนาจำเป็นต้องเข้าใจและใส่ใจกับฟังก์ชันหรือฟีเจอร์เฉพาะบางอย่างเมื่อใช้งาน เพื่อรับรองความปลอดภัยของสัญญาอัจฉริยะ
ทีมรักษาความปลอดภัย SlowMist ได้บูรณาการและซึมซับแนวปฏิบัติในการพัฒนาความปลอดภัยที่ชุมชน Sui แบ่งปัน รวมกับประสบการณ์การตรวจสอบความปลอดภัยที่สั่งสมมาหลายปี เพื่อเผยแพร่ไพรเมอร์การตรวจสอบสัญญา Sui-Move โดยมีเป้าหมายเพื่อช่วยให้นักพัฒนาเข้าใจความเสี่ยงด้านความปลอดภัยของ สัญญาอัจฉริยะของ Sui และจัดหาโซลูชั่นที่ใช้งานได้จริงเพื่อลดภัยคุกคามด้านความปลอดภัยที่อาจเกิดขึ้น
เนื่องจากข้อจำกัดด้านพื้นที่ บทความนี้จึงแสดงรายการเพียงส่วนหนึ่งของบทนำเกี่ยวกับการตรวจสอบสัญญา Sui-Move คุณสามารถรับชม, Fork และ Star บน GitHub: https://github.com/slowmist/Sui-MOVE-Smart-Contract- การตรวจสอบ-Primer/ blob/main/README_CN.md
1. การประกาศโมดูลและการมองเห็น
1.1 ฟังก์ชั่น "สาธารณะ (เพื่อน)" ("สาธารณะ (เพื่อน)" ถูกแทนที่ด้วย "สาธารณะ (แพ็คเกจ)" ในเวอร์ชันซุยล่าสุด)
คำจำกัดความ: ใช้เพื่อประกาศฟังก์ชันเพื่อให้สามารถเข้าถึงได้โดยโมดูลเพื่อนที่ระบุเท่านั้น ซึ่งให้การควบคุมการเข้าถึงที่ละเอียดยิ่งขึ้นระหว่าง "สาธารณะ" และ "ส่วนตัว"
ตัวอย่าง:
1.2 ฟังก์ชั่น "เข้า"
คำจำกัดความ: ฟังก์ชัน "entry" เป็นจุดเริ่มต้นของโมดูลและอนุญาตให้มีการโทรโดยตรงจากภายในบล็อกธุรกรรม พารามิเตอร์ต้องมาจากอินพุตไปยังบล็อกธุรกรรม และต้องไม่ใช่ผลลัพธ์ของธุรกรรมก่อนหน้าในบล็อกหรือข้อมูลที่แก้ไข นอกจากนี้ ฟังก์ชัน "entry" สามารถส่งคืนเฉพาะประเภทที่มีความสามารถ "drop" เท่านั้น
ตัวอย่าง:
คำจำกัดความ: ฟังก์ชัน "entry" เป็นจุดเริ่มต้นของโมดูลและอนุญาตให้มีการโทรโดยตรงจากภายในบล็อกธุรกรรม พารามิเตอร์ต้องมาจากอินพุตไปยังบล็อกธุรกรรม และไม่สามารถเป็นผลลัพธ์ของธุรกรรมก่อนหน้าในบล็อกหรือข้อมูลที่แก้ไข นอกจากนี้ ฟังก์ชัน "entry" สามารถส่งคืนเฉพาะประเภทที่มีความสามารถ "drop" เท่านั้น
ตัวอย่าง:
1.3 ฟังก์ชั่น "สาธารณะ"
คำจำกัดความ: สามารถเรียกฟังก์ชัน "สาธารณะ" ได้จากบล็อกธุรกรรมและโมดูลอื่นๆ ซึ่งเหมาะสำหรับการโต้ตอบภายนอก ไม่มีข้อจำกัดเดียวกันกับพารามิเตอร์และค่าส่งคืนเป็นฟังก์ชัน "รายการ" และมักใช้เพื่อแสดงฟังก์ชันการทำงานสู่โลกภายนอก
ตัวอย่าง:
2. การจัดการวัตถุ
2.1 เอกลักษณ์ของวัตถุ
คำจำกัดความ: แต่ละวัตถุ Sui มี "objID" ที่ไม่ซ้ำกันซึ่งช่วยให้มั่นใจถึงเอกลักษณ์ของวัตถุในห่วงโซ่
2.2 การบรรจุและการแกะออก
คำนิยาม:
- การตัดโดยตรง: ใช้วัตถุ Sui เป็นช่องของวัตถุอื่น และวัตถุที่ตัดจะต้องถูกทำลายเมื่อแกะออก
- การบรรจุวัตถุ: วัตถุที่บรรจุไว้จะกลายเป็นส่วนหนึ่งของวัตถุอื่นและไม่มีอยู่อย่างอิสระอีกต่อไป ID ของออบเจ็กต์ยังคงไม่เปลี่ยนแปลงหลังจากการคลายแพ็ก
2.3 กลยุทธ์การถ่ายโอนแบบกำหนดเอง
คำจำกัดความ: ใช้ "sui::transfer::transfer" เพื่อกำหนดกลยุทธ์การถ่ายโอนแบบกำหนดเอง สำหรับออบเจ็กต์ที่มีความสามารถ "store" คุณสามารถสร้างได้ผ่าน "sui::transfer::public_transfer"
2.4 คุณสมบัติของวัตถุ
คำจำกัดความ: คุณสมบัติของวัตถุ Sui ได้แก่ "copy", "drop", "store" และ "key" ซึ่งกำหนดวิธีการทำงานของวัตถุ
2.5 การตรวจสอบการอนุญาตวัตถุ
- วัตถุที่เป็นที่อยู่
คำจำกัดความ: ออบเจ็กต์ที่เป็นของที่อยู่เฉพาะ (ที่อยู่บัญชีหรือรหัสออบเจ็กต์) มีเพียงเจ้าของออบเจ็กต์เท่านั้นที่สามารถเข้าถึงและดำเนินการออบเจ็กต์เหล่านี้ได้
- วัตถุที่ไม่เปลี่ยนรูป
คำจำกัดความ: วัตถุที่ไม่เปลี่ยนรูปไม่สามารถแก้ไขหรือถ่ายโอนได้ และทุกคนสามารถเข้าถึงได้ เหมาะสำหรับข้อมูลที่ต้องการการเข้าถึงทั่วโลกแต่ไม่จำเป็นต้องแก้ไข
- วัตถุที่ใช้ร่วมกัน
คำจำกัดความ: ออบเจ็กต์ที่ใช้ร่วมกันสามารถเข้าถึงได้และดำเนินการโดยผู้ใช้หลายคน และเหมาะสำหรับสถานการณ์ เช่น แอปพลิเคชันแบบกระจายอำนาจ อย่างไรก็ตาม เนื่องจากจำเป็นต้องมีฉันทามติ ค่าใช้จ่ายในการดำเนินการจึงสูง
- วัตถุที่ถูกห่อ
คำจำกัดความ: การห่อวัตถุเป็นการฝังวัตถุหนึ่งเข้าไปในวัตถุอื่น วัตถุที่ถูกห่อไม่มีอยู่อีกต่อไปและจะต้องเข้าถึงได้ผ่านวัตถุที่ห่อ
3. การตรวจสอบความปลอดภัย
3.1 การตรวจสอบล้นตัวเลข
คำจำกัดความ: การห่อวัตถุคือการฝังวัตถุหนึ่งเข้าไปในวัตถุอื่น วัตถุที่ถูกห่อไม่มีอยู่อย่างอิสระอีกต่อไป และจะต้องเข้าถึงได้ผ่านวัตถุที่ห่อ
3. การตรวจสอบความปลอดภัย
3.1 การตรวจสอบล้นตัวเลข
สัญญาอัจฉริยะของ Sui ทำการตรวจสอบการโอเวอร์โฟลว์เชิงตัวเลขตามค่าเริ่มต้น
3.2 การตรวจสอบการกลับเข้าใหม่
สิ่งที่เรียกว่าการโจมตีซ้ำคือการแทรกการโทรที่ไม่คาดคิด (ภายนอก) ลงในธุรกรรมการโทรตามสัญญาปกติ ซึ่งจะเปลี่ยนแปลงกระบวนการโทรทางธุรกิจโดยรวมและบรรลุผลกำไรที่ผิดกฎหมาย เมื่อใดก็ตามที่เกี่ยวข้องกับการเรียกสัญญาภายนอก อาจมีความเสี่ยงในการกลับเข้าใหม่ เราสามารถแบ่งปัญหาการกลับเข้าใหม่ในปัจจุบันออกเป็นสามประเภท: การกลับเข้าใหม่ด้วยฟังก์ชันเดียว การกลับเข้าใหม่ข้ามฟังก์ชัน และการกลับเข้าใหม่ระหว่างสัญญา คุณสมบัติบางอย่างของภาษา Move ให้การป้องกันตามธรรมชาติต่อการโจมตีกลับคืนมา:
- ไม่มีการเรียกแบบไดนามิกใน Move และการโทรภายนอกทั้งหมดจะต้องนำเข้าผ่านการใช้งานก่อน กล่าวคือ การโทรภายนอกเป็นสิ่งที่คาดหวังและกำหนด
- ไม่มีการโอนโทเค็นดั้งเดิมจะทริกเกอร์ฟังก์ชันสำรอง
- ใน Move โมเดลทรัพยากรช่วยให้แน่ใจว่าทรัพยากรสามารถเข้าถึงได้โดยบริบทการดำเนินการครั้งละรายการเท่านั้น ซึ่งหมายความว่าหากการดำเนินการฟังก์ชันไม่เสร็จสมบูรณ์ ฟังก์ชันอื่นๆ จะไม่สามารถเข้าถึงทรัพยากรเดียวกันได้จนกว่าการดำเนินการจะเสร็จสิ้น
1. การตรวจสอบน้ำล้น
หมายเหตุ: การย้ายจะทำการตรวจสอบโอเวอร์โฟลว์เมื่อดำเนินการทางคณิตศาสตร์ หากการดำเนินการโอเวอร์โฟลว์ ธุรกรรมจะล้มเหลว แต่ควรสังเกตว่า Move จะไม่ทำการตรวจสอบโอเวอร์โฟลว์สำหรับการดำเนินการบิต
การระบุตำแหน่ง: ค้นหาตำแหน่งในโค้ดที่มีการดำเนินการบิต และตรวจสอบว่ามีความเสี่ยงที่จะเกิดการโอเวอร์โฟลว์หรือไม่
2. การตรวจสอบข้อผิดพลาดความแม่นยำทางคณิตศาสตร์
หมายเหตุ: ไม่มีประเภทจุดลอยตัวใน Move ดังนั้น เมื่อดำเนินการคำนวณ หากผลลัพธ์ของการดำเนินการจำเป็นต้องแสดงเป็นจำนวนจุดลอยตัว อาจเกิดข้อผิดพลาดด้านความแม่นยำได้ แม้ว่าข้อผิดพลาดด้านความแม่นยำจะหลีกเลี่ยงได้ยากในบางกรณี แต่ผลกระทบสามารถบรรเทาลงได้ด้วยการเพิ่มประสิทธิภาพและการออกแบบที่มีเหตุผล
การวางตำแหน่ง: ตรวจสอบทุกส่วนของโค้ดที่เกี่ยวข้องกับการดำเนินการทางคณิตศาสตร์ โดยเฉพาะอย่างยิ่งการคำนวณที่อาจทำให้เกิดข้อผิดพลาดที่แม่นยำ ตรวจสอบให้แน่ใจว่าการดำเนินการเหล่านี้จะไม่ส่งผลเสียต่อตรรกะของสัญญาหรือความแม่นยำเชิงตัวเลข และให้คำแนะนำในการเพิ่มประสิทธิภาพเพื่อลดข้อผิดพลาดที่แม่นยำ
3. การตรวจสอบการแข่งขันแบบมีเงื่อนไข
หมายเหตุ: เครื่องมือตรวจสอบความถูกต้องใน Sui ยังสามารถจัดเรียงธุรกรรมที่ผู้ใช้ส่งเข้ามาได้ ดังนั้นในการตรวจสอบ เรายังคงต้องใส่ใจกับปัญหาการทำกำไรจากการเรียงลำดับธุรกรรมในบล็อกเดียวกัน
ตำแหน่ง:
- มีการจัดการสถานะข้อมูลของสัญญาก่อนที่จะเรียกใช้ฟังก์ชันที่คาดหวังหรือไม่
- มีการจัดการสถานะข้อมูลสัญญาที่คาดหวังระหว่างการดำเนินการฟังก์ชันหรือไม่
- มีการจัดการสถานะข้อมูลสัญญาที่คาดหวังหลังจากการเรียกใช้ฟังก์ชันหรือไม่
4. การตรวจสอบการควบคุมการเข้าถึง
หมายเหตุ: ฟังก์ชั่นหลักบางอย่างในสัญญาควรจำกัดอยู่เพียงการโทรภายใน เช่น ฟังก์ชั่นที่สามารถอัปเดตจำนวนเงินฝากของผู้ใช้ได้โดยตรง หากฟังก์ชันเหล่านี้ถูกเปิดออกสู่โลกภายนอกโดยไม่ได้ตั้งใจ การควบคุมการอนุญาตอาจถูกข้าม ส่งผลให้เกิดช่องโหว่ด้านความปลอดภัยและแม้กระทั่งการสูญเสียทรัพย์สิน ดังนั้น จะต้องตั้งค่าสิทธิ์การเข้าถึงอย่างเคร่งครัดเพื่อให้แน่ใจว่าเฉพาะบทบาทหรือโมดูลที่ได้รับอนุญาตเท่านั้นที่สามารถเรียกใช้ฟังก์ชันเหล่านี้ได้ หรือฟังก์ชันดังกล่าวสามารถใช้ได้ภายในเท่านั้น
การวางตำแหน่ง: คุณต้องตรวจสอบการตั้งค่าการควบคุมการเข้าถึงของฟังก์ชันทั้งหมด โดยเฉพาะฟังก์ชันที่ไม่ควรเปิดเผยต่อโลกภายนอก เพื่อให้แน่ใจว่าสามารถเรียกฟังก์ชันเหล่านั้นได้เฉพาะภายในเท่านั้น หากพบว่ามีการเปิดเผยอินเทอร์เฟซการทำงานที่ไม่ควรเปิดเผย จะต้องทำเครื่องหมายว่ามีความเสี่ยงสูงและต้องมีข้อเสนอแนะในการแก้ไข
5. การตรวจสอบการจัดการวัตถุ
หมายเหตุ: ใน Sui วัตถุสามารถแปลงเป็นวัตถุที่ใช้ร่วมกัน (Shared Object) ซึ่งหมายความว่าสิทธิ์การเข้าถึงของวัตถุอาจเปลี่ยนจากส่วนตัวเป็นสาธารณะ ดังนั้นออบเจ็กต์ทั้งหมดที่ใช้จึงต้องได้รับการตรวจสอบอย่างละเอียดเพื่อพิจารณาว่าแต่ละออบเจ็กต์เป็นแบบคงที่หรือแชร์ ให้ความสนใจเป็นพิเศษว่าวัตถุใดๆ ถูกแปลงจากวัตถุส่วนตัวไปเป็นวัตถุที่ใช้ร่วมกันโดยไม่ตั้งใจหรือไม่ ซึ่งอาจส่งผลให้ผู้ใช้ที่ไม่ได้รับอนุญาตเข้าถึงวัตถุเหล่านี้ ซึ่งอาจก่อให้เกิดความเสี่ยงด้านความปลอดภัย
การวางตำแหน่ง: จัดระเบียบและวิเคราะห์ออบเจ็กต์ทั้งหมดที่เกี่ยวข้องในโมดูล ตรวจสอบประเภทออบเจ็กต์และการตั้งค่าสิทธิ์ และตรวจสอบให้แน่ใจว่าสิทธิ์ของออบเจ็กต์ตรงกับข้อกำหนดทางธุรกิจ หากพบว่าวัตถุส่วนตัวถูกแปลงเป็นวัตถุที่ใช้ร่วมกันโดยไม่ได้ตั้งใจ จะต้องทำเครื่องหมายว่าเป็นความเสี่ยงที่อาจเกิดขึ้นและแนะนำให้แก้ไข
6. การตรวจสอบการใช้โทเค็น
การวางตำแหน่ง: จัดระเบียบและวิเคราะห์ออบเจ็กต์ทั้งหมดที่เกี่ยวข้องกับโมดูล ตรวจสอบประเภทออบเจ็กต์และการตั้งค่าสิทธิ์ และตรวจสอบให้แน่ใจว่าสิทธิ์ของออบเจ็กต์ตรงกับข้อกำหนดทางธุรกิจ หากพบว่าวัตถุส่วนตัวถูกแปลงเป็นวัตถุที่ใช้ร่วมกันโดยไม่ได้ตั้งใจ จะต้องทำเครื่องหมายว่าเป็นความเสี่ยงที่อาจเกิดขึ้นและแนะนำให้แก้ไข
6. การตรวจสอบการใช้โทเค็น
หมายเหตุ: โมเดลโทเค็นของ Sui นั้นแตกต่างจากเชนอื่น Sui อนุญาตให้วัตถุเก็บโทเค็น และวัตถุโทเค็นสามารถซ้อนภายในวัตถุอื่นและแยกได้ ดังนั้นในสถานการณ์ที่เกี่ยวข้องกับการใช้โทเค็น จะต้องให้ความสนใจเป็นพิเศษกับการจัดการและการหมุนเวียนของโทเค็น เพื่อหลีกเลี่ยงปัญหาด้านความปลอดภัยหรือการสูญเสียที่ไม่คาดคิด
ตำแหน่ง:
- ตรวจสอบว่าปริมาณที่ใช้ไปนั้นถูกต้อง
- ตรวจสอบว่าวัตถุโทเค็นได้รับการถ่ายโอนอย่างถูกต้อง
- ตรวจสอบว่าการแยกและการรวมโทเค็นนั้นสมเหตุสมผลหรือไม่
- ตรวจสอบการเชื่อมโยงโทเค็นกับออบเจ็กต์
7. การตรวจสอบการโจมตีสินเชื่อแฟลช
หมายเหตุ: Sui's Move ยังมีการใช้ flash Loan (Hot Potato) ด้วย ผู้ใช้สามารถยืมเงินจำนวนมากในธุรกรรมเดียวและใช้งานได้ตามต้องการ และเพียงต้องคืนเงินภายในธุรกรรมเท่านั้น ผู้ใช้ที่เป็นอันตรายมักจะใช้สินเชื่อแฟลชเพื่อขยายเงินทุนของตนเองเพื่อดำเนินการโจมตีทางการเงินขนาดใหญ่ เช่น การปั่นราคา
การวางตำแหน่ง: วิเคราะห์ว่าอัลกอริทึมของโปรโตคอลเอง (รางวัล อัตราดอกเบี้ย ฯลฯ) และการพึ่งพาเครื่อง Oracle นั้นสมเหตุสมผลหรือไม่
8. การตรวจสอบช่องโหว่การอนุญาต
หมายเหตุ: ในสัญญา Move ของ Sui ช่องโหว่การอนุญาตมีความเกี่ยวข้องอย่างใกล้ชิดกับความต้องการทางธุรกิจและการออกแบบฟังก์ชั่น ดังนั้น เมื่อพบโมดูลที่ซับซ้อนมากขึ้น คุณจะต้องยืนยันกับฝ่ายโครงการถึงสิทธิ์การเรียกของแต่ละวิธี (การอนุญาตที่นี่โดยทั่วไปอ้างถึงฟังก์ชัน การมองเห็นและการอนุญาตการเรียกใช้ฟังก์ชัน)
ตำแหน่ง:
- ตรวจสอบและยืนยันการมองเห็นและการอนุญาตสิทธิ์ของวิธีการทำงานทั้งหมด ในระหว่างขั้นตอนการประเมินโครงการ ฝ่ายโครงการจะต้องจัดเตรียมเอกสารการออกแบบ ในระหว่างการตรวจสอบ การอนุญาตจะได้รับการยืนยันตามคำอธิบายในเอกสารการออกแบบ
- จัดเรียงขอบเขตสิทธิ์ของบทบาทของทีมโครงการ หากสิทธิ์ของบทบาทของทีมโครงการจะส่งผลต่อทรัพย์สินของผู้ใช้ ก็มีความเสี่ยงที่สิทธิ์จะมากเกินไป
- วิเคราะห์ประเภทของออบเจ็กต์ที่ส่งผ่านในฟังก์ชันภายนอก หากเป็นฟังก์ชันพิเศษบางอย่าง วัตถุที่มีสิทธิพิเศษบางรายการต้องเข้าร่วม
9. การตรวจสอบความปลอดภัยของการอัพเกรดสัญญา
หมายเหตุ: ใน Move โมดูลภายนอกจะถูกนำเข้าผ่านคำสำคัญ use ควรสังเกตว่าสัญญาของ Sui สามารถอัปเกรดได้ แต่แพ็คเกจสัญญาที่เผยแพร่นั้นเป็นวัตถุที่ไม่เปลี่ยนรูปและไม่สามารถเพิกถอนหรือแก้ไขได้เมื่อเผยแพร่แล้ว สาระสำคัญของการอัปเกรดสัญญาคือการเผยแพร่สัญญาที่อัปเดตอีกครั้งในที่อยู่ใหม่ และย้ายข้อมูลของสัญญาเวอร์ชันเก่าไปยังสัญญาใหม่ ดังนั้น จะต้องให้ความสนใจเป็นพิเศษในระหว่างกระบวนการอัปเกรดสัญญา:
- ฟังก์ชัน "init": ฟังก์ชัน "init" จะถูกดำเนินการเมื่อมีการปล่อยสัญญาเป็นครั้งแรกเท่านั้น และจะไม่ถูกทริกเกอร์อีกเมื่อมีการอัปเกรดสัญญาครั้งต่อไป
- การอัปเกรดสัญญาจะไม่อัปเดตการขึ้นต่อกันโดยอัตโนมัติ: หากแพ็คเกจสัญญาขึ้นอยู่กับแพ็คเกจภายนอก เมื่อมีการอัปเกรดแพ็คเกจภายนอก แพ็คเกจสัญญาจะไม่ชี้ไปยังที่อยู่สัญญาที่อัปเกรดโดยอัตโนมัติ ดังนั้น คุณต้องอัปเกรดแพ็คเกจสัญญาของคุณด้วยตนเองเพื่อระบุการขึ้นต่อกันใหม่
การวางตำแหน่ง: จำเป็นต้องดำเนินการตรวจสอบตรรกะการย้ายข้อมูลโดยละเอียดในระหว่างกระบวนการอัปเกรดสัญญา เพื่อให้แน่ใจว่าการดำเนินการย้ายข้อมูลปลอดภัยและแม่นยำ และเพื่อหลีกเลี่ยงปัญหาการสูญหายของข้อมูลสำคัญหรืออาศัยการอัปเดต
10. การตรวจสอบความปลอดภัยการโทรภายนอก
หมายเหตุ: เช่นเดียวกับรายการตรวจสอบการใช้งานโมดูลภายนอก เนื่องจากการเรียกภายนอกใน Move จำเป็นต้องนำเข้าโมดูลภายนอกก่อน ในทางทฤษฎีแล้ว ผลลัพธ์ของการเรียกภายนอกคือสิ่งที่นักพัฒนาคาดหวัง และสิ่งสำคัญที่ต้องการคือความเสถียรของโมดูลภายนอก
การวางตำแหน่ง: จำเป็นต้องตรวจสอบไลบรารีที่นำเข้าจากภายนอก
11. การตรวจสอบค่าส่งคืน
หมายเหตุ: เช่นเดียวกับภาษาสัญญาอัจฉริยะอื่นๆ ในสัญญา Move จำเป็นต้องตรวจสอบค่าที่ส่งคืนของฟังก์ชันบางอย่าง หากละเว้นการประมวลผลค่าที่ส่งคืนเหล่านี้ ตรรกะของคีย์อาจดำเนินการไม่ถูกต้อง ซึ่งอาจนำไปสู่ปัญหาด้านความปลอดภัย
การวางตำแหน่ง: คุณต้องตรวจสอบค่าที่ส่งคืนของการเรียกใช้ฟังก์ชันทุกครั้งในโค้ดของคุณ โดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับการโทรภายนอกหรือการอัปเดตสถานะที่สำคัญ หากค่าที่ส่งคืนไม่ได้รับการประมวลผลหรือตรวจสอบ อาจนำไปสู่พฤติกรรมที่คาดเดาไม่ได้ และควรทำเครื่องหมายว่าเป็นจุดเสี่ยงที่อาจเกิดขึ้น
12. การตรวจสอบการปฏิเสธการให้บริการ
หมายเหตุ: การโจมตีแบบปฏิเสธการบริการ (DoS) อาจเกิดจากข้อผิดพลาดของโค้ดลอจิก ปัญหาความเข้ากันได้ หรือช่องโหว่ด้านความปลอดภัยอื่นๆ ทำให้สัญญาอัจฉริยะทำงานไม่ถูกต้อง ปัญหาดังกล่าวอาจส่งผลกระทบต่อความพร้อมของสัญญาหรือแม้กระทั่งทำให้เป็นอัมพาตโดยสิ้นเชิง
12. การตรวจสอบการปฏิเสธการให้บริการ
หมายเหตุ: การโจมตีแบบปฏิเสธการบริการ (DoS) อาจเกิดจากข้อผิดพลาดของโค้ดลอจิก ปัญหาความเข้ากันได้ หรือช่องโหว่ด้านความปลอดภัยอื่นๆ ทำให้สัญญาอัจฉริยะทำงานไม่ถูกต้อง ปัญหาดังกล่าวอาจส่งผลกระทบต่อความพร้อมของสัญญาหรือแม้กระทั่งทำให้เป็นอัมพาตโดยสิ้นเชิง
ตำแหน่ง:
- มุ่งเน้นการตรวจสอบความสมบูรณ์ของตรรกะทางธุรกิจเพื่อให้มั่นใจว่าสามารถดำเนินการได้ตามปกติภายใต้สถานการณ์ต่างๆ และสัญญาจะไม่หยุดชะงักเนื่องจากข้อผิดพลาดหรือช่องโหว่
- ให้ความสนใจกับชิ้นส่วนที่มีการโต้ตอบกับโมดูลภายนอก และตรวจสอบความเข้ากันได้เพื่อป้องกันบริการหยุดชะงักเนื่องจากปัญหาการพึ่งพาภายนอก
13. การตรวจสอบการเพิ่มประสิทธิภาพก๊าซ
หมายเหตุ: เช่นเดียวกับ Ethereum Sui ก็มีกลไกของ Gas และการเรียกสคริปต์โมดูลใด ๆ ก็ตามจะใช้ Gas ดังนั้นจึงจำเป็นต้องปรับโค้ดที่มีความยาวและซับซ้อนสูงให้เหมาะสม
ตำแหน่ง:
- มันเกี่ยวข้องกับการเรียกที่ซับซ้อนเพื่อดูว่าสามารถแยกออกได้หรือไม่
- มันเกี่ยวข้องกับการเรียกความถี่สูงเพื่อดูว่าสามารถเพิ่มประสิทธิภาพการดำเนินการภายในของฟังก์ชันได้หรือไม่
14. การตรวจสอบตรรกะการออกแบบ
หมายเหตุ: จุดเน้นของการตรวจสอบลอจิกการออกแบบคือการตรวจสอบกระบวนการทางธุรกิจและการนำไปใช้ในโค้ดเพื่อยืนยันว่ามีข้อบกพร่องในการออกแบบหรือการเบี่ยงเบนไปจากความคาดหวังหรือไม่ การใช้โค้ดที่ไม่สอดคล้องกับตรรกะที่คาดหวังอาจทำให้เกิดพฤติกรรมที่ไม่คาดคิดหรือความเสี่ยงด้านความปลอดภัย
ตำแหน่ง:
- ขึ้นอยู่กับสิทธิ์และขอบเขตของบทบาทที่แตกต่างกัน ให้เรียงลำดับเส้นทางการโทรที่เป็นไปได้ในกระบวนการทางธุรกิจ
- กำหนดขอบเขตของข้อมูลที่เกี่ยวข้องในแต่ละกระบวนการทางธุรกิจ และให้แน่ใจว่าการดำเนินงานข้อมูลสอดคล้องกับการออกแบบธุรกิจ
- เปรียบเทียบเส้นทางการโทรจริงกับกระบวนการทางธุรกิจที่คาดหวัง และระบุและวิเคราะห์สถานการณ์การโทรที่อาจนำไปสู่ผลลัพธ์ที่ไม่คาดคิด
15. อื่นๆ
เนื้อหาไม่สะท้อนให้เห็นในสำนวนข้างต้น
สำหรับนักพัฒนา การปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเหล่านี้สามารถปรับปรุงความปลอดภัยของสัญญาอัจฉริยะได้อย่างมีประสิทธิภาพและลดความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้น หวังว่าแนวทางปฏิบัติที่ดีที่สุดนี้จะช่วยให้นักพัฒนาจำนวนมากขึ้นสร้างสัญญาอัจฉริยะที่ปลอดภัยและเชื่อถือได้ และส่งเสริมการพัฒนาเทคโนโลยีบล็อกเชนที่ดี
อ้างถึง:
[1] https://intro.sui-book.com/
[2] https://docs.sui.io/
[3] https://move-dao.github.io/move-book-zh/introduction.html
ผู้เขียน |. ชัยชนะ!
บรรณาธิการ |. ลิซ่า, ลิซ
ความคิดเห็นทั้งหมด