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

ทำความเข้าใจวิธีสร้าง Ethereum gas tracker ในห้านาที

ChinaDeFi
特邀专栏作者
2022-01-07 07:13
บทความนี้มีประมาณ 6731 คำ การอ่านทั้งหมดใช้เวลาประมาณ 10 นาที
ทำความเข้าใจและชื่นชมการปรับปรุงที่นำมาสู่ธุรกรรม Ethereum ได้ดีขึ้นด้วยการสร้างตัวติดตามก๊
สรุปโดย AI
ขยาย
ทำความเข้าใจและชื่นชมการปรับปรุงที่นำมาสู่ธุรกรรม Ethereum ได้ดีขึ้นด้วยการสร้างตัวติดตามก๊

แนะนำ

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

แนะนำ

  • การ hard fork ในลอนดอนในเดือนสิงหาคม 2021 นำมาซึ่งการอัปเกรดครั้งใหญ่ที่สุดในประวัติศาสตร์ของเครือข่าย Ethereum Fork ใช้ EIP-1559 ซึ่งเป็นกลไกการกำหนดราคาก๊าซที่เรียกได้ว่าเหนือกว่ารูปแบบการประมูลแบบปิดตา นอกจากนี้ยังแนะนำการเปลี่ยนแปลงขั้นพื้นฐานในนโยบายการเงินของ Ethereum (ETH) ทำให้เป็นสกุลเงินเงินฝืด อย่างน้อยก็ในระยะสั้น

  • ในบทช่วยสอนนี้ เราจะสร้างตัวติดตามก๊าซที่ติดตามองค์ประกอบใหม่สองส่วนของค่าธรรมเนียมก๊าซใน EIP-1559 และสถิติอื่นๆ (เช่น ขนาดบล็อก) สำหรับ 20 บล็อกล่าสุด เมื่อทำเช่นนี้ เราจะบรรลุเป้าหมายสำคัญสองประการ:

ทำความเข้าใจอย่างลึกซึ้งยิ่งขึ้นเกี่ยวกับวิธีการทำงานของ EIP-1559 และการปรับปรุงอะไรบ้าง

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

ในการทำเช่นนี้ เราจะใช้ Alchemy, ไลบรารี Alchemy web3.js, Node และ React หากคำเหล่านี้ฟังดูแปลกสำหรับคุณ ไม่ต้องกังวล เราจะอธิบายอย่างละเอียด!

บทช่วยสอนนี้ถือว่าผู้อ่านมีความเข้าใจพื้นฐานเกี่ยวกับวิธีการทำงานของราคาก๊าซและก๊าซบน Ethereum ความเข้าใจเบื้องต้นเกี่ยวกับ EIP-1559 ก็มีประโยชน์เช่นกัน แต่ไม่จำเป็น

  • EIP-1559 ทบทวนอย่างรวดเร็ว

  • EIP-1559 นำการเปลี่ยนแปลงต่อไปนี้มาสู่กลไกการกำหนดราคาก๊าซของ Ethereum:

  • ค่าธรรมเนียมการประมูลแบบตาบอดถูกแทนที่ด้วยค่าธรรมเนียมสองรายการ: ค่าธรรมเนียมพื้นฐานและค่าธรรมเนียมการจัดลำดับความสำคัญ (หรือทิปสำหรับนักขุด)

  • ค่าธรรมเนียมพื้นฐานจะถูกกำหนดโดยอัตโนมัติโดยเครือข่าย สามารถเพิ่มเป็น 12.5% ​​หากบล็อกก่อนหน้าเต็มและลดลงเป็น 12.5% ​​หากบล็อกก่อนหน้าว่างเปล่า

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

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

นอกจากการปรับปรุงราคาน้ำมันแล้ว EIP-1559 ยังเสนอการปรับปรุงเพื่อให้เครือข่ายรองรับการจราจรที่พุ่งสูงขึ้นอย่างรวดเร็ว อย่างที่คุณทราบ ธุรกรรมใน Ethereum จะถูกจัดกลุ่มเป็นบล็อกๆ ก่อนทางแยก บล็อกหนึ่งสามารถเก็บธุรกรรมก๊าซได้เพียง 15 ล้านธุรกรรมโดยไม่คำนึงถึงการจราจร

ด้วยการอัปเกรด ความจุของบล็อกเพิ่มขึ้นสองเท่าเป็น 30 ล้านแก๊ส สิ่งนี้ทำเพื่อตอบสนองความต้องการที่เพิ่มขึ้นได้ดีขึ้น อย่างไรก็ตาม คาดว่าค่าธรรมเนียมพื้นฐานจะปรับเป็นค่าเฉลี่ย 50% ของปริมาตรบล็อก (หรือก๊าซที่ใช้โดยบล็อก) หรือประมาณ 15 ล้านก๊าซ

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

ส่วนที่ 1: สคริปต์ประวัติค่าธรรมเนียมการทำธุรกรรม

ในส่วนนี้ เราจะเขียนสคริปต์ (ในโหนด) ที่จะช่วยให้เราได้รับประวัติค่าธรรมเนียมก๊าซสำหรับ 20 บล็อกล่าสุดบนเครือข่าย Ethereum

ขั้นตอนที่ 0: ติดตั้งโหนดและ npm

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งโหนดและ npm (อย่างน้อย v14 หรือสูงกว่า) บนเครื่องของคุณ

ขั้นตอนที่ 1: สร้างบัญชีการเล่นแร่แปรธาตุ

ในการรับประวัติค่าก๊าซล่าสุดสำหรับบล็อก เราจำเป็นต้องเชื่อมต่อกับเครือข่าย Ethereum เพื่อการสื่อสาร Alchemy เป็นแพลตฟอร์มการพัฒนา blockchain ที่ช่วยให้เราทำสิ่งนี้ได้โดยไม่ต้องเปิดโหนดของเราเอง

ขั้นตอนที่ 2: สร้างแอปพลิเคชันการเล่นแร่แปรธาตุ (และคีย์ API)

สร้างแอปพลิเคชันบนแดชบอร์ดการเล่นแร่แปรธาตุ สายโซ่ถูกตั้งค่าเป็น Ethereum และเครือข่ายถูกตั้งค่าเป็น mainnet

จากนั้น ไปที่หน้าแอปพลิเคชันของคุณ แล้วคลิก ดูคีย์ ซึ่งจะเป็นการเปิดป๊อปอัปที่มี HTTP และ Websocket URL ของแอปพลิเคชัน ในบทช่วยสอนนี้ เราจะใช้ Websocket URL

ขั้นตอนที่ 3: สร้างโครงการโหนดและติดตั้งการพึ่งพา

> mkdir gas-tracker-script && cd gas-tracker-script > npm init -y > npm install --save @alch/alchemy-web3 > touch main.js

ตอนนี้เราสามารถเริ่มเขียนโหนดสคริปต์ได้แล้ว มาสร้างที่เก็บเปล่าและติดตั้งการพึ่งพากัน สำหรับสคริปต์นี้ เราต้องการไลบรารี Alchemy web3.js

บนเทอร์มินัลของคุณ (หรือพรอมต์คำสั่ง) ให้รันคำสั่งต่อไปนี้:

สิ่งนี้จะสร้างที่เก็บที่เรียกว่า gas tracker-script พร้อมไฟล์และการอ้างอิงทั้งหมดที่เราต้องการ เปิด repo นี้ในตัวแก้ไขโค้ดที่คุณชื่นชอบ เราจะเขียนโค้ดทั้งหมดในไฟล์ main.js

ขั้นตอนที่ 4: สร้างอินสแตนซ์ไคลเอนต์ web3 ด้วย Alchemy

const { createAlchemyWeb3 } = require("@alch/alchemy-web3");// Using WebSockets
const web3 = createAlchemyWeb3(
   "wss://eth-mainnet.alchemyapi.io/v2/<--API KEY-->",

);

การสร้างไคลเอนต์อินสแตนซ์ด้วย Alchemy web3 นั้นง่ายมาก

ในไฟล์ main.js ให้เพิ่มบรรทัดโค้ดต่อไปนี้:

ตรวจสอบให้แน่ใจว่าได้แทนที่ตัวยึดตำแหน่งด้านบนด้วย websocket URL ของแอปพลิเคชันของคุณ

ขั้นตอนที่ 5: รับประวัติของ 20 ช่วงตึกล่าสุด

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

โชคดีที่การเล่นแร่แปรธาตุมี eth_feeHistory ที่มีประโยชน์มากซึ่งจะส่งคืนข้อมูลทั้งหมดที่กล่าวมาโดยอัตโนมัติ

web3.eth.getFeeHistory(20, "latest", [25, 50, 75]).then(console.log)

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

เราสนใจ 20 บล็อกล่าสุดและเปอร์เซ็นไทล์ที่ 25, 50 และ 75 ของค่าธรรมเนียมลำดับความสำคัญ

การเรียกใช้สคริปต์นี้ (โดยใช้โหนด main.js) ควรดึงข้อมูลที่คุณต้องการ นี่คือข้อมูลบางส่วน ผลลัพธ์ที่ฉันได้รับหลังจากขอข้อมูล 5 บล็อก

ขั้นตอนที่ 6: การจัดรูปแบบเอาต์พุต

const formatOutput = (data, numBlocks) => {    let blocks = []
   for (let i = 0; i < numBlocks; i++) {
       blocks.push({
           blockNumber: Number(data.oldestBlock) + i,
           reward: data.reward[i].map(r => Math.round(Number(r) / 10 ** 9)),
           baseFeePerGas: Math.round(Number(data.baseFeePerGas[i]) / 10 ** 9),
           gasUsedRatio: data.gasUsedRatio[i],
       })
   }

   return blocks;

ผลลัพธ์ที่เราได้รับในขั้นตอนที่ 5 นั้นถูกต้อง แต่ไม่สามารถอ่านได้มากนัก ค่าธรรมเนียมแสดงเป็นเลขฐานสิบหก และโครงสร้างข้อมูลทำให้ยากที่จะทราบว่าข้อมูลใดสอดคล้องกับบล็อกใด

const numBlocks = 5;web3.eth.getFeeHistory(numBlocks, "latest", [25, 50, 75]).then((data) => {
   const blocks = formatOutput(data, numBlocks);
   console.log(blocks);

});

ลองเขียนฟังก์ชันเล็กๆ ที่แปลงข้อมูลดิบเป็นรายการพจนานุกรม โดยที่พจนานุกรมแต่ละรายการจะมีข้อมูลในบล็อกเฉพาะ ฟังก์ชันนี้ยังแปลงค่าแก๊สเลขฐานสิบหกทั้งหมดที่แสดงใน Wei ให้เป็นเลขฐานสิบที่แสดงใน Gwei

สุดท้าย ให้ใช้ฟังก์ชันนี้เป็นค่าประวัติ

การรันสคริปต์เวอร์ชันนี้ควรสร้างเอาต์พุตในรูปแบบต่อไปนี้:

ขั้นตอนที่ 7: สมัครสมาชิกส่วนหัวของบล็อกล่าสุด

let subscription = web3.eth.subscribe('newBlockHeaders');subscription.on("data", () => {
   web3.eth.getFeeHistory(numBlocks, "latest", [25, 50, 75]).then((data) => {
       const blocks = formatOutput(data, numBlocks);
       console.log(blocks);
   });

});

บล็อกใหม่จะถูกเพิ่มเข้าไปใน Ethereum blockchain ทุก ๆ 15 วินาทีโดยประมาณ ดังนั้น ตามหลักแล้ว เราต้องการสมัครรับข้อมูลเหตุการณ์สำหรับการบล็อกที่เพิ่มเข้ามา และอัปเดตประวัติการทำธุรกรรมของเราเพื่อให้แสดงข้อมูลจาก 20 บล็อกล่าสุดเสมอ

มาซ้อนฟังก์ชัน getFeeHistory ภายในการเรียกกลับเหตุการณ์การสมัคร

การรันสคริปต์ main.js ในตอนนี้จะแสดงชุดข้อมูลล่าสุดทุกๆ 15 วินาทีหรือมากกว่านั้น หากคุณมาไกลขนาดนี้ ยินดีด้วย ตอนนี้คุณมีเครื่องติดตามก๊าซที่ทำงานได้อย่างสมบูรณ์แล้ว

ส่วนที่ 2: ตอบสนองแอปพลิเคชัน

ในส่วนก่อนหน้านี้ เราได้เขียนสคริปต์ที่ดึงประวัติค่าธรรมเนียมสำหรับ 20 บล็อกล่าสุดทุกครั้งที่มีการเพิ่มบล็อกใหม่ไปยัง Ethereum mainnet

ในส่วนนี้ เราจะสร้างแอปพลิเคชัน React ขนาดเล็กที่สตรีมข้อมูลนี้จากเทอร์มินัลไปยังเบราว์เซอร์ นอกจากประวัติการทำธุรกรรมค่าธรรมเนียมแล้ว เรายังแสดงค่าธรรมเนียมก๊าซเฉลี่ยและขนาดบล็อกในช่วง 20 บล็อกที่ผ่านมา

> npx create-react-app gas-tracker-frontend > cd gas-tracker-frontend

ขั้นตอนที่ 1: เริ่มต้นโครงการ React และติดตั้งการพึ่งพา

> npm install --save @alch/alchemy-web3

ดำเนินการคำสั่งต่อไปนี้:

สิ่งนี้จะสร้างโครงการ React ตัวอย่าง นอกจากการพึ่งพาการตอบสนองแล้ว เรายังจำเป็นต้องติดตั้งไลบรารี Alchemy web3 จากส่วนก่อนหน้าด้วย

import './App.css';
import { useEffect, useState } from 'react';
import { createAlchemyWeb3 } from '@alch/alchemy-web3';const NUM_BLOCKS = 20;function App() {  const [blockHistory, setBlockHistory] = useState(null);
 const [avgGas, setAvgGas] = useState(null);
 const [avgBlockVolume, setAvgBlockVolume] = useState(null);  const formatOutput = (data) => {    let avgGasFee = 0;
   let avgFill = 0;
   let blocks = [];    for (let i = 0; i < NUM_BLOCKS; i++) {      avgGasFee = avgGasFee + Number(data.reward[i][1]) + Number(data.baseFeePerGas[i])
     avgFill = avgFill + Math.round(data.gasUsedRatio[i] * 100);      blocks.push({
       blockNumber: Number(data.oldestBlock) + i,
       reward: data.reward[i].map(r => Math.round(Number(r) / 10 ** 9)),
       baseFeePerGas: Math.round(Number(data.baseFeePerGas[i]) / 10 ** 9),
       gasUsedRatio: Math.round(data.gasUsedRatio[i] * 100),
     })
   }    avgGasFee = avgGasFee / NUM_BLOCKS;
   avgGasFee = Math.round(avgGasFee / 10 ** 9)    avgFill = avgFill / NUM_BLOCKS;
   return [blocks, avgGasFee, avgFill];
 }  useEffect(() => {    const web3 = createAlchemyWeb3(
     "wss://eth-mainnet.alchemyapi.io/v2/<--API KEY-->",
   );    let subscription = web3.eth.subscribe('newBlockHeaders');    subscription.on('data', () => {
     web3.eth.getFeeHistory(NUM_BLOCKS, "latest", [25, 50, 75]).then((feeHistory) => {
       const [blocks, avgGasFee, avgFill] = formatOutput(feeHistory, NUM_BLOCKS);
       setBlockHistory(blocks);
       setAvgGas(avgGasFee);
       setAvgBlockVolume(avgFill);
     });
   });    return () => {
     web3.eth.clearSubscriptions();
   }
 }, [])
 return (
   


     

EIP-1559 Gas Tracker


     {!blockHistory &&

Data is loading...

}
     {avgGas && avgBlockVolume &&


       {avgGas} Gwei | {avgBlockVolume}% Volume
     

}
     {blockHistory &&
       
         
           
           
           
           
           
           
         
       
       
         {blockHistory.map(block => {
           return (
             
               
               
               
               
               
               
             
           )
         })}
       
     
Block NumberBase FeeReward (25%)Reward (50%)Reward (75%)Gas Used
{block.blockNumber}{block.baseFeePerGas}{block.reward[0]}{block.reward[1]}{block.reward[2]}{block.gasUsedRatio}%
}
   

 );

}export default App;

ขั้นตอนที่ 2: เติมไฟล์ App.js

ตรรกะทั้งหมดของเราจะอยู่ในไฟล์ App.js คัดลอกเนื้อหาต่อไปนี้ไปยังไฟล์ด้านบน

เนื่องจากนี่ไม่ใช่หลักสูตร React เราจะไม่เจาะลึกในส่วนเฉพาะของ React แต่คุณควรสังเกตได้ว่าสิ่งที่เรากำลังทำอยู่คือการเรียกข้อมูลประวัติค่าใช้จ่ายตามที่เราทำในสคริปต์และส่งออกเป็นตาราง HTML

ตรรกะเพิ่มเติมเพียงอย่างเดียวที่เราใช้คือการคำนวณราคาก๊าซเฉลี่ยและขนาดบล็อกเฉลี่ยมากกว่า 20 บล็อก ซึ่งเป็นงานเล็กน้อย

.main-container {
   text-align: center;
}table {
   border-collapse: collapse;
   margin: 20px auto;
   box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
}thead {
   background: linear-gradient(267.45deg,#05d5ff -34.23%,#53f 99.39%);
   color: white;
   padding: 10px;
}th {
   font-size: 18px;
   padding: 15px;}tbody > tr {
   border-top: 1px solid #ccc;
   border-bottom: 1px solid #ccc;
   margin: 0px;
   padding: 15px;
}td {
   padding: 6px;
}.gas {
   color: #4299E1;
}.vol {

   color: #4C51BF;

(ไม่บังคับ) ขั้นตอนที่ 3: เพิ่มสไตล์บางอย่าง

คุณสามารถเพิ่มสไตล์พื้นฐานในไฟล์ App.css ได้ดังนี้:

npm start

ขั้นตอนที่ 4: ปรับใช้แอปพลิเคชันกับ localhost

แอพควรมีลักษณะดังนี้:

วิเคราะห์

ขอแสดงความยินดี คุณมีแอปพลิเคชันติดตามก๊าซที่ทำงานได้อย่างสมบูรณ์

  • วิเคราะห์

  • ลองย้อนกลับไปวิเคราะห์ข้อมูลข้างต้น ต่อไปนี้คือผลลัพธ์โดยตรงของการใช้งาน EIP-1559 ที่เราสามารถสังเกตได้

  • ค่าธรรมเนียมฐานไม่ผันผวนอย่างมากในแต่ละบล็อก อันที่จริงแล้ว การเพิ่มขึ้นหรือลดลงที่ใหญ่ที่สุดคือ 12.5%

ขนาดบล็อกมักจะผันผวน แต่ขนาดบล็อกเฉลี่ยอยู่ที่ประมาณ 50%

สรุปแล้ว

ดูเหมือนว่าข้อมูลจะบ่งชี้ว่าต้นทุนก๊าซสามารถคาดการณ์ได้มากขึ้นในแบบจำลองนี้ เนื่องจากทุกคนจ่ายค่าธรรมเนียมพื้นฐานและลำดับความสำคัญเท่ากัน และในกรณีส่วนใหญ่ ค่าธรรมเนียมการจัดลำดับความสำคัญเป็นเพียงส่วนเล็กๆ ของค่าธรรมเนียมทั้งหมด ธุรกรรมส่วนใหญ่จึงไม่ได้ลงเอยด้วยการจ่ายค่าน้ำมันแพงเกินไป ดังนั้น ข้อมูลตัวอย่างนี้แสดงให้เห็นว่า EIP-1559 ประสบความสำเร็จตามเป้าหมาย ราคาก๊าซที่คาดการณ์ได้มากขึ้น การจ่ายก๊าซส่วนเกินน้อยลง

เราได้กล่าวถึงมากมายในบทความนี้ ด้วยการสร้างตัวติดตามแก๊สสำหรับ EIP-1559 ตั้งแต่เริ่มต้น ฉันหวังว่าคุณจะเข้าใจและชื่นชมการปรับปรุงที่นำมาสู่ธุรกรรม Ethereum

ลิงค์ต้นฉบับ

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