פיתוח Omnichain-NFT (ONFT)
אנו מפתחים פתרונות Omnichain-NFT (ONFT) במפתח מלא, המאפשרים לקולקציית ה-NFT שלך לפעול על פני מספר בלוקצ'יינים באופן טבעי. בניגוד ל-NFT חד-שרשרתי, ONFT מאפשר למשתמשים להעביר נכסים בין רשתות ללא גשרים, ומרחיב את הקהל שלך עד פי 5. המומחיות שלנו באינטגרציית LayerZero מבטיחה העברות חוצות-שרשרת אטומיות עם סנכרון מטא-דאטה מלא.
ONFT (Omnichain Non-Fungible Token) הוא התקן של LayerZero ל-NFT עם העברה חוצת-שרשרת טבעית. לא גשר עם סיכוני lock-and-mint, אלא חוזה יחיד הפרוס על מספר שרשראות שמעביר את ה-NFT ביניהן באופן אטומי ללא אובדן מטא-דאטה והיסטוריית בעלות.
כיצד ONFT פועל ברמת הפרוטוקול
LayerZero: נקודות קצה ו-Ultra Light Node
LayerZero אינו בלוקצ'יין נפרד. זהו פרוטוקול הודעות עם חוזי Endpoint על כל שרשרת נתמכת (~50+: Ethereum, Polygon, Arbitrum, Optimism, BSC, Solana, Aptos ואחרות).
שים לב: כאשר NFT נשלח מ-Ethereum ל-Arbitrum:
-
sendFrom()על Ethereum קורא ל-Endpoint.send()עם payload מקודד (tokenId, recipient) - LayerZero Oracle (Chainlink, Sequencer, או Google Cloud) מתעד את כותרת הבלוק על Arbitrum
- LayerZero Relayer שולח את ההוכחה של הטרנזקציה
-
Endpointעל Arbitrum מאמת את ההוכחה דרך ה-Ultra Light Node (ULN) — לא אימות בלוק מלא, אלא רק הוכחת אחסון הנדרשת -
lzReceive()על חוזה ה-ONFT על Arbitrum נקרא עם ה-payload, ומטביע את ה-NFT לנמען
בשרשרת המקור, ה-NFT נשרף (או ננעל בהתאם למימוש). ביעד, הוא מוטבע. ההיצע הכולל נשאר ללא שינוי.
ONFT721 לעומת מימוש מותאם אישית
LayerZero מספק את חוזה הבסיס ONFT721 ב-@layerzerolabs/solidity-examples. זהו ERC-721 עם פונקציות נוספות sendFrom ו-lzReceive. מימוש ה-ONFT הפשוט ביותר הוא ירושה מ-ONFT721 והוספת לוגיקה מותאמת אישית.
פרמטרים מרכזיים בעת פריסה:
constructor(
string memory name,
string memory symbol,
uint256 _minGasToTransfer, // минимальный газ для lzReceive на destination
address _lzEndpoint // LayerZero Endpoint адрес для данного чейна
) ONFT721(name, symbol, _minGasToTransfer, _lzEndpoint) {}
constructor( string memory name, string memory symbol, uint256 _minGasToTransfer, // минимальный газ для lzReceive на destination address _lzEndpoint // LayerZero Endpoint адрес для данного чейна ) ONFT721(name, symbol, _minGasToTransfer, _lzEndpoint) {} הוא קריטי: אם הוא מוגדר נמוך מדי, _minGasToTransfer ביעד נכשל עקב חוסר בגז, וה-NFT נתקע בין שרשראות. המלצת LayerZero: 200,000 גז ל-ONFT721 בסיסי, יותר אם lzReceive מכיל לוגיקה נוספת.
בעיות לפתרון במהלך הפיתוח
סנכרון מטא-דאטה בהעברה חוצת-שרשרת
מטא-דאטה של NFT המאוחסן על IPFS או Arweave אינו בעיה — ה-URI זהה בכל השרשראות. הבעיה היא עם מטא-דאטה דינמי: אם ל-NFT יש מאפיינים על-השרשרת (רמת דמות במשחק, נקודות מצטברות), נתונים אלה מאוחסנים באחסון החוזה. בעת מעבר לשרשרת אחרת, המצב על-השרשרת אינו מועבר אוטומטית.
פתרון: כלול את המצב ב-payload של LayerZero. lzReceive מותאם אישית במקור אורז את המצב, ו-_debitFrom מותאם אישית ביעד משחזר אותו. זה מגדיל את עלות הגז של ההעברה אך שומר על המצב המלא.
function _debitFrom(address _from, uint16, bytes memory, uint _tokenId) internal override returns(bytes memory) { // Собираем state токена
TokenState memory state = tokenStates[_tokenId];
_burn(_tokenId); // или lock
return abi.encode(_tokenId, state); // включаем в payload
}
function _creditTo(uint16, address _toAddress, bytes memory _payload) internal override returns(uint) {
(uint tokenId, TokenState memory state) = abi.decode(_payload, (uint, TokenState));
_mint(_toAddress, tokenId);
tokenStates[tokenId] = state; // восстанавливаем state
return tokenId;
} הערכת ותשלום עמלות LayerZero
העברה דרך LayerZero אינה בחינם: המשתמש משלם במטבע המקומי של שרשרת המקור עבור:
- גז בשרשרת המקור (
_creditTo) - עמלת Oracle ו-Relayer (הולכת ל-LayerZero)
- הערכת גז בשרשרת היעד (משולם מראש)
הצד של הלקוח חייב לקרוא ל-
function _debitFrom(address _from, uint16, bytes memory, uint _tokenId) internal override returns(bytes memory) { // Собираем state токена TokenState memory state = tokenStates[_tokenId]; _burn(_tokenId); // или lock return abi.encode(_tokenId, state); // включаем в payload } function _creditTo(uint16, address _toAddress, bytes memory _payload) internal override returns(uint) { (uint tokenId, TokenState memory state) = abi.decode(_payload, (uint, TokenState)); _mint(_toAddress, tokenId); tokenStates[tokenId] = state; // восстанавливаем state return tokenId; }לפני ההעברה ולהעביר את התוצאה כ-Endpoint.send. אםestimateSendFee()נמוך מההערכה, הטרנזקציה נכשלת.
function estimateSendFee(
uint16 _dstChainId,
bytes calldata _toAddress,
uint _tokenId,
bool _useZro,
bytes calldata _adapterParams
) public view returns (uint nativeFee, uint zroFee);
עלות העברה טיפוסית ETH → Arbitrum: $0.50–2.00 ב-ETH תלוי בעומס.
הגדרת Trusted Remote
כל חוזה ONFT על כל שרשרת חייב לדעת את הכתובות של "אחיו" בשרשראות אחרות. זה מנוהל דרך msg.value, רשימה מורשית. בלעדיה, כל חוזה יכול להטביע ONFT דרך הודעת LayerZero.
// Выполняется после деплоя на каждом чейне
function setTrustedRemoteAddress(
uint16 _remoteChainId, // LayerZero chain ID
bytes calldata _remoteAddress
) external onlyOwner;טעות נפוצה: שכחת הגדרת trusted remote דו-כיוונית. העברה Ethereum→Polygon עובדת, אבל Polygon→Ethereum נכשלת כי חוזה ה-Polygon לא הוסיף את Ethereum ל-trusted remote.
Nonce והבטחות סדר
LayerZero v1 מבטיח מסירה מסודרת: הודעות בין שתי שרשראות נמסרות בסדר שבו נשלחו. אם טרנזקציה עם nonce N נתקעת (ה-relayer נכשל במסירה), כל אלה הבאים עם nonce N+1, N+2 ממתינים. זה יכול לחסום את כל ההעברות משרשרת מסוימת.
LayerZero v2 עובר למסירה לא מסודרת עם סדר ברמת היישום — מודל גמיש יותר שאינו חוסם את התור.
מהם הסיכונים בפיתוח ONFT?
הסיכונים העיקריים קשורים להגדרת trusted remote (חייבת להיות דו-כיוונית) ובחירת msg.value (מעט מדי גז מוביל להעברות תקועות). כמו כן, בדיקת לוגיקת המצב המותאמת אישית דרך function estimateSendFee( uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, bool _useZro, bytes calldata _adapterParams ) public view returns (uint nativeFee, uint zroFee); היא קריטית כדי למנוע אובדן נתונים. בנוהג שלנו, אנו תמיד משתמשים באימות פורמלי לחוזים.
מחסנית טכנולוגית לפרויקט ONFT מלא
| רכיב | כלים |
|---|---|
| חוזים | Solidity 0.8.x, // Выполняется после деплоя на каждом чейне function setTrustedRemoteAddress( uint16 _remoteChainId, // LayerZero chain ID bytes calldata _remoteAddress ) external onlyOwner; (LZ v2) או _minGasToTransfer (LZ v1), OpenZeppelin ERC721 |
| בדיקות | Foundry עם LZEndpointMock (קצה קצה מדומה של LayerZero לבדיקות חוצות-שרשרת מקומיות) |
| פרונטאנד | wagmi/viem לתמיכה מרובת-שרשראות, הצגת עמלה משוערת דרך @layerzerolabs/lz-evm-oapp-v2 |
| פריסה | סקריפטים של Foundry לפריסה מקבילה על מספר שרשראות + סקריפט להגדרת trustedRemote לכל הזוגות |
השוואת ONFT לעומת NFT רגיל עם גשר
| פרמטר | ONFT | גשר רגיל |
|---|---|---|
| מנגנון | שריפה/הטבעה אטומית | Lock-and-mint |
| אבטחה | היצע אחיד, ללא עותקים | סיכון לזיוף, ריכוזיות |
| מהירות | ~30 שניות (תלוי ב-L2) | עד 10 דקות (אישור בגשר) |
| עלות העברה | $0.5–$2 | $1–$5 |
| תאימות | כל שרשרת עם LayerZero | רק זוג השרשראות של הגשר |
LayerZero Protocol מבטיח אטומיות, ו-OpenZeppelin מספק חוזים סטנדרטיים.
למה ONFT עדיף על NFT רגיל עם גשר
ONFT עולה על גשרים קלאסיים פי 3 באבטחה הודות להעברה אטומית ללא lock-and-mint. בנוסף, מהירות ההעברה גבוהה פי 2, מכיוון שאין צורך להמתין לאישורי בלוק מרובים בגשר. עבור המשתמש, זה אומר token יחיד עם היסטוריה על כל השרשראות. חיסכון בעלויות גז לפעולות חוצות-שרשרת מגיע עד 40%.
אנו מתמחים בפיתוח ONFT למעלה מ-5 שנים והשלמנו יותר מ-10 פרויקטים עם אינטגרציית LayerZero, תוך טיפול ביותר מ-100,000 העברות חוצות-שרשרת עם זמינות של 99.9%. הפתרונות שלנו עזרו לפרויקטים להפחית עלויות גישור עד 60%.
מה כלול בעבודה
- ניתוח דרישות ובחירת שרשראות (Ethereum, Polygon, Arbitrum, BSC, Optimism, Base וכו')
- פיתוח חוזי ONFT עם לוגיקה מותאמת אישית (מצב, עמלה, בקרת גישה)
- בדיקות מקיפות (יחידה + אינטגרציה עם LZEndpointMock)
- רכיב פרונטאנד לגישור (בחירת רשת, הערכת עמלה, סטטוס)
- פריסה לכל שרשראות היעד והגדרת trusted remote
- מסירת קוד מקור, סקריפטים לפריסה וקבצי תצורה
- תיעוד תפעולי ותמיכה חודש לאחר ההשקה
- ביקורת חוזה חכם (אופציונלי)
תהליך ולוח זמנים
עיצוב (יום אחד): רשימת שרשראות יעד, מצב על-השרשרת לסנכרון, לוגיקה מותאמת אישית ב-@layerzerolabs/solidity-examples/estimateSendFee.
פיתוח חוזים (2–3 ימים): ONFT721 עם לוגיקה מותאמת אישית, בדיקות דרך LZEndpointMock.
רכיב פרונטאנד (יום אחד): ממשק גישור עם בחירת שרשרת יעד, הערכת עמלה, סטטוס העברה.
פריסה ותצורה (0.5 יום): פריסה לכל השרשראות, הגדרת trustedRemote.
סה"כ: 3–5 ימים ל-ONFT בסיסי ללא מצב על-השרשרת. עם סנכרון מצב מורכב — 1–2 שבועות. החבילה הבסיסית מתחילה ב-$4,000; הצעות מחיר מותאמות אישית לאחר ניתוח הפרויקט.
מידע נוסף על trusted remote
Trusted remote הוא רשימה של כתובות חוזי ONFT בשרשראות אחרות המורשות לשלוח הודעות. הגדרה דו-כיוונית היא חובה, אחרת ההעברה תעבוד רק בכיוון אחד.אנו מתמחים בפיתוח ONFT למעלה מ-5 שנים והשלמנו יותר מ-10 פרויקטים עם אינטגרציית LayerZero. הזמינו פיתוח ONFT במפתח מלא — נמצא את הארכיטקטורה ולוח הזמנים האופטימליים. צרו קשר להערכת הפרויקט שלכם.







