วิทยาศาสตร์ยอดนิยม: การตีความ Ethereum Yellow Paper (2/7)
หมายเหตุบรรณาธิการ: บทความนี้มาจากผู้ที่ชื่นชอบ Ethereum (ID: Ethfans)หมายเหตุบรรณาธิการ: บทความนี้มาจาก
ผู้ที่ชื่นชอบ Ethereum (ID: Ethfans)
, ผู้แต่ง: Lucas Saldanha, แปลและพิสูจน์อักษร: An Zi Clint & A Jian, พิมพ์ซ้ำโดย Odaily โดยได้รับอนุญาต
ฉันหวังว่าคุณที่อยู่หน้าจอจะเข้าใจว่า Merkle tree คืออะไรและมีบทบาทอย่างไรใน Ethereum หลังจากอ่านจบ เข้าใจแนวคิดของ "สถานะโลก" และ "สถานะบัญชี" โครงสร้างของบล็อก
(ข้อจำกัดความรับผิดชอบ: บทความนี้อ้างอิงจาก Yellow Paper ของ Byzantine รุ่น e94ebda เมื่อวันที่ 5 มิถุนายน 2018)
ชื่อเรื่องรอง
ต้นเมิร์กเคิล
ก่อนที่จะพูดถึงวัตถุข้อมูลหลักของ Ethereum ฉันอยากจะแนะนำสั้น ๆ ว่าต้นไม้ Merkle คืออะไรและคุณลักษณะที่ทำให้มันใช้งานได้
ต้นไม้ Merkle-Patricia มีคุณสมบัติที่น่าสนใจมากมาย และหากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการใช้งานใน Ethereum ฉันขอแนะนำให้อ่านบทความนี้

ใน Merkle tree โหนดลีฟจะเก็บแฮชของข้อมูลบล็อก ในขณะที่โหนดที่ไม่ใช่ลีฟจะเก็บแฮชของโหนดย่อย
คำอธิบายภาพ
-แผนผังแผนผังของ Merkle tree (รวมถึงโหนดและความสัมพันธ์ระหว่างโหนด)-
การเปลี่ยนแปลงใด ๆ ในข้อมูลที่ชี้โดย Merkle tree จะทำให้เกิดการเปลี่ยนแปลงในแฮชของโหนด เนื่องจากค่าแฮชที่เก็บในแต่ละโหนดพาเรนต์ขึ้นอยู่กับข้อมูลที่อยู่ในโหนดลูก การเปลี่ยนแปลงข้อมูลในโหนดลูกจะทำให้แฮชของโหนดพาเรนต์เปลี่ยนไป และผลกระทบดังกล่าวเป็นปฏิกิริยาลูกโซ่ จากลีฟโหนดไปยังรูทโหนด ดังนั้นการเปลี่ยนแปลงข้อมูลที่โหนดปลายสุดชี้ไปจะทำให้เกิดการเปลี่ยนแปลงในแฮชที่จัดเก็บโดยโหนดรูท จากลักษณะโครงสร้างข้างต้น เราสามารถทราบคุณลักษณะที่สำคัญสองประการ:
เมื่อพิจารณาว่าข้อมูลที่ชี้ไปที่ Merkle tree สองต้นนั้นเหมือนกันทุกประการหรือไม่ เราไม่จำเป็นต้องเปรียบเทียบโหนดแต่ละโหนด แต่จำเป็นต้องเปรียบเทียบแฮชที่เก็บไว้ในรูทโหนดเท่านั้น
สิ่งสำคัญเกี่ยวกับแอตทริบิวต์แรกคือเราสามารถใช้เฉพาะค่าแฮชของรูทโหนดเพื่อทำเครื่องหมายข้อมูลที่ต้นไม้ทั้งต้นชี้ไปในช่วงเวลาหนึ่ง ซึ่งหมายความว่าสามารถทำเครื่องหมายบล็อกได้โดยการบันทึกค่าแฮชของรูทโหนดเท่านั้น (โดยไม่ต้องเก็บข้อมูลทั้งหมดในบล็อกเชน) และข้อมูลไม่สามารถแก้ไขได้
จนถึงตอนนี้ เราได้ชี้แจงบทบาทของรูตโหนดแฮชใน Merkle tree และเราจะแนะนำอ็อบเจกต์หลักใน Ethereum
ชื่อเรื่องรอง
สถานะของโลกคือการแมปจากที่อยู่ (บัญชี) ไปยังสถานะของบัญชี แม้ว่าสถานะของโลกจะไม่ได้ถูกจัดเก็บไว้ในบล็อกเชน แต่ในคำอธิบายของกระดาษเหลือง สถานะของโลกก็ได้รับการบันทึกโดยต้นไม้เช่นกัน (ต้นไม้นี้เรียกอีกอย่างว่าฐานข้อมูลของรัฐหรือต้นไม้ของรัฐ) สถานะโลกสามารถดูได้ว่าเป็นสถานะสากลที่ได้รับการปรับปรุงอย่างต่อเนื่องเมื่อมีการทำธุรกรรม Ethereum เป็นเหมือนคอมพิวเตอร์ที่กระจายอำนาจ และสถานะของโลกคือฮาร์ดไดรฟ์ของคอมพิวเตอร์เครื่องนี้

คำอธิบายภาพ
-แผนผังสถานะโลกและคลังเก็บบัญชี-
ชื่อเรื่องรอง
สถานะบัญชี
มีบัญชีสองประเภทใน Ethereum: บัญชีภายนอก (EOA) และบัญชีสัญญา บัญชีที่เราใช้ในการส่งและรับ Ethereum ซึ่งกันและกันและใช้งานสัญญาอัจฉริยะคือบัญชี EOA และบัญชีที่สร้างขึ้นโดยอัตโนมัติเมื่อใช้งานสัญญาอัจฉริยะคือบัญชีสัญญา สัญญาอัจฉริยะแต่ละรายการมีบัญชี Ethereum เฉพาะของตนเอง
nonce
สถานะบัญชีจะสะท้อนถึงข้อมูลต่างๆ ของบัญชี Ethereum ตัวอย่างเช่น จะเก็บข้อมูลยอดคงเหลือของ Ethereum ของบัญชีปัจจุบัน จำนวนธุรกรรมที่ส่งโดยบัญชีปัจจุบัน...แต่ละบัญชีมีสถานะบัญชี
balance
มาดูสิ่งที่รวมอยู่ในสถานะบัญชี:
storageRoot
จำนวนธุรกรรมที่ส่งจากที่อยู่นี้ (หากปัจจุบันเป็นบัญชี EOA) หรือการดำเนินการสร้างสัญญาที่สร้างโดยบัญชีนี้ (ไม่ต้องสนใจว่าการดำเนินการสร้างสัญญาจะเป็นอย่างไรในตอนนี้)
codeHash
จำนวนอีเธอร์ (หน่วยวัดเป็น Wei) ที่บัญชีนี้เป็นเจ้าของ
ค่าแฮชของรูทโหนดของโครงสร้างที่เก็บข้อมูลบัญชี (เราจะแนะนำที่เก็บข้อมูลบัญชีในภายหลัง)
สำหรับบัญชีสัญญา บัญชีนี้เก็บค่าแฮชของรหัส EVM สำหรับบัญชี EOA ให้เว้นว่างไว้
ความไม่เปลี่ยนแปลงของ codeHash ทำให้ไม่สามารถซ่อมแซมและอัปเดตสัญญาอัจฉริยะที่มีช่องโหว่หากมีการปรับใช้ ตามนั้น สัญญาใหม่เพียงฉบับเดียวเท่านั้นที่สามารถปรับใช้ได้ (และเวอร์ชันที่มีช่องโหว่จะมีอยู่ในบล็อกเชนเสมอ) ด้วยเหตุนี้จึงจำเป็นต้องใช้ Truffle สำหรับการพัฒนาและการปรับใช้สัญญาอัจฉริยะ และปฏิบัติตามข้อกำหนดของแนวปฏิบัติที่ดีที่สุดเมื่อตั้งโปรแกรมด้วย Solidity

-สถานะบัญชีและแผนผังการจัดเก็บบัญชี-
ซื้อขาย
ชื่อเรื่องรอง
ซื้อขาย
ธุรกรรมทำให้เกิดการเปลี่ยนแปลงจากสถานะปัจจุบันไปยังสถานะถัดไป มีการทำธุรกรรมสามประเภทใน Ethereum:
ธุรกรรมที่โอนมูลค่าระหว่าง EOA (เช่น การเปลี่ยนขนาดยอดคงเหลือของผู้ส่งและผู้รับ)
ส่งข้อความเพื่อเรียกธุรกรรมของสัญญา (เช่น เพื่อตั้งค่าในสัญญาโดยการส่งข้อความเรียกเพื่อทริกเกอร์เมธอด setter)
ธุรกรรมสำหรับการปรับใช้สัญญา (เช่น การสร้างบัญชีสัญญา)
nonce
(จากมุมมองทางเทคนิค ธุรกรรมสองรายการแรกเหมือนกัน... เป็นธุรกรรมทั้งหมดที่เปลี่ยนสถานะบัญชีผ่านการส่งข้อความ ยกเว้นรายการหนึ่งเป็นบัญชี EOA และอีกรายการเป็นบัญชีสัญญา ที่นี่ ธุรกรรม แบ่งออกเป็นสามประเภท ทั้งนี้ เพื่อความสะดวกของผู้อ่านในการทำความเข้าใจ)
gasPrice
การทำธุรกรรมประกอบด้วยส่วนต่าง ๆ ดังต่อไปนี้:
gasLimit
จำนวนธุรกรรมที่ออกโดยบัญชีนี้ (หมายเหตุการพิสูจน์อักษร: สามารถเข้าใจได้คร่าวๆ ว่า "นี่คือธุรกรรมแรกของบัญชีนี้")
to
ค่าธรรมเนียม (วัดเป็น Wei) จ่ายต่อหน่วยของก๊าซเมื่อทำธุรกรรมนี้ ทำการคำนวณ
ปริมาณก๊าซสูงสุดที่สามารถใช้ได้เมื่อทำธุรกรรมนี้
หากธุรกรรมนี้ใช้สำหรับส่งอีเธอร์ นี่คือที่อยู่ EOA เพื่อรับอีเธอร์
value
หากธุรกรรมนี้ใช้เพื่อส่งข้อความไปยังสัญญา (เช่น เรียกใช้เมธอดในสัญญาอัจฉริยะ) นี่คือที่อยู่ของสัญญา
ถ้าธุรกรรมนี้ถูกใช้เพื่อสร้างสัญญา ค่านี้จะว่างเปล่า
หากธุรกรรมนี้กำลังส่งหรือรับอีเทอร์ นี่คือจำนวนโทเค็นใน Wei ที่ส่งไปยังบัญชีผู้รับ
v, r, s
หากธุรกรรมนี้ใช้เพื่อส่งข้อความถึงคู่สัญญา นี่คือจำนวนเงินที่ Wei จ่ายให้กับสัญญาอัจฉริยะที่ได้รับข้อความนี้
dataหากธุรกรรมนี้ถูกใช้เพื่อสร้างสัญญา นี่คือจำนวนอีเธอร์ใน Wei ที่จัดเก็บไว้ในบัญชีเมื่อเริ่มต้นสัญญา
ค่าที่ใช้ในลายเซ็นเข้ารหัสของธุรกรรม ซึ่งสามารถใช้กำหนดผู้ส่งธุรกรรมได้
init(ใช้สำหรับโอนค่าและส่งข้อความไปยังสัญญาอัจฉริยะเท่านั้น)
ข้อมูลอินพุตที่แนบมากับการเรียกข้อความ (เช่น หากคุณต้องการดำเนินการเมธอด setter ในสัญญาอัจฉริยะ พื้นที่ข้อมูลควรมีตัวระบุของเมธอด setter และค่าพารามิเตอร์ที่คุณต้องการตั้งค่า)
(เฉพาะการทำสัญญา)
อย่างที่คุณคาดไว้ ธุรกรรมทั้งหมดในบล็อกจะถูกจัดเก็บไว้ใน Merkle tree ด้วยเช่นกัน และค่าแฮชของโหนดรูทของทรีนี้จะถูกบันทึกโดยส่วนหัวของบล็อก! มาวิเคราะห์โครงสร้างบล็อกของ Ethereum กัน
ปิดกั้น
ชื่อเรื่องรอง
ปิดกั้น
ส่วนหัวของบล็อกเป็นส่วนหนึ่งของบล็อกเชนใน Ethereum โดยจะบันทึกค่าแฮชของบล็อกก่อนหน้า (หรือที่เรียกว่าบล็อกหลัก) และสร้างห่วงโซ่ที่รับรองด้วยการเข้ารหัสผ่านการเชื่อมต่อของส่วนหัวของบล็อก

เนื้อหาของบล็อกประกอบด้วยชุดของธุรกรรมที่บันทึกไว้ในบล็อกนี้ เช่นเดียวกับรายการส่วนหัวของบล็อกลุง (ommer) หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับบล็อกลุงฉันแนะนำให้อ่านบทความนี้
คำอธิบายภาพ
parentHash
-แผนภาพนามธรรมของบล็อก Ethereum-
ommersHash
เรามาแนะนำว่าส่วนหัวของบล็อกประกอบด้วยส่วนใดบ้าง
beneficiary
แฮชส่วนหัวของบล็อกของบล็อกก่อนหน้า แต่ละบล็อกประกอบด้วยแฮชของบล็อกก่อนหน้า ย้อนกลับไปยังบล็อกการกำเนิดบนห่วงโซ่ นี่คือการออกแบบโครงสร้างของการรักษาข้อมูลที่จะไม่ถูกแก้ไข (การดัดแปลงใด ๆ กับบล็อกก่อนหน้าจะส่งผลต่อค่าแฮชของบล็อกที่ตามมาทั้งหมด)
stateRoot
ค่าแฮชของส่วนหัวของบล็อกลุงและส่วนหนึ่งของเนื้อหาบล็อก
transactionsRoot
บัญชี Ethereum ที่ได้รับรายได้จากการขุดบล็อคนี้
receiptsRoot
แฮชของโหนดรูทของแผนผังสถานะโลก (หลังจากดำเนินการธุรกรรมทั้งหมดแล้ว)
logsBloom
ค่าแฮชของรูทโหนดของทรานแซคชันทรี ต้นไม้นี้มีธุรกรรมทั้งหมดของตัวบล็อก
difficulty
เมื่อใดก็ตามที่มีการทำธุรกรรม Ethereum จะสร้างใบเสร็จการทำธุรกรรมที่สอดคล้องกับผลลัพธ์ นี่คือแฮชของโหนดรูทของแผนผังการรับธุรกรรม
number
ตัวกรอง Bloom ซึ่งใช้เพื่อระบุว่ามีการสร้างบันทึกบางอย่างโดยธุรกรรมในบล็อกหนึ่งๆ หรือไม่ (หากคุณสนใจในด้านนี้ คุณสามารถดูคำตอบนี้ได้ใน Stack Overflow) สิ่งนี้จะหลีกเลี่ยงการจัดเก็บข้อมูลบันทึกเป็นกลุ่ม (ประหยัดพื้นที่มาก)
gasLimit
ค่าความยากของบล็อกนี้ นี่คือการวัดความยากในการขุดบล็อกปัจจุบัน (รายละเอียดและการคำนวณของแนวคิดนี้ไม่ครอบคลุมที่นี่)
gasUsed
จำนวนบล็อกคำนำทั้งหมด ค่านี้ระบุความสูงของบล็อกเชน (เช่น จำนวนบล็อกในบล็อกเชน) จำนวนบล็อกการกำเนิดคือ 0
timestamp
ทุกธุรกรรมใช้ก๊าซ ขีด จำกัด ของก๊าซระบุปริมาณก๊าซทั้งหมดที่สามารถใช้โดยการทำธุรกรรมทั้งหมดที่บันทึกไว้ในบล็อกนี้ นี่เป็นวิธีการจำกัดจำนวนธุรกรรมภายในบล็อก
extraData
ปริมาณก๊าซทั้งหมดที่ใช้จริงโดยการทำธุรกรรมแต่ละครั้งในบล็อก
mixHash
การประทับเวลา Unix เมื่อสร้างบล็อก โปรดจำไว้ว่าเนื่องจากลักษณะการกระจายอำนาจของเครือข่าย Ethereum เราไม่สามารถเชื่อถือค่านี้ได้ โดยเฉพาะอย่างยิ่งเมื่อเขียนสัญญาอัจฉริยะที่เกี่ยวข้องกับตรรกะทางธุรกิจที่เกี่ยวข้องกับเวลา
nonce
อาร์เรย์ไบต์ที่มีความยาวผันแปรได้ซึ่งสามารถป้อนอะไรก็ได้ เมื่อนักขุดสร้างบล็อก พวกเขาสามารถเพิ่มอะไรก็ได้ในพื้นที่นี้
อุ๊ย... พูดแล้วเปรี้ยวปากเลย... แนะนำให้ใจเย็นๆ ค่อยๆ ซึมซับ! แต่ฉันต้องการย้ำอีกครั้งว่าการอ่านบทความนี้ไม่ควรมุ่งที่จะจำทุกคำนามและหน้าที่ของมัน (คุณสามารถค้นหาได้ใน Google) ความตั้งใจดั้งเดิมในการเขียนของฉันคือการแนะนำทุกแง่มุมของวัตถุ Ethereum ด้วยวิธีง่ายๆ (อย่างน้อยก็ง่ายกว่ากระดาษสีเหลือง) เพื่อช่วยให้ผู้เริ่มต้นเข้าใจว่าคำศัพท์ทางวิชาชีพเหล่านั้นหมายถึงอะไร แค่คิดว่าบทความนี้เป็น "การเรียนรู้ Ethereum Objects อย่างโง่เขลา"! 🙂
สรุปแล้ว
ชื่อเรื่องรอง
สรุปแล้ว
มาสรุปสิ่งที่เราได้เรียนรู้กันโดยสังเขป! โดยทั่วไปแล้ว Ethereum มีต้นไม้นำหน้าสี่ต้น:
โครงสร้างสถานะโลกประกอบด้วยการแมปจากที่อยู่ไปยังสถานะบัญชี ค่าแฮชของรูทโหนดของ world state tree จะถูกบันทึกโดยบล็อก (ในฟิลด์ stateRoot) ซึ่งระบุสถานะปัจจุบันเมื่อสร้างบล็อก มีต้นไม้สถานะโลกเพียงต้นเดียวในเครือข่ายทั้งหมด
โครงสร้างการจัดเก็บบัญชีเก็บข้อมูลที่เกี่ยวข้องกับสัญญาอัจฉริยะบางอย่าง แฮชของโหนดรูทของแผนผังหน่วยเก็บข้อมูลบัญชี (ในฟิลด์ storageRoot) ถูกบันทึกโดยสถานะบัญชี แต่ละบัญชีมีแผนผังการจัดเก็บบัญชี
โครงสร้างธุรกรรมประกอบด้วยข้อมูลธุรกรรมทั้งหมดในบล็อก แฮชของรูทโหนดของทรานแซกชันทรีได้รับการบันทึกโดยส่วนหัวของบล็อก (ในฟิลด์ทรานแซกชันรูท) แต่ละบล็อกมีแผนผังธุรกรรม
แผนผังการรับธุรกรรมประกอบด้วยข้อมูลการรับสินค้าสำหรับธุรกรรมทั้งหมดในบล็อก นอกจากนี้ ส่วนหัวของบล็อก (ในพื้นที่ ReceiptRoot) ยังเก็บค่าแฮชของโหนดรูทของทรีใบเสร็จของธุรกรรม แต่ละบล็อกมีทรีใบเสร็จของธุรกรรมที่สอดคล้องกัน
วัตถุที่เรากำลังพูดถึงในวันนี้คือ:
สถานะของโลก: ฮาร์ดไดรฟ์ของคอมพิวเตอร์แบบกระจาย Ethereum เป็นการแมปจากที่อยู่ไปยังสถานะบัญชี
สถานะบัญชี: เก็บข้อมูลสถานะของบัญชี Ethereum แต่ละบัญชี สถานะบัญชียังมี storageRoot ของโครงสร้างสถานะบัญชี ซึ่งมีข้อมูลการจัดเก็บของบัญชี
บล็อก: มีลิงก์ไปยังบล็อกก่อนหน้า (parentHash) และเก็บธุรกรรมที่เมื่อดำเนินการจะส่งผลให้เกิดสถานะใหม่ในระบบ บล็อกยังบันทึก stateRoot,transactionRoot,receiptRoot,รูทโหนดแฮชของ world state tree,transaction tree และทรานแซกชันใบเสร็จรับเงินที่สอดคล้องกัน

ฉันต้องการใช้รูปภาพเพื่อแสดงข้อมูลแนวคิดต่างๆ ที่กล่าวถึงในบทความ
คำอธิบายภาพ


