השאלה
בעידן שבו מודלים יוצרים תמונות, מסמכים וקוד באיכות שקשה להבדילה מהמקור, איך מוכיחים שקובץ הוא באמת מה שהוא טוען שהוא — בלי להישען על גורם מרכזי שצריך לתת בו אמון? זו השאלה שהובילה את הפרויקט.
פתרונות קיימים כמו C2PA כבר עושים hard/soft binding בין קובץ לחותם, אבל הם נשענים על מאגרים מרכזיים ועל תשתית PKI של רשויות אמון. רציתי לבדוק מה נשאר לחדש כשמורידים את הצומת המרכזי מהתמונה.
הרעיון המרכזי
חותם (seal) הוא רשומה חתומה שקושרת יחד את ה-hash של הקובץ (keccak256, hard binding), התחייבות תוכן, ומזהה IPFS CID. החתימה עצמה נעשית ב-EIP-712 מעל ההתחייבות המלאה עם domain separation, כדי למנוע replay.
עוגן ההוכחה יושב על בלוקצ'יין ולא במאגר מרכזי — מה שהופך את המקוריות לניתנת לאימות בלי לתת אמון בגורם יחיד. עיקרון מנחה שהצבתי מראש: חותם תקף איננו הוכחת בעלות. חותם תקף על תוכן גנוב הוא בעיה שנשארת פתוחה במכוון.
החידוש
שתי איטרציות של סקירה אדוורסרית שרפו טענות חדשנות שגויות: גם ה-hard/soft binding וגם 'מרשם פענוח מבוזר' כבר קיימים בתקן. מה שנשאר כתרומה אמיתית ב-v0.3 הוא פענוח trustless ועמיד-ביזנטית: מודל איום על ה-resolver (צנזורה, הדרה, התאמה מזויפת), פעולת RESOLVE שמחזירה הוכחת הכללה או הוכחת אי-חברות מול שורש מעוגן על השרשרת, ומשפט תקינות-פענוח.
אלה מכניקות שה-soft binding resolution של C2PA משאיר בידי resolver ישר — SEAL הופך אותן לניתנות-לאימות.
מה נבנה
הפאזה הראשונה (1a) עלתה לפרודקשן בתוך click-pdf: seal-core.js עושה hard-binding ב-keccak256, בונה את התחייבות ה-EIP-712 וחותם/משחזר ב-secp256k1. יש מסך חתימה (drop file, MetaMask או מפתח fallback מקומי, פלט .seal.json + QR) ומסך אימות שמריץ ecrecover ומחזיר תקין או מזויף.
החידוש הספציפי ל-PDF הוא זרימת edit→sign→unforgeable: העורך מייצא את הבייטים הערוכים העדכניים ומעביר אותם לחתימה, כך שאי אפשר לזייף מסמך שנערך ונחתם. הזרימה המלאה אומתה בדפדפן אמיתי — עורך, חתימה, אימות תקין, ואימות שנכשל על קובץ שעבר שינוי.
לפאזה 1b נבנה skeleton מלא של החוזה החכם (SealRegistry.sol, פרויקט Foundry עם בדיקות) שעבר אודיט אדוורסרי בארבעה צירים — הקריפטו של החתימה יצא נקי. הוא לא נפרס עדיין: פריסה חוסמת על ארנק, RPC וגז.
הסטטוס
הנייר הגיע ל-v2.0 FINAL: 63 עמודים, שש חלקים מ-Problem/Landscape ועד Agenda, עם משפטים פורמליים, מודלי איום, ומיפוי משפטי. חשוב לי לציין את מה שסקירה קפדנית חשפה: גרסאות ביניים טענו לארטיפקטים שלא היו קיימים על הדיסק, ולכן בניתי בפועל את חבילת הייחוס — seal_demo.mjs, חבילת 17 test vectors, החוזה שעובר 15/15 עם מספרי גז מדודים, וחתימת ML-DSA-65 אמיתית לעמידות פוסט-קוונטית.
המצב הנוכחי: פאזה 1a חיה בפרודקשן, פאזה 1b מוכנה כ-plug-and-play וממתינה לארנק, והנייר מוכן לפרסום אחרי העלאת חבילת הייחוס למאגר ציבורי. המאגר עצמו פרטי/מקומי בשלב זה.