שילוב ENS לאפליקציות dApps: פתרון שמות .eth, אווטרים ורשומות טקסט

משתמשים טועים לעתים קרובות בהזנה ידנית של כתובות ארנק ארוכות, מה שמוביל לאובדן כספים. אנו מפתחים אינטגרציית ENS, והופכים הקסדצימליים מורכבים לשמות קריאים. הצוות שלנו מספק את הפרויקט במפתח מלא, ומבטיח פתרון אמין עם תמיכה מתמשכת.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1481
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1335
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1034
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1293
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    738
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1031

אינטגרציה עם ENS (Ethereum Name Service)

שים לב: כאשר משתמש מזין ידנית את הכתובת 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045, הסבירות לשגיאה גבוהה. תו אחד שגוי והכספים אבודים. על פי סטטיסטיקות, 70% משגיאות העברת ETH נובעות מהזנת כתובת שגויה. Ethereum Name Service פותר זאת: במקום מחרוזת הקס, שם קריא vitalik.eth. אבל אינטגרציית ENS אינה רק קריאות ספרייה. ללא התחשבות בנורמליזציית שמות (UTS-46), עלויות גז ברשת, ופורמט רשומה הפוכה, באגים יכולים להופיע בקלות. אינטגרציה מלאה אורכת 2 עד 5 ימי עבודה. הלקוחות שלנו חוסכים בממוצע $2000 בשנה על העברות בשל הפחתת שגיאות, ועלויות התמיכה יורדות עד $500 בחודש.

למה לשלב ENS?

ENS הוא התקן דה פקטו לכתובות קריאות לאדם באת'ריום. הוא משחרר משתמשים מהעתקת כתובות ארוכות ומפחית שגיאות הזנה. מעל 90% מה-dApps הפופולריים כבר תומכים ב-ENS. אינטגרציה מאפשרת לא רק להציג שמות אלא גם לאחזר אווטרים, אימייל, מדיה חברתית מה-resolver — הכל במקום אחד. חיסכון בזמן למשתמש יכול להגיע ל-10 שניות לכל עסקה.

כיצד פועל פתרון ENS בפרונטאנד

הספריות העיקריות הן ethers.js (v6) ו-viem. הן מספקות שיטות לפתרון קדימה ואחורה, כמו גם אחזור אווטרים.

// ethers.js v6
const provider = new ethers.JsonRpcProvider(RPC_URL);

// Forward resolution: имя → адрес
const address = await provider.resolveName("vitalik.eth");
// "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

// Reverse resolution: адрес → имя
const name = await provider.lookupAddress("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");
// "vitalik.eth" или null если reverse record не установлен

// Avatar
const resolver = await provider.getResolver("vitalik.eth");
const avatar = await resolver?.getAvatar();
// URL аватара или null
// viem
import { createPublicClient, http } from "viem";
import { mainnet } from "viem/chains";
import { normalize } from "viem/ens";

const client = createPublicClient({
  chain: mainnet,
  transport: http(),
});

const address = await client.getEnsAddress({
  name: normalize("vitalik.eth"),
});

const name = await client.getEnsName({
  address: "0xd8dA...",
});

const avatar = await client.getEnsAvatar({
  name: normalize("vitalik.eth"),
});

// ethers.js v6 const provider = new ethers.JsonRpcProvider(RPC_URL); // Forward resolution: имя → адрес const address = await provider.resolveName("vitalik.eth"); // "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" // Reverse resolution: адрес → имя const name = await provider.lookupAddress("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"); // "vitalik.eth" или null если reverse record не установлен // Avatar const resolver = await provider.getResolver("vitalik.eth"); const avatar = await resolver?.getAvatar(); // URL аватара или null חשוב: שמות ENS מנורמלים לפי תקן UTS-46 לפני ה-hashing. // viem import { createPublicClient, http } from "viem"; import { mainnet } from "viem/chains"; import { normalize } from "viem/ens"; const client = createPublicClient({ chain: mainnet, transport: http() }); const address = await client.getEnsAddress({ name: normalize("vitalik.eth") }); const name = await client.getEnsName({ address: "0xd8dA..." }); const avatar = await client.getEnsAvatar({ name: normalize("vitalik.eth") }); ו-normalize() הם אותו שם, אבל ללא Vitalik.ETH הם היו מייצרים namehashes שונים.

למה נורמליזציית שמות היא קריטית

ללא נורמליזציה, השם vitalik.eth ו-MyName.eth ייחשבו שונים, מה שיוביל לשגיאות פתרון. הפונקציה myname.eth מ-viem או ספריית UTS-46 מבטיחה עקביות. בפרונטאנד, שלב זה הוא חובה לפני כל בקשה ל-ENS. אל תשתמש בקלט גולמי מהמשתמש — תמיד נרמל.

השוואת ספריות ושיטות אינטגרציה

פרמטר ethers.js viem
גודל (min+gzip) ~80KB ~50KB
נורמליזציה מובנית לא (דורש UTS-46) כן (שיטת normalize())
שיטות ENS resolveName, lookupAddress, getResolver getEnsAddress, getEnsName, getEnsAvatar
סוג ספרייה מלאה עטיפה דקה

viem מטפל בבקשות ENS פי שניים מהר יותר בזכות הערכה עצלה, וגודל ה-bundle קטן כמעט ב-40%. לפתרון פשוט, viem עדיף. אם אתה צריך פונקציונליות רחבה יותר (למשל, טיפול בעסקאות), ethers.js נשאר התקן.

שיטה ספרייה מורכבות ישימות
פתרון קדימה ethers.js/viem נמוכה רכיבי UI
פתרון אחורה ethers.js/viem נמוכה רכיבי UI
פתרון על הרשת Solidity + ENS Registry בינונית חוזים חכמים
רשומות טקסט ethers.js/viem נמוכה פרופילי משתמש
אווטר ethers.js/viem נמוכה רכיבי UI

איך לפתור ENS על הרשת?

עבור חוזים חכמים, יש צורך בקריאה ישירה ל-ENS Registry. הנה דוגמה לחוזה:

interface IENSResolver {
    function addr(bytes32 node) external view returns (address);
}

interface IENS {
    function resolver(bytes32 node) external view returns (address);
}

contract ENSConsumer {
    IENS constant ENS_REGISTRY = IENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e);

    function resolveENS(bytes32 namehash) external view returns (address) {
        address resolverAddr = ENS_REGISTRY.resolver(namehash);
        require(resolverAddr != address(0), "No resolver");
        return IENSResolver(resolverAddr).addr(namehash);
    }
}

ה-namehash עבור normalize() חייב להיות מחושב מחוץ לרשת (או דרך ENS SDK) ולהועבר לחוזה — חישוב namehash כמחרוזת על הרשת הוא יקר (כ-20k גז).

רשומות טקסט ופרופילים

ENS מאחסן רשומות טקסט שרירותיות לפי מפתח:

const resolver = await provider.getResolver("alice.eth");
const email = await resolver?.getText("email");
const twitter = await resolver?.getText("com.twitter");
const github = await resolver?.getText("com.github");
const website = await resolver?.getText("url");
const description = await resolver?.getText("description");

מפתחות תקניים (EIP-634): interface IENSResolver { function addr(bytes32 node) external view returns (address); } interface IENS { function resolver(bytes32 node) external view returns (address); } contract ENSConsumer { IENS constant ENS_REGISTRY = IENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e); function resolveENS(bytes32 namehash) external view returns (address) { address resolverAddr = ENS_REGISTRY.resolver(namehash); require(resolverAddr != address(0), "No resolver"); return IENSResolver(resolverAddr).addr(namehash); } } , alice.eth, const resolver = await provider.getResolver("alice.eth"); const email = await resolver?.getText("email"); const twitter = await resolver?.getText("com.twitter"); const github = await resolver?.getText("com.github"); const website = await resolver?.getText("url"); const description = await resolver?.getText("description"); , email, url, avatar, description, notice, keywords, com.twitter. זה מהווה בסיס לפרופילים מבוססי ENS: הכל מאוחסן ב-resolver, קריא ללא תשתית נוספת.

תהליך העבודה

כאשר אתה מזמין אינטגרציית ENS, אנו מספקים את המחזור המלא:

  1. ביקורת על ה-dApp הנוכחי וזיהוי נקודות אינטגרציה.
  2. פיתוח רכיבי פרונטאנד (הזנת שם ENS ותצוגה, אווטרים).
  3. יישום פתרון על הרשת אם נדרש.
  4. אינטגרציה של רשומות טקסט ואווטרים.
  5. בדיקות על testnet (Sepolia).
  6. פריסה, ניטור ותיעוד עם דוגמאות קוד.

לוחות זמנים — בין 2 ל-5 ימי עבודה לאינטגרציה בסיסית. העלות מחושבת באופן אישי. צור קשר להערכה מדויקת לפרויקט שלך. קבל ייעוץ על אינטגרציית ENS עוד היום.

טעויות נפוצות באינטגרציית ENS
  • חוסר נורמליזציה — שמות כמו com.github ו-com.discord חייבים לייצר אותו namehash. ללא org.telegram, עלולות להתרחש אי-התאמות.
  • התעלמות מעלויות גז על הרשת — קריאה ל-Vitalik.ETH ו-vitalik.eth בחוזה עולה גז; השתמש רק בעת הצורך.
  • namehash שגוי — אם מועבר node שגוי, הפתרון מחזיר normalize().

הניסיון שלנו

יישמנו ENS ביותר מ-30 dApps במשך למעלה מ-5 שנות עבודה, כולל שווקי DeFi ו-NFT. למהנדסים שלנו יש ידע מעמיק בפרטי ENS: מנורמליזציה ועד אופטימיזציית גז. אנו מבטיחים יציבות ותאימות לגרסאות הספריות העדכניות ביותר. תמיכה לאחר הפריסה — חודש אחד.