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

ความเข้าใจเชิงลึกของกลไก Ethereum Gas: ที่อยู่แบบ Zero-byte สามารถประหยัด Gas ได้หรือไม่?

บทความนี้มีประมาณ 2814 คำ การอ่านทั้งหมดใช้เวลาประมาณ 5 นาที
โลกของ blockchain ต้องการก๊าซเหมือนรถยนต์ต้องการน้ำมัน แล้วคุณรู้วิธีประหยัดน้ำมันหรือยัง? มาส
สรุปโดย AI
โลกของ blockchain ต้องการก๊าซเหมือนรถยนต์ต้องการน้ำมัน แล้วคุณรู้วิธีประหยัดน้ำมันหรือยัง? มาส

คำนำ

คำนำ

เมื่อฉันตรวจสอบธุรกรรมบน Etherscan เมื่อไม่นานมานี้ ฉันพบที่อยู่ที่น่าสนใจมาก: 0x00000000a03396F6F864B496713f2623b6756Be2 ที่อยู่นี้เริ่มต้นด้วย 0 x 00000000 ฉันค้นหาที่อยู่ด้วยความตั้งใจที่จะสำรวจสิ่งที่ไม่รู้จักและพบว่าที่อยู่นั้นไม่ง่ายเลย ไม่เพียง แต่มีโครงสร้างที่เป็นเอกลักษณ์แต่ยังช่วยประหยัดค่าน้ำมันอีกด้วย

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

แก๊สคืออะไร

Gas เป็นหน่วยที่ใช้ในการวัดความพยายามในการคำนวณที่จำเป็นในการดำเนินการเฉพาะบน Ethereum blockchain ซึ่งเป็นหน่วยของการคำนวณบนเครือข่าย Ethereum เราสามารถเข้าใจง่ายๆ ว่าแก๊สเป็นน้ำมันซึ่งช่วยให้เครือข่าย Ethereum ทำงานตามปกติ ใน Ethereum blockchain จำเป็นต้องมีค่าธรรมเนียมแก๊สเพื่อดำเนินการเขียน

2.1 Gas Price

ใน Ethereum สกุลเงินคืออีเธอร์ (ether) 1 อีเธอร์ = 1 x 10 18 Wei การดำเนินการบน Ethereum blockchain เช่น การส่งโทเค็น สัญญาการโทร ฯลฯ ต้องจ่าย Gas ที่เกี่ยวข้อง และหน่วยจะคำนวณเป็น Wei Wei เป็นหน่วยดั้งเดิมที่เล็กที่สุดของ ETH และหน่วยก๊าซที่ ETH ใช้คือ Gwei 1 Gwei = 1 x 10 9 Wei

2.2 Gas Limit

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

ราคาแก๊สคือปริมาณของ Gwei ที่สอดคล้องกับปริมาณการใช้ 1 Gas ใน Ethereum แน่นอนว่าผู้ส่งธุรกรรมสามารถกำหนดราคาต่อหน่วยของ Gas ที่เขายินดีจ่ายได้ ตัวอย่างเช่น ธุรกรรมโดยผู้ส่งธุรกรรมต้องใช้ 10 Gas และผู้ส่งธุรกรรมยินดีจ่าย 3 Wei/Gas และต้นทุนรวมของธุรกรรมคือ 30 Wei ในกระเป๋าเงินที่เราใช้ (เช่น MetaMask) จะมีตัวเลือกขั้นสูงในการปรับค่า Gas ยิ่งราคา Gas สูง ลำดับความสำคัญของบรรจุภัณฑ์ก็จะยิ่งสูงขึ้น

Gas Limit เป็นหน่วยจำกัดสำหรับการใช้ Gas นั่นคือปริมาณ Gas สูงสุดที่ผู้ส่งธุรกรรมสามารถใช้ในการดำเนินธุรกรรมเมื่อทำธุรกรรมแต่ละรายการเสร็จสิ้น หากไม่มีขีดจำกัด Gas Limit ยอดเงินในบัญชีของผู้ส่งธุรกรรมอาจหมดลงเนื่องจากการทำงานที่ไม่ถูกต้อง Gas Limit เป็นกลไกความปลอดภัยเพื่อป้องกันไม่ให้ ETH ทั้งหมดในบัญชีถูกใช้งาน

2.3 Inherent Cost Gas

ค่าใช้จ่ายในการส่งธุรกรรมประกอบด้วยสองส่วน:

1. ต้นทุนโดยธรรมชาติ

2. ค่าใช้จ่ายในการดำเนินการ

ค่าใช้จ่ายในการดำเนินการตามชื่อหมายถึงเกี่ยวข้องกับการดำเนินการ ยิ่งมีการดำเนินการเพื่อดำเนินการธุรกรรมมากเท่าใด ทรัพยากร EVM ก็จะยิ่งต้องใช้มากขึ้นเท่านั้น และค่าใช้จ่ายในการดำเนินการก็จะยิ่งสูงขึ้นเท่านั้น

และต้นทุนโดยธรรมชาติจะพิจารณาจากภาระของธุรกรรม:

1. ภาระในการสร้างสัญญาอัจฉริยะคือการสร้างรหัส EVM ของสัญญาอัจฉริยะ

2. โหลดของการเรียกใช้ฟังก์ชันสัญญาอัจฉริยะคือข้อมูลที่ป้อนเมื่อดำเนินการข้อความ

จากภาคผนวก G ของ Ethereum Yellow Paper เราสามารถทราบก๊าซที่เกี่ยวข้องกับการสร้างสัญญาและการดำเนินธุรกรรม

เราถือว่า $N{zeros}$ แทนจำนวนไบต์ทั้งหมดในการโหลดธุรกรรมที่เป็น 0 ไบต์ และ $N{nonzeros}$ แทนจำนวนไบต์ทั้งหมดในการโหลดธุรกรรมที่ไม่ใช่ 0 ไบต์ ตามบท 6.2 ของ Yellow Book เกี่ยวกับการดำเนินการ Description สามารถรับค่าใช้จ่ายโดยธรรมชาติได้

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

ที่อยู่เริ่มต้นด้วยศูนย์ในที่อยู่ Ethereum

เนื่องจากตอนนี้ค่าแก๊สค่อนข้างแพงจึงเป็นเรื่องสำคัญมากที่จะต้องปรับค่าแก๊สให้เหมาะสม มีหลายวิธีในการปรับค่าแก๊สให้เหมาะสม ระดับเพื่อปรับค่าแก๊สให้เหมาะสม เราสามารถประหยัดน้ำมันในธุรกรรมหลายประเภทได้โดยใช้ที่อยู่ที่มี 0 ไบต์ (เช่น Hamming Weight) มากกว่าปกติ และในบางกรณี ที่อยู่ที่มีมากกว่า 0 ไบต์ในตอนเริ่มต้น

Hamming Weight คือจำนวนของสัญลักษณ์ที่ไม่ใช่ศูนย์ในสตริงสัญลักษณ์ สัญลักษณ์ศูนย์ทั้งหมดมีน้ำหนักแฮมมิ่งเป็น 0 และ 1101 มีน้ำหนักแฮมมิ่งเท่ากับ 3

ดังที่คุณเห็นในภาคผนวก G ของ Ethereum Yellow Paper จำเป็นต้องใช้ 4 Gas เมื่อใช้ 0 ไบต์ และ 16 Gas จำเป็นเมื่อใช้ไบต์ที่ไม่ใช่ศูนย์:

ทุกครั้งที่เราใช้ 0 ไบต์แทนไบต์ที่ไม่ใช่ศูนย์ เราจะประหยัด 16 Gas ดังนั้นทุกครั้งที่เราแทนที่ไบต์ที่ไม่ใช่ศูนย์ด้วย 0 ไบต์ใน msg.data จะช่วยประหยัด 12 Gas ใน Ethereum ที่อยู่เป็นสตริงเลขฐานสิบหก (20 ไบต์) ของอักขระสุ่ม 40 ตัวที่ขึ้นต้นด้วย 0 x เมื่อดูสตริงไบต์ในรูปแบบเลขฐานสิบหก เนื่องจากแต่ละคู่ของตัวเลข (อักขระแต่ละตัวมี 16 หลักที่เป็นไปได้) รวมกันเป็นไบต์ (16 2 = 2 8 = 256 บิต) ดังนั้น 0 เลขฐานสิบหกตัวเดียวหรือ 0 ที่อยู่ติดกันในสองไบต์ที่ต่างกัน จะไม่ลดคำว่า The Hamming weight ของสตริง ดังนั้น 0 เลขฐานสิบหกสองตัวติดต่อกันเท่านั้นที่จะลดน้ำหนัก Hamming การเรียงลำดับ 0 ไบต์ยังไม่มีผลกับผลลัพธ์ของ Gas optimization (เช่น ที่อยู่ 0x00a0009e638D25EFE5a894f6a36F42734477dECa มี 2 0 ไบต์)\,ในฟังก์ชัน ERC 20 Transfer() ไม่มีความแตกต่างใน Hamming Weight ของ msg.sender แต่ในพารามิเตอร์ _to address ที่ส่งผ่านไปยัง msg.data ซึ่งเป็นส่วนหนึ่งของฟังก์ชัน transfer()\times 12 = 48 \,ใช้ StandardToken ของ OpenZeppelin เป็นตัวอย่างอ้างอิง การถ่ายโอนมาตรฐานไปยังที่อยู่ที่ไม่มี 0 ไบต์ (เช่น: 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) มีค่าใช้จ่าย 35,039 แก๊ส ในขณะที่การถ่ายโอนไปยังที่อยู่ที่มี 4 0 ไบต์ (เช่น: 0x00000000b011402777E34EFf44905BE85e3Cd D01 นั่นคือมี 0 อยู่ 4 คู่) ให้โอนเพียง 34991 แก๊สมีส่วนต่าง $35039 - 34991 = 48

แก๊ส $ และเราบอกไปก่อนหน้านี้ว่าทุกครั้งที่เราใช้ 0 ไบต์แทนที่จะเป็นศูนย์ไบต์ เราจะประหยัดได้ 12 Gas (และใน Ethereum เวอร์ชันก่อนหน้า เราประหยัดได้มากถึง 64 Gas) ในที่นี้ 48 Gas สามารถแสดงเป็น $ 4

Gas$ ตามที่เราคาดไว้จากกระดาษสีเหลือง

ความแตกต่างระหว่างที่อยู่ 0 ไบต์สองค่า 0x00a0009e638D25EFE5a894f6a36F42734477dECa และค่าสองค่าข้างต้นคือ 24 Gas ตามลำดับ ซึ่งแสดงให้เห็นว่าเป็นไปตามความคาดหวังเช่นกัน

แต่ถ้าที่อยู่ของเรามี 0 ไบต์ต่อท้าย ที่อยู่แบบสั้นจะถูกโจมตีได้ง่าย ดังนั้นที่อยู่ที่มี 0 ไบต์หลายตัวเริ่มต้นด้วย 0 x 00 จึงเป็นตัวเลือกที่ดีกว่า หากที่อยู่มีอย่างน้อย 4 ไบต์นำหน้า 0 (เช่น 8 นำหน้า 0 ในรูปแบบการเข้ารหัสเลขฐานสิบหก) แต่ละที่อยู่จะต้องใช้ 16 ไบต์เท่านั้น เพื่อให้สองที่อยู่สามารถบรรจุในแพ็กเก็ตขนาด 32 ไบต์ได้ การเพิ่มประสิทธิภาพประเภทนี้ไม่ใช่เพียงเพราะการเพิ่มประสิทธิภาพ Gas ที่นำมาโดย $G_{txdatazero}$ แต่ยังเป็นเพราะเราไม่จำเป็นต้องอ่านและเขียนไบต์เพิ่มเติมจากข้อมูลการโทร เราจึงสามารถประหยัด Gas ได้มากขึ้น ดังนั้นโอนไปยังดังกล่าว ที่อยู่ โดยไม่คำนึงว่าที่อยู่นั้นจะเป็นที่อยู่ตามสัญญาหรือที่อยู่บัญชีธรรมดา สามารถประหยัดค่าใช้จ่ายได้ประมาณ 5%

  • CHI GasToken ที่พัฒนาโดยผู้รวบรวมการแลกเปลี่ยนแบบกระจายศูนย์ 1inch.exchange ใช้หลักการดังกล่าว และที่อยู่บัญชีทั่วไปจำนวนมากใช้ 0 นำหน้าเป็นที่อยู่ของตนเอง

  • วิธีรับที่อยู่เพิ่มเติมที่ขึ้นต้นด้วย 0 นำหน้า นี่เป็นวิธีเดียวกับการสร้างหมายเลขอ้างอิง Ethereum ที่คุณเห็น และไม่มีวิธีการสร้างที่นี่ (เนื่องจาก Profanity ซึ่งให้บริการสร้างหมายเลขอ้างอิงก่อนหน้านี้มี ช่องโหว่). แน่นอนยิ่งคุณต้องการได้ 0 เริ่มต้นมากเท่าไหร่ก็จะยิ่งยากขึ้นเท่านั้นและใช้เวลานานขึ้น

  • มีโอกาส 92.47% ที่จะพบ 0 0 ไบต์ที่แอดเดรส

  • โอกาส 7.25% ในการค้นหา 0 ไบต์

  • โอกาส 0.00000106% ในการค้นหา 4 0 ไบต์

คำลงท้าย

มีหลายวิธีในการเพิ่มประสิทธิภาพ Gas ที่นี่เราศึกษาวิธีการประหยัด Gas จากมุมมองของชั้นล่างสุดของ EVM จากการวิจัย เราได้ข้อสรุป: ยิ่งมี 00 ในที่อยู่ Ethereum (ที่นี่ควรสังเกตว่า 0 ปรากฏเป็นคู่ตามเหตุผลที่เราได้กล่าวไว้ในหัวข้อที่ 4) ไม่ว่าที่อยู่นั้นจะเป็นที่อยู่ตามสัญญาหรือที่อยู่ธรรมดา ไม่ว่าจะเป็นที่อยู่โอนเข้าหรือที่อยู่โอนออกก็ตาม แก๊สจำนวนมาก สามารถบันทึกได้

บทความอ้างอิง

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