จุดบกพร่องของ Hard Fork ในเบอร์ลินเกิดจากความแตกต่างของปริมาณการใช้ก๊าซของที่อยู่ "0x10"
Ethereum OpenEthereum ไคลเอนต์เดียวในบล็อก #12244294บั๊กที่ทำให้เครือข่าย Ethereum ปิดตัวลงในเวลานั้น และไม่สามารถติดตามเครือข่ายได้หลังจากสร้างบล็อกที่มีปัญหา แล้วอุบัติเหตุครั้งนี้เกิดจากอะไร?
ใช้เบราว์เซอร์ Tokenview Ethereum เพื่อดูธุรกรรมที่ก่อให้เกิดอุบัติเหตุ:https://eth.tokenview.com/cn/tx/0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247
นี่คือธุรกรรมการเรียกสัญญาซึ่งกระจาย ETH จากการแลกเปลี่ยน KuCoin ไปยังที่อยู่อื่น
มาวิเคราะห์ขั้นตอนการเรียกสัญญากันอย่างละเอียด:
1. ในคอลัมน์ "Data Input" ของเบราว์เซอร์ พารามิเตอร์ของการเรียกสัญญาจะแสดงขึ้น บรรทัดแรกระบุว่ารายการที่อยู่เริ่มต้นจาก "40" (เลขฐานสิบหก) ไบต์ ซึ่งเท่ากับ 64 ไบต์ บรรทัดที่สี่ใน รูป บรรทัดที่สองระบุว่ารายการจำนวนเงินโอนเริ่มต้นจากไบต์ "1a0" (เลขฐานสิบหก) นั่นคือ 416 ไบต์ บรรทัดที่ 15 ของคอลัมน์อินพุตข้อมูล
2. การโอนจะดำเนินการตามลำดับของรายการที่อยู่ และจำนวนเงินที่โอนไปยังแต่ละที่อยู่จะสอดคล้องกับรายการของข้อมูลการโอนทีละรายการ
3. ตอนนี้เราเริ่มสำรวจรายการที่อยู่ ดูที่ "10" (เลขฐานสิบหก) ในบรรทัดที่สาม ซึ่งหมายความว่าเราจะโอน ETH ไปยังที่อยู่ 16 รายการถัดไป
ตามลำดับในรูป เมื่อนับถึง 10 ค่าที่พบจะกลายเป็น "10" ค่านี้เป็นความยาวของรายการที่แสดงจำนวนเงินที่โอน แต่ตามคำแนะนำในบรรทัดที่สาม ควรโอนไปยังที่อยู่ 16 แห่ง จากนั้นสัญญาจะใช้ "0x10" เป็นที่อยู่เพื่อดำเนินการโอนต่อไป และโอน 0 ETH ไปยังที่อยู่ "0x10"
ในความเป็นจริง "0x10" เป็นหนึ่งใน "ที่อยู่พิเศษ" ของ EVM ซึ่งอยู่ในรายการสัญญาที่คอมไพล์ล่วงหน้าของ EVM ทั้งหมด เป็นสัญญาคอมไพล์ล่วงหน้าที่ยืนยันโดย EIP-2537 สำหรับโปรแกรมเข้ารหัสการจับคู่ BLS แต่EIP นี้ยังไม่ได้ปรับใช้กับ mainnet
ชื่อเรื่องรอง
ปริมาณการใช้ก๊าซของที่อยู่ "0x10" แตกต่างกัน
Berlin hard fork เปลี่ยนวิธีการวัดปริมาณการใช้ก๊าซใน EVM หลังจากการใช้งาน EIP-2929 หากการดำเนินการจัดเก็บสถานะดำเนินการในช่องจัดเก็บเดียวกันหลายครั้งในการทำธุรกรรม การดำเนินการครั้งแรกจะใช้ก๊าซมากขึ้น และการดำเนินการที่ตามมาจะใช้ก๊าซน้อยลง
นี่คือที่มาของข้อผิดพลาด OpenEthereum ที่บล็อก #12244294: OpenEthereum รวมรายการการใช้งาน EVM ที่คอมไพล์ไว้ล่วงหน้าดังนั้น OpenEthereum จะให้ส่วนลดแก๊สแก่ธุรกรรมที่เข้าถึง "0x10" ในธุรกรรมนี้ อย่างไรก็ตาม ไคลเอนต์ที่ใช้งานส่วนใหญ่ของเครือข่ายไม่ได้ใช้ EIP-2929 ด้วยวิธีนี้ และพวกเขาให้ส่วนลดก๊าซสำหรับธุรกรรมที่เข้าถึงสัญญาที่เปิดใช้งานแล้วเท่านั้น
เป็นผลให้ไคลเอนต์ OpenEthereum คำนวณปริมาณก๊าซที่ใช้โดยธุรกรรมที่แยกออกจากไคลเอนต์อื่นในเครือข่าย
การหยุดทำงานของ OpenEthereum single-client ที่เกิดจากความแตกต่างของปริมาณการใช้ก๊าซนั้นไม่รุนแรงพอที่จะทำให้เกิดการแยกลูกโซ่ที่สำคัญ แต่มันยังเตือนให้เราใช้การใช้งานแบบหลายไคลเอนต์เพื่อปรับปรุงความต้านทาน
ปฏิเสธไม่ได้ว่าเทคโนโลยีบล็อกเชนยังคงอยู่ในกระบวนการพยายามและพัฒนาอย่างต่อเนื่อง Defi และ NFT ซึ่งเปิดตัวในปี 2564 จะแพร่กระจายไปยังผู้ชมจำนวนมากขึ้นด้วยความเร็วที่ไม่เคยมีมาก่อน Tokenview หวังว่าจะร่วมมือกับนักพัฒนาจำนวนมากขึ้นเพื่อสร้างบล็อกที่ดีขึ้น . ห่วงโซ่โลก.


