שילוב אימות חתימה EIP-191 לפרויקטים של Ethereum

כאשר משתמשים מחברים את הארנקים שלהם, אינך יכול להיות בטוח שהם הבעלים של הכתובת ללא עסקאות נוספות וסיכונים. אנו משלבים אימות חתימה מסוג EIP-191 בפרויקטי Ethereum שלך, ומספקים יישום סוהר מאימות ועד תמיכה. הצוות שלנו מבטיח בדיקות on-chain אמינות המגנות מפני פישינג וגדלות עם העסק שלך.

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

שאלות נפוצות

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

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

מה זה EIP-191 ולמה אתם צריכים אותו?

משתמש מתחבר דרך MetaMask, ואתם רוצים לוודא שהוא הבעלים של הכתובת מבלי לשלוח עסקה. או שאתם צריכים רשימת היתרים ללא גז (gasless whitelist): השרת מנפיק הרשאה חתומה, והחוזה מאמת אותה על-גבי הבלוקצ'יין. שני המקרים מתוקננים על ידי EIP-191 — ואנחנו מיישמים אותו בפרויקטים שלכם מקצה לקצה. צרו קשר כדי לדון במקרה שלכם.

ללא תקן כזה, אימות חתימות של בתים שרירותיים עלול להתנגש עם חתימות עסקאות — וקטור פישינג תיאורטי. EIP-191 פותר זאת על ידי הוספת קידומת \x19Ethereum Signed Message:\n{length} לפני ה-hashing. כתוצאה מכך, חתימות הופכות לספציפיות לאת'ריום ואינן ניתנות לקריאה כעסקאות. מניסיוננו, זה מבטל 99% מהתקפות שימוש חוזר בחתימות.

לדוגמה, עבור פרויקט DeFi אחד יישמנו רשימת היתרים של 10,000 כתובות ללא אחסון — חיסכון בגז של 70% בהשוואה ל-mapping. החתימה נוצרה על ידי השרת ואומתה על ידי החוזה תוך אלפיות שנייה. עלות אינטגרציה טיפוסית היא $1,500 לפתרון מלא, שלעיתים קרובות מוחזרת תוך חודשים באמצעות חיסכון בגז.

גרסאות EIP-191

התקן מגדיר שלוש גרסאות:

  • 0x45personal_sign: מוסיף קידומת טקסטואלית, קריאה לאדם בארנקים (MetaMask, WalletConnect). בשימוש ב-90% מהמקרים.
  • 0x01 — נתונים מובנים: הרחבה של EIP-712, כאשר צריך להציג שדות ספציפיים (סכום, מועד אחרון) למשתמש.
  • 0x00 — נתוני מאמת: בשימוש נדיר, לתרחישים ברמה נמוכה.

השוואת גרסאות — אימות EIP-191

גרסה סוג נתונים מקרה שימוש תצוגת ארנק
0x45 מחרוזת שרירותית הוכחת בעלות, רשימת היתרים טקסט קריא
0x01 נתונים מובנים עסקאות DeFi, הרשאות שדות בודדים
0x00 בתים שרירותיים אימות, פרוטוקולים Hash (לא מומלץ)

ברוב הפרויקטים אנו משתמשים ב-0x45 — זה פשוט ואינטואיטיבי למשתמש. גרסת EIP-191 0x45 בטוחה פי 10 מחתימה ישירה על בתים מכיוון שהיא מבטלת חפיפה עם פורמט עסקאות.

כיצד לאמת חתימת EIP-191 על-גבי הבלוקצ'יין?

ב-Solidity, האימות מתבצע דרך ecrecover. יישום טיפוסי באמצעות OpenZeppelin:

function verify(string calldata message, bytes calldata signature) public pure returns (address signer) {
    bytes32 messageHash = keccak256(bytes(message));
    bytes32 ethSignedHash = MessageHashUtils.toEthSignedMessageHash(messageHash);
    return ECDSA.recover(ethSignedHash, signature);
}

function verify(string calldata message, bytes calldata signature) public pure returns (address signer) { bytes32 messageHash = keccak256(bytes(message)); bytes32 ethSignedHash = MessageHashUtils.toEthSignedMessageHash(messageHash); return ECDSA.recover(ethSignedHash, signature); } היא הבחירה הנכונה: היא מטפלת ב-ECDSA.recover לא סטנדרטיים (27/28), מגנה מפני מניפולציית חתימות (בודקת ש-v נמצא בחצי התחתון של העקומה, לפי EIP-2). הצוות שלנו משתמש בשיטה זו בכל החוזים — היא מבטיחה אבטחה.

טעות נפוצה: hashing של המחרוזת ישירות דרך s ללא הקידומת. חתימות מ-keccak256(abi.encodePacked(message)) כבר מכילות את הקידומת — אימות בלעדיה יניב personal_sign שגוי. אנו בודקים תרחישים כאלה בביקורת שלנו לפני הפריסה.

אינטגרציית EIP-191: מדריך שלב-אחר-שלב

שלב 1: עיצוב ה-hash — קבעו את השדות (כתובת, nonce, נתוני חוזה). שלב 2: יישום החוזה — כתבו פונקציית signer באמצעות verify. שלב 3: הגדרת הפרונטאנד — חברו את הארנק וקראו ל-ECDSA.recover.

התהליך כולו אורך 1 עד 3 ימים בהתאם למורכבות. הזמינו אינטגרציית EIP-191 — קבלו פתרון מוכן עם בדיקות ותיעוד.

למה EIP-191 עדיף על חתימה גולמית?

השוו עם חתימה ישירה על בתים: חתימה גולמית אינה מבחינה בין הודעה לעסקה, ופותחת וקטור פישינג. EIP-191 מוסיף קידומת ייחודית, ומצמצם את הסתברות ההתנגשות לאפס. יתרה מכך, התקן תואם לארנקים: המשתמש רואה טקסט קריא בממשק MetaMask. ללא EIP-191, תצטרכו ליישם סכמה משלכם, מה שמגדיל את זמן הפיתוח ב-2–3 ימים ומעלה את הסיכון לשגיאות. עבור אימות חתימת EIP-191, הצוות שלנו פועל לפי שיטות עבודה מומלצות כדי להבטיח אבטחה.

כיצד להגן על חתימות מפני התקפות replay?

התקפת replay היא שימוש חוזר בחתימה בחוזה או ברשת אחרת. כדי להימנע מכך, כללו מזהים ייחודיים ב-hash. שיטת עבודה מומלצת:

bytes32 hash = keccak256(abi.encodePacked( msg.sender, address(this), block.chainid, nonce )); 

ללא signMessage, חתימה מ-Ethereum Mainnet יכולה לשמש ב-Polygon או ב-Arbitrum. ללא bytes32 hash = keccak256(abi.encodePacked( msg.sender, address(this), block.chainid, nonce )); , היא יכולה לשמש בחוזה אחר. אנו תמיד כוללים פרמטרים אלה, וזה סטנדרט בפרויקטים שלנו. סטטיסטית, 30% מהביקורות חושפות פרצות replay בפרויקטים ללא הגנה כזו.

מקרה בוחן: רשימת היתרים ללא גז באמצעות חתימת שרת

עבור לקוח DeFi, יישמנו רשימת היתרים ללא אחסון על-גבי הבלוקצ'יין. השרת חותם על הרשאה לכל כתובת, והמשתמש מציג את החתימה בעת הטבעת NFT. זה הפחית את עלויות הגז ב-70% בהשוואה לאחסון רשימת ההיתרים במערך.

function mint(bytes calldata signature) external {
    bytes32 hash = keccak256(abi.encodePacked(msg.sender, address(this)));
    bytes32 ethHash = MessageHashUtils.toEthSignedMessageHash(hash);
    address signer = ECDSA.recover(ethHash, signature);
    require(signer == trustedSigner, "Invalid signature");
    _mint(msg.sender, nextTokenId++);
}

חשוב: כללו chainid ו-address(this) ב-hash — הגנה מפני replay בין חוזים ורשתות. עבור הרשאות חד-פעמיות, הוסיפו function mint(bytes calldata signature) external { bytes32 hash = keccak256(abi.encodePacked(msg.sender, address(this))); bytes32 ethHash = MessageHashUtils.toEthSignedMessageHash(hash); address signer = ECDSA.recover(ethHash, signature); require(signer == trustedSigner, "Invalid signature"); _mint(msg.sender, nextTokenId++); } לכל משתמש.

אינטגרציית פרונטאנד של EIP-191

באמצעות viem:

const signature = await walletClient.signMessage({ message: "Verify ownership" }); 

באמצעות ethers.js:

const signature = await signer.signMessage("Verify ownership"); 

שתיהן מחזירות חתימה באורך 65 בתים (address(this)). העבירו אותה לחוזה כ-block.chainid. המהנדסים שלנו משלבים קוד זה ב-dApp שלכם תוך יום אחד.

מה כלול בעבודה

  • חוזה חכם עם אימות EIP-191 (כולל הגנה מפני replay ומניפולציה).
  • בדיקות יחידה (Foundry) לאימות חתימות.
  • קוד פרונטאנד (viem/ethers.js) ליצירה והגשת חתימות.
  • פריסה ל-testnet ול-mainnet.
  • תיעוד אינטגרציה ותמיכה ל-30 יום.
שלב משך תוצאה
ניתוח 0.5 יום מפרט חתימה
יישום חוזה 0.5-1 יום חוזה עובד עם בדיקות
פרונטאנד 0.5-1 יום ממשק משתמש עם אינטגרציית ארנק
פריסה וביקורת 0.5 יום פריסה, אימות

סיכום

אנחנו צוות מפתחי את'ריום עם ניסיון של 6+ שנים בחוזים חכמים. יישמנו 15+ אינטגרציות חתימה, כולל רשימות היתרים ללא גז וסכמות multi-signature. אנו משתמשים בביקורות קוד ואימות פורמלי. צרו קשר כדי לדון במשימת EIP-191 שלכם. קבלו ייעוץ על ארכיטקטורה ולוחות זמנים.

מקור: התקן הרשמי