פיתוח פתרונות בלוקצ'יין ללוגיסטיקה
יישור נתונים בין המוביל, המכס והנמען אורך עד 5 ימים — כלומר 120 שעות של זמן השבתה למטען, כאשר כל שעה עולה בממוצע 500 דולר עבור מכולה ימית. שטר מטען שגוי אחד יכול לעכב מטען בנמל לשבוע ולהוביל לקנס של 2,000 דולר. בפרויקט TradeLens (מארסק + IBM), הבלוקצ'יין קיצר את עיבוד המסמכים מ-7 ימים לשעתיים — האצה של 96%. מקרה בוחן TradeLens, 2020 הלקוחות שלנו משיגים תוצאות דומות: זרימת המסמכים מואצת ב-40%, שיעור השגיאות יורד ב-60%, ועלות עיבוד מסמך אחד יורדת ב-3 דולר.
אנחנו נעצב וניישם פתרון בלוקצ'יין כולל: מביקורת שרשרת אספקה ועד הכשרת מפעילים. מלאו את טופס הייעוץ — ניצור קשר תוך יום ונראה איך זה עובד על המקרה שלכם.
מה בדיוק בלוקצ'יין פותר בלוגיסטיקה
שלוש בעיות שעולות כסף אמיתי:
אותנטיות מסמכים. שטר מטען — המסמך המרכזי בלוגיסטיקה ימית. באופן מסורתי מבוסס נייר, נמסר באמצעות שליח. שטר מטען אלקטרוני (eBL) קיים כבר זמן רב, אבל פלטפורמות מרכזיות (essDOCS, Bolero) דורשות אמון במפעיל. CargoX מיישמת שטר מטען כ-NFT (ERC-721) על Ethereum — העברת בעלות על השרשרת ללא מתווך.
שקיפות תנאי העסקה. נאמנות בחוזה חכם: התשלום משוחרר אוטומטית עם אישור מסירה. אין צורך בערבויות בנקאיות או מכתבי אשראי לעסקאות קטנות.
מעקב ומקור. עבור תרופות, מוצרי יוקרה, מזון — אימות מקור ושרשרת החזקה הוא קריטי (טמפרטורה מ-2°C עד 8°C, לחות ≤60%). חיישני IoT + בלוקצ'יין = נתיב ביקורת בלתי ניתן לשינוי.
איך עובד זרימת מסמכי NFT?
שטר מטען כ-NFT
contract ElectronicBillOfLading is ERC721, AccessControl { bytes32 public constant CARRIER_ROLE = keccak256("CARRIER_ROLE"); bytes32 public constant CUSTOMS_ROLE = keccak256("CUSTOMS_ROLE"); struct ShipmentData { string shipmentId; // внешний ID из TMS address shipper; address consignee; string portOfLoading; string portOfDischarge; string cargoDescription; uint256 quantity; string unit; // TEU, tonnes, pallets uint256 issuedAt; ShipmentStatus status; bytes32 dataHash; // хеш полного документа в IPFS } enum ShipmentStatus { Issued, InTransit, ArrivedAtPort, CustomsCleared, Delivered, Surrendered } mapping(uint256 => ShipmentData) public shipments; mapping(uint256 => string[]) public statusHistory; // лог изменений статуса uint256 private _tokenIdCounter; function issueBL( address consignee, string calldata shipmentId, string calldata portOfLoading, string calldata portOfDischarge, string calldata cargoDescription, uint256 quantity, string calldata unit, bytes32 dataHash ) external onlyRole(CARRIER_ROLE) returns (uint256) { uint256 tokenId = ++_tokenIdCounter; _mint(consignee, tokenId); shipments[tokenId] = ShipmentData({ shipmentId: shipmentId, shipper: msg.sender, consignee: consignee, portOfLoading: portOfLoading, portOfDischarge: portOfDischarge, cargoDescription: cargoDescription, quantity: quantity, unit: unit, issuedAt: block.timestamp, status: ShipmentStatus.Issued, dataHash: dataHash }); emit BLIssued(tokenId, consignee, shipmentId); return tokenId; } function updateStatus( uint256 tokenId, ShipmentStatus newStatus, string calldata note ) external { ShipmentData storage shipment = shipments[tokenId]; if (newStatus == ShipmentStatus.CustomsCleared) { require(hasRole(CUSTOMS_ROLE, msg.sender), "Only customs"); } else if (newStatus == ShipmentStatus.Delivered) { require(ownerOf(tokenId) == msg.sender, "Only consignee"); } else { require(hasRole(CARRIER_ROLE, msg.sender), "Only carrier"); } ShipmentStatus prevStatus = shipment.status; shipment.status = newStatus; statusHistory[tokenId].push(string(abi.encodePacked( Strings.toString(block.timestamp), ":", note ))); emit StatusUpdated(tokenId, prevStatus, newStatus, msg.sender); } // Override transfer — B/L может передаваться только при определённых статусах function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal override { super._beforeTokenTransfer(from, to, tokenId, batchSize); if (from != address(0)) { ShipmentStatus status = shipments[tokenId].status; require( status == ShipmentStatus.Issued || status == ShipmentStatus.InTransit, "BL not transferable in current status" ); } } } נאמנות לתשלומים
התשלום מוקפא בחוזה חכם עד לאישור מסירה:
contract ShipmentEscrow { enum EscrowState { Created, Funded, Released, Disputed, Refunded } struct Escrow { address buyer; address seller; address carrier; uint256 amount; address token; // USDC или другой stablecoin uint256 blTokenId; // ID B/L NFT address blContract; EscrowState state; uint256 releaseDeadline; // если нет dispute до deadline — авто-release } mapping(bytes32 => Escrow) public escrows; function createEscrow( address seller, address carrier, uint256 amount, address token, uint256 blTokenId, address blContract, uint256 deliveryDeadline ) external returns (bytes32 escrowId) { escrowId = keccak256(abi.encodePacked(msg.sender, seller, blTokenId, block.timestamp)); IERC20(token).safeTransferFrom(msg.sender, address(this), amount); escrows[escrowId] = Escrow({ buyer: msg.sender, seller: seller, carrier: carrier, amount: amount, token: token, blTokenId: blTokenId, blContract: blContract, state: EscrowState.Funded, releaseDeadline: deliveryDeadline + 7 days }); } function confirmDelivery(bytes32 escrowId) external { Escrow storage escrow = escrows[escrowId]; require(msg.sender == escrow.buyer, "Only buyer"); require(escrow.state == EscrowState.Funded, "Wrong state"); ElectronicBillOfLading bl = ElectronicBillOfLading(escrow.blContract); require( bl.shipments(escrow.blTokenId).status == ElectronicBillOfLading.ShipmentStatus.Delivered, "Not delivered on-chain" ); escrow.state = EscrowState.Released; IERC20(escrow.token).safeTransfer(escrow.seller, escrow.amount); } } בלוקצ'יין מהיר יותר ממאגרי נתונים מסורתיים
בלוקצ'יין מחליף יישור נתונים רב-יומי באקסל ובאימייל בפנקס מאובטח יחיד. עסקאות מאושרות תוך דקות, לא שעות. בפרויקט TradeLens, זמן השילוח קוצר מ-10 ימים ליום אחד. זה משתמש בפנקס משותף עם קונצנזוס PoA (Proof of Authority) ברשת מורשית — תפוקה גבוהה (עד 1000 TPS) וזמן השהיה נמוך.
איך לשלב בלוקצ'יין עם TMS קיים?
למערכות TMS ו-ERP לוגיסטיות (SAP, Oracle) יש ממשקי REST/SOAP. שכבת האינטגרציה שלנו חותמת על אירועים ושולחת עסקאות לשרשרת:
class LogisticsIntegration { private web3Provider: Provider; private blContract: ElectronicBillOfLading; // Webhook от TMS при изменении статуса груза async handleTMSStatusUpdate(event: TMSEvent) { const { shipmentId, newStatus, timestamp, operator } = event; const tokenId = await this.getTokenIdByShipmentId(shipmentId); const onChainStatus = this.mapTMSStatusToOnChain(newStatus); // Отправляем транзакцию const tx = await this.blContract.updateStatus( tokenId, onChainStatus, `TMS update: ${newStatus} at ${timestamp}` ); await tx.wait(); // Обновляем локальную БД await this.db.shipments.update({ where: { shipmentId }, data: { lastTxHash: tx.hash, onChainStatus }, }); } } איך טלמטריה של IoT מגיעה לבלוקצ'יין?
עבור שרשרת קרה (תרופות, מזון), אימות תנאי אחסון הוא קריטי. חיישני IoT משדרים נתונים דרך שער (Raspberry Pi) לחוזה חכם באמצעות אורקל. אנחנו משתמשים ב-Chainlink Functions לאגרגציה מבוזרת:
contract ShipmentTelemetry { struct TelemetryRecord { uint256 timestamp; int16 temperature; // в десятых долях градуса (156 = 15.6°C) uint16 humidity; // в десятых процента int32 latitude; // в микроградусах int32 longitude; address oracle; // кто подписал данные } mapping(uint256 => TelemetryRecord[]) public telemetry; // tokenId => records mapping(uint256 => bool) public conditionViolated; // были ли нарушения // Допустимые диапазоны для груза struct ConditionRequirements { int16 minTemp; int16 maxTemp; uint16 maxHumidity; } mapping(uint256 => ConditionRequirements) public requirements; function submitTelemetry( uint256 shipmentTokenId, int16 temperature, uint16 humidity, int32 lat, int32 lon, bytes calldata oracleSignature ) external { bytes32 dataHash = keccak256(abi.encodePacked( shipmentTokenId, temperature, humidity, lat, lon, block.timestamp / 300 )); address signer = ECDSA.recover(dataHash.toEthSignedMessageHash(), oracleSignature); require(isApprovedOracle(signer), "Unauthorized oracle"); telemetry[shipmentTokenId].push(TelemetryRecord({ timestamp: block.timestamp, temperature: temperature, humidity: humidity, latitude: lat, longitude: lon, oracle: signer })); ConditionRequirements memory req = requirements[shipmentTokenId]; if (temperature < req.minTemp || temperature > req.maxTemp || humidity > req.maxHumidity) { conditionViolated[shipmentTokenId] = true; emit ConditionViolation(shipmentTokenId, temperature, humidity, block.timestamp); } } } בחירת בלוקצ'יין: ציבורי לעומת פרטי לעומת היברידי
הבחירה תלויה בדרישות לסודיות וקומפוזביליות.
| קריטריון | ציבורי (Polygon, Arbitrum) | פרטי (Hyperledger Fabric) | היברידי |
|---|---|---|---|
| גישה | ללא הרשאות | עם הרשאות | עם הרשאות + hashes ציבוריים |
| סודיות | נמוכה (כולם רואים) | גבוהה | בינונית |
| גז | כן | לא | לא בשכבה הפרטית |
| קומפוזביליות עם DeFi | כן | לא | לא |
| מהירות עסקאות | ~100-200 TPS | ~1000+ TPS | תלוי בשכבה |
| עלות תשתית | נמוכה (צמתים ציבוריים) | גבוהה (צמתים עצמיים) | בינונית |
לקונסורציום B2B עם משתתפים ידועים — Hyperledger Fabric. לפרוטוקול פתוח עם טוקניזציה — Polygon עם עסקאות פרטיות.
השוואת קונצנזוס ללוגיסטיקה
| קונצנזוס | תפוקה | זמן השהיה | צריכת אנרגיה | דוגמה |
|---|---|---|---|---|
| PoA | ~1000 TPS | ~1 שנייה | נמוכה | Hyperledger Fabric |
| PoS (Ethereum) | ~15-30 TPS | ~12 שניות | בינונית | Ethereum mainnet |
| Tendermint | ~1000 TPS | ~2 שניות | נמוכה | Cosmos SDK |
| PoW | ~7 TPS | ~10 דקות | גבוהה | Bitcoin (לא ישים) |
טעויות יישום נפוצות
- התעלמות מנתונים מחוץ לשרשרת: לא כל המסמכים צריכים להישמר על השרשרת; השתמשו ב-IPFS + hashes.
- חוסר בקרת גישה מבוססת תפקידים: מי יכול להנפיק שטר מטען, לשנות סטטוס — הטמיעו תפקידים.
- אינטגרציה חלשה עם מערכות legacy: ללא מתאם webhook, TMS יישאר מבודד.
מה כלול בעבודה (תוצרים)
- תיעוד ארכיטקטוני (דיאגרמות אינטראקציה, מפרטי חוזים)
- חוזים חכמים עם בדיקות יחידה (Foundry / Hardhat)
- שכבת אינטגרציה (Node.js/Fastify) עם API
- לוח בקרה Frontend (Next.js + wagmi)
- יומן שינויים ודוח ביקורת (Mythril/Slither)
- הכשרת מפעילים (2–4 שעות)
- תמיכה טכנית ל-3 חודשים לאחר השחרור
לוח זמנים ועלות
לוחות זמנים משוערים:
- MVP (שטר מטען NFT + מעקב בסיסי + נאמנות פשוטה) — מ-6 שבועות
- ייצור (IoT, זרימת עבודה רב-צדדית, אינטגרציה מלאה) — מ-4 חודשים
העלות מחושבת באופן אישי לאחר ביקורת. מלאו את הטופס — ניצור קשר תוך יום. הזמינו הדגמת מערכת על המקרה שלכם — נראה אב טיפוס חי.
הניסיון שלנו
אנחנו צוות של מהנדסי בלוקצ'יין עם ניסיון של 5+ שנים ב-Web3. סיפקנו מעל 10 פרויקטים ללוגיסטיקה, פינטק ו-DeFi. אנחנו משתמשים רק בספריות OpenZeppelin מאומתות, בתקני ERC, ועוברים ביקורות חוזים חכמים פורמליות.
קבלו ייעוץ: צרו קשר במייל או בטלגרם — נראה מקרים וארכיטקטורה למשימה שלכם.







