אינטגרציה עם 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, אנו מספקים את המחזור המלא:
- ביקורת על ה-dApp הנוכחי וזיהוי נקודות אינטגרציה.
- פיתוח רכיבי פרונטאנד (הזנת שם ENS ותצוגה, אווטרים).
- יישום פתרון על הרשת אם נדרש.
- אינטגרציה של רשומות טקסט ואווטרים.
- בדיקות על testnet (Sepolia).
- פריסה, ניטור ותיעוד עם דוגמאות קוד.
לוחות זמנים — בין 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: מנורמליזציה ועד אופטימיזציית גז. אנו מבטיחים יציבות ותאימות לגרסאות הספריות העדכניות ביותר. תמיכה לאחר הפריסה — חודש אחד.







