BTC
ETH
HTX
SOL
BNB
ดูตลาด
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

เปลี่ยนรูปแบบของแผนผังสถานะ Ethereum โดยใช้การซ้อนทับ

以太坊爱好者
特邀专栏作者
บทความนี้มีประมาณ 2397 คำ การอ่านทั้งหมดใช้เวลาประมาณ 4 นาที
ค่อย ๆ แปลงต้นไม้สถานะเลขฐานสิบหกเป็นต้นไม้ไบนารี
สรุปโดย AI
ค่อย ๆ แปลงต้นไม้สถานะเลขฐานสิบหกเป็นต้นไม้ไบนารี

หมายเหตุบรรณาธิการ: บทความนี้มาจากผู้ที่ชื่นชอบ Ethereum (ID: ethfans)หมายเหตุบรรณาธิการ: บทความนี้มาจาก

ผู้ที่ชื่นชอบ Ethereum (ID: ethfans)

วิธีที่บัญชีและสัญญาจัดเก็บข้อมูลเป็นหนึ่งในหลาย ๆ ประเด็นที่ส่งผลกระทบต่อ Ethereum โปรโตคอล Ethereum ใช้ Merkle Patricia Tree (MPT, Merkle Patricia Tree) เพื่อจัดระเบียบบัญชีและข้อมูลสัญญา แม้ว่าโครงสร้างข้อมูลนี้จะทำงานได้ดีในทางทฤษฎี แต่ในทางปฏิบัตินั้นสร้างปัญหามากกว่าที่จะแก้ไข นักพัฒนาหลักได้พูดคุยกันเป็นเวลาหลายปีว่าพวกเขาต้องการแทนที่โครงสร้างข้อมูลนี้ด้วยต้นไม้ไบนารี ในบทความนี้ ฉันจะอธิบายมุมมองของฉันเกี่ยวกับปัญหานี้และวิธีทำให้การแปลงนี้บรรลุผลสำเร็จ

พื้นหลัง

วิธีการที่เสนอของฉันเกี่ยวข้องกับช่วงการเปลี่ยนแปลงซึ่งเครือข่ายจะรักษาโครงสร้างต้นไม้ทั้งสองไว้ ข้อดีของสิ่งนี้คือกระบวนการแปลงโครงสร้างแบบต้นไม้จะไม่ส่งผลกระทบต่อการทำงานของห่วงโซ่ และสามารถมั่นใจได้ว่าบัญชีทั้งหมดจะถูกแปลงเป็นรูปแบบไบนารี

พื้นหลัง

ปัจจุบัน ต้นไม้สถานะของ Ethereum เป็นเลขฐานสิบหก Hex หมายความว่าแต่ละโหนดมีโหนดลูก 16 โหนด ในทางทฤษฎี เป็นเรื่องปกติ เพราะการมีลูกมากขึ้นหมายถึง "ระดับ" (เช่น ความสูงของต้นไม้) น้อยลงในการจัดเก็บข้อมูลทั้งหมด

คำอธิบายภาพ

- รูปที่ 1. ตัวอย่างของ hex tree แสดงวิธีเก็บค่า v ที่คีย์ที่เกี่ยวข้อง 0xaa ความยาวคีย์ของทรีนี้มีเพียง 2 ไบต์ และแสดงเฉพาะทรีย่อยตาม 0xaa เท่านั้น เพื่อความกระชับ ต้นไม้ย่อยที่ไม่เกี่ยวข้องจะถูกแทนที่ด้วย "..." -

จะเห็นได้ว่าต้นไม้ในภาพด้านบนนั้นสั้นและกว้างมาก ด้วยคู่คีย์-ค่าเดียวกัน รูปภาพต่อไปนี้แสดงสถานการณ์ของหน่วยเก็บไบนารีทรี 170 แสดงเป็น 10101010 ในไบนารีทรี

คำอธิบายภาพ

ดังที่เห็นได้จากรูป ต้นไม้ไบนารีนั้นลึกและแคบกว่ามาก

ใน Ethereum แต่ละบล็อกมีฟิลด์ stateRoot ซึ่งเป็นค่าแฮชรูทของ MPT ที่แสดงถึงสถานะโดยรวมของ Ethereum หลังจากที่บล็อกได้รับการประมวลผล โดยทั่วไป ค่าแฮชนี้ได้มาจากการแฮชรายการค่าแฮชของโหนดลูก 16 โหนดของโหนดรูท ค่าแฮชของโหนดย่อยเหล่านี้ได้จากการแฮชรายการค่าแฮชของโหนดย่อย 16 รายการและอื่น ๆ

ทุกครั้งที่ธุรกรรมแพ็คเกจสร้างบล็อกใหม่ นักขุดจะอัปเดตโครงสร้างบัญชีและคำนวณแฮชรูทใหม่ แฮชรูทถูกเก็บไว้ในฟิลด์ stateRoot ของบล็อกใหม่ จากนั้นบล็อกใหม่จะถูกใช้

คำอธิบายภาพ

นี่คือปัญหา: การคำนวณรูทแฮชใหม่อาจใช้เวลานานเกินไปหากโหนดทั้งหมดถูกแฮช ดังนั้นในการคำนวณแฮชของโหนดรูท คนขุดแร่จะดึงข้อมูลแฮชพี่น้องจากฐานข้อมูล (แฮชพี่น้อง) แม้ว่าวิธีหลัง (นักขุดจะดึงโหนดย่อยจากฐานข้อมูล) จะไม่ใช้เวลามากเท่ากับวิธีแรก (นักขุดจะได้รับโหนดลีฟทั้งหมดจากฐานข้อมูลและแฮช) การดำเนินการนี้ยังคงใช้เวลานาน เนื่องจากต้องดึงแฮชแต่ละรายการจากฐานข้อมูล

ในแผนผังฐานสิบหก คุณมักจะต้องใช้ค่าแฮชพี่น้อง 15 ค่าในแต่ละระดับ ในตัวอย่างที่ฉันสร้างไว้ด้านบน (รูปที่ 1) (การคำนวณรูทแฮชใหม่) จะต้องใช้ 30 แฮช

แม้ว่าต้นไม้ไบนารีจะลึกกว่าเล็กน้อย แต่ต้องการแฮชพี่น้องเพียงอันเดียวในแต่ละระดับ จากตัวอย่างด้านบน (รูปที่ 2) ต้องใช้แฮชเพียง 8 อันเท่านั้น! นั่นเป็นเหตุผลที่ไบนารีทรีดีกว่าในทางปฏิบัติ

ชื่อระดับแรก

น่าเสียดายที่การแปลงเป็นไบนารีทรีนั้นไม่ใช่เรื่องเล็กน้อย มีข้อมูลมากมายที่จะแปลงซึ่งจะใช้เวลามากกว่า 15 วินาทีในการสร้างบล็อกเพื่อทำการแปลง

นอกจากนี้ ลองนึกภาพว่าคุณกำลังแปลหนังสือหนา 5,000 หน้า และผู้เขียนคอยบอกคุณว่าพวกเขาได้ทำการเปลี่ยนแปลงบางอย่างกับเนื้อเรื่อง และการเปลี่ยนแปลงเหล่านี้ส่งผลต่อหน้าที่คุณแปลไปแล้ว...จากนั้นกระบวนการก็จะสิ้นสุด การแปลงรูปแบบของ state tree เป็นปัญหาเดียวกัน: บางทีคุณอาจเพิ่งแปลงรูปแบบของ address เสร็จ และผู้ใช้ใช้ address (ซึ่งก็คือการอัพเดต state ของ address) จากนั้นคุณต้องแปลงอีกครั้งตั้งแต่ต้น (เนื่องจากสถานะของการอัปเดตที่อยู่มีผลกับแผนผังสถานะทั้งหมดด้วย)

ชื่อเรื่องรอง

ขั้นตอนที่ 1 - การแปลง

ภายใต้วิธีนี้ เมื่อความสูงของบล็อกคือ H1 จะต้องมีสถานะรูทสองสถานะ: หนึ่งคือรูทสถานะเลขฐานสิบหก "เลเยอร์พื้นฐาน" และอีกอันคือรูทสถานะไบนารีทรี "เลเยอร์ซ้อนทับ"

คำอธิบายภาพ

แผนผังฐานสิบหกถูกสร้างเป็นแบบอ่านอย่างเดียว ดังนั้นการอัปเดตใดๆ ต่อสถานะจะทำบนแผนผังซ้อนทับ

เมื่อธุรกรรมอ่านหรืออัปเดตบัญชี ระบบจะค้นหาแผนผังการซ้อนทับก่อน หากไม่พบบัญชีในแผนผังซ้อนทับ ต้นไม้ฐานสิบหกเก่าจะถูกค้นหาค่า

ชื่อเรื่องรอง

ขั้นตอนที่ 2 - การสลับทรีฐาน

คำอธิบายภาพ

- รูปที่ 5 ในขั้นตอนที่สองของการแปลง นักขุดจะแทนที่รูทเลขฐานสิบหกด้วยรูทของไบนารีทรีที่แปลงแล้วในส่วนหัวของบล็อก ส่งสัญญาณไปยังเครือข่ายว่าพร้อมแล้ว -

เมื่อชุดของบล็อกเพียงพอให้ค่าเดียวกันกับรากของแผนผังฐานไบนารีที่แปลงแล้ว หมายความว่านักขุดส่วนใหญ่ได้ทำการแปลงเสร็จสิ้นและอนุมัติแผนผังที่แปลงแล้ว กระบวนการรวมจะเริ่มขึ้น (หมายเหตุผู้แปล: การผสานในเวลานี้มีไว้สำหรับแผนผังฐานไบนารีแบบอ่านอย่างเดียวและแผนผังหลักไบนารีแบบอ่าน-เขียน)

กระบวนการรวมดำเนินการอย่างต่อเนื่อง: ทุกครั้งที่มีการสร้างบล็อกใหม่ คีย์ n ตัวจะถูกลบออกจากแผนผังการซ้อนทับและใส่กลับเข้าไปในแผนผังฐานสอง กระบวนการนี้ดำเนินต่อไปจนกว่าคีย์ทั้งหมดจะถูกลบออกจากแผนผังการซ้อนทับ เมื่อถึงขั้นตอนนี้ ส่วนหัวของบล็อกจะไม่เก็บรากของแผนผังสถานะซ้อนทับอีกต่อไป

ขั้นตอนต่อไป

ชื่อเรื่องรอง

ขอบคุณ

ขั้นตอนต่อไป

开发者
ETH
ยินดีต้อนรับเข้าร่วมชุมชนทางการของ Odaily
กลุ่มสมาชิก:
https://t.me/Odaily_News
กลุ่มสนทนา:
https://t.me/Odaily_GoldenApe
บัญชีทางการ:
https://twitter.com/OdailyChina
สารบัญบทความ
คลังบทความของผู้เขียน
以太坊爱好者
อันดับบทความร้อน
Daily
Weekly
ดาวน์โหลดแอพ Odaily พลาเน็ตเดลี่
ให้คนบางกลุ่มเข้าใจ Web3.0 ก่อน
IOS
Android