3P English نوشتن را شروع کن

پروتکلی برای ساختن شبکه‌ای قابل اعتماد، بر پایه‌ی خودِ واقعیِ ما

پروتکل، در یک صفحه

یک پروتکل، نه یک سکو: قالب‌های باز و بردارهای آزمون مشترک که هر پیاده‌سازی می‌تواند خودش را با آن‌ها بسنجد.

امروز یک پیاده‌سازی هست، در پایتون و در مرورگر. آزمون واقعیِ این قالب‌ها یک پیاده‌سازی دوم و مستقل است. بردارهای پایین برای همان‌اند.

هر کس 3P خودش (نود) را اجرا می‌کند. دفترش روی رایانه‌ی خودش می‌ماند. کارت چیزی است که خودش تصمیم می‌گیرد نشان دهد: بسته‌ای امضاشده از چند یادداشت، از یک چهره، که خودش منقضی می‌شود. هویت با گم شدن کلید از بین نمی‌رود. یک سازمان می‌تواند یک یادداشت را با کلیدی که روی دامنه‌ی خودش منتشر کرده تأیید کند. دستیارها از راه MCP وصل می‌شوند و برای هر کار اجازه‌ی جداگانه لازم دارند.

قالب‌ها

هر شیء شناسه‌ی قالبش را با خود دارد. هر کدام به پرونده‌ای پیوند دارد که آن را دقیق تعریف می‌کند: یک پرونده‌ی بردار آزمون مشترک (ورودی‌ها با خروجی دقیقی که هر بررسی‌کننده باید بدهد) یا یک JSON Schema.

قالببرای چیستتعریف در
3p.card/1کارت: یادداشت‌هایی از یک چهره، با امضای خود آدم، که خودش منقضی می‌شود.vectors.json
3p.identity/1آغاز یک هویت: کلید نخست، و کلید بازیابی که با اثر انگشتش از همان اول تعهد شده است.chains.json
3p.rotate/1هویت را به کلید تازه می‌برد. کلید قدیم امضا می‌کند و کلید تازه می‌پذیرد.chains.json
3p.recover/1کلید گم‌شده یا دزدیده‌شده را با امضای کلید بازیابیِ کاغذی جایگزین می‌کند. آن کلید فقط کلید عوض می‌کند و هرگز کارت امضا نمی‌کند.chains.json
3p.salience/1آنچه حالا مهم است: به‌روزرسانیِ امضاشده‌ای که جای قبلی را می‌گیرد و خودش کهنه می‌شود.salience.json
3p.domain-keys/1پرونده‌ی کلید یک سازمان، در https://<domain>/.well-known/3p-keys.json.پرونده‌ی نمایشیِ همین سایت · امضای تأیید
3p.countersign/1امضای یک سازمان روی اثر محتوای یک یادداشت، پیش از آنکه آدم کارت را امضا کند.countersign.json
3p.head/1طول یک دفتر و هشِ انتهای آن، که به کسی که می‌بینید نشان داده می‌شود تا گواهی‌اش کند. هش هر یادداشت نمک دارد؛ چیز خواندنی‌ای در آن نیست.proof_vectors.json
3p.witness/1امضای کس دیگری روی انتهای دفتر شما: «این دفتر را با این طول دیدم». written_before در کارت با آن ثابت می‌کند یادداشتی از پیش آنجا بوده است.proof_vectors.json
3p.withdraw/1کارت منتشرشده را از دفتر جمعی پس می‌گیرد.هنوز بردار مشترکی ندارد
3p.capture/1یک ثبت: آنچه در لحظه‌ی نوشتن رخ داد، و یادداشت‌هایی که به آن ارجاع می‌دهند. پایین‌تر را ببینید.capture.schema.json
قاعده (constraint)یک «هرگز انجام نده» یا «هرگز نگو»، آن‌طور که درون کارت می‌رود.constraint.schema.json

پرونده‌های بردار فقط نیمه‌ی عمومیِ کلیدهای آزمون را دارند و هیچ‌کس را شناسایی نمی‌کنند.

شکل متعارف

امضا روی بایت‌هاست، پس هر پیاده‌سازی باید یک شیء را به همان بایت‌ها تبدیل کند. قاعده‌ها:

{"b":1,"a":[{"z":null,"y":true}],"_":3,"B":2}
→ {"B":2,"_":3,"a":[{"y":true,"z":null}],"b":1}
→ sha256 c75679b877c2402654baf84f2bf8d139567306febef9bcdfa4f9873a18a0b687

بررسی یک کارت

  1. کارت را بگیرید، proof.sig را بردارید و بقیه را به شکل متعارف بنویسید.
  2. امضا را با proof.key بسنجید. امضای کوتاه، بلند، صفر یا بدشکل یعنی بررسیِ ناموفق، هرگز از کار افتادن.
  3. بسنجید که کلید از طرف subject حرف می‌زند: با اثر انگشتش، یا با زنجیره‌ای درست از جابه‌جایی‌ها و بازیابی‌ها از کلید نخست.
  4. تاریخ‌ها را بسنجید: issued، expires و تاریخ هر تغییر کلید.
  5. برای هر امضای تأیید، پرونده‌ی کلید آن دامنه را بگیرید و بسنجید، همان‌طور که در صفحه‌ی امضای تأیید آمده است.

سه پاسخ هست و هرگز دو تا نمی‌شود: درست (با نامی که ذخیره کرده‌اید، یا امضاکننده‌ی ناشناس)، و نادرست.

هر کسی می‌تواند امضای یک کارت را در مرورگر خودش بررسی کند.

بررسی‌کننده به هر ورودی‌ای پاسخ می‌دهد و فقط آنچه امضا شده را می‌پذیرد.

باز کردن بررسی‌کننده

پیاده‌سازی خودتان را با بردارهای کارت، زنجیره‌های هویت، امضاهای تأیید و آنچه حالا مهم است بسنجید. هر حالت ورودی را می‌دهد و پاسخی را که باید بدهد. بررسی‌کننده‌ی پایتون و بررسی‌کننده‌ی مرورگر، در Chromium، Firefox و WebKit، روی همین پرونده‌ها اجرا شده‌اند.

بررسی‌کننده در مرورگر خودتان اجرا می‌شود. دو جور چیز می‌گیرد: نمونه‌های همین سایت، وقتی یکی را امتحان می‌کنید، و پرونده‌ی کلید هر دامنه‌ای که کارت می‌گوید آن را تأیید کرده است.

رابط دستیار

دستیار با 3P یک نفر از راه MCP حرف می‌زند (JSON-RPC روی stdio، بی‌نیاز به SDK). یک چهره را به نام می‌خواهد و فقط همان را می‌گیرد.

claude mcp add 3p -- python3 /absolute/path/to/mcp_server.py

دستیار تو نیست. پیش از خواندن اجازه می‌گیرد، و هر کار را جداگانه اجازه می‌دهی: خواندن، نوشتن، امضا، انتشار.

این برای دستیارهایی است که از راه 3P می‌آیند. نرم‌افزاری که با حساب خودت روی رایانه‌ات اجرا می‌شود، می‌تواند پرونده‌ی دفترت را مستقیم بخواند.

هر اجازه (grant) برای یک دستیار، یک چهره، چند سطح باز بودن و مدتی معیّن است، و کارهایش را نام می‌برد: read، log، sign، publish. read همیشه هست؛ بقیه باید نام برده شوند.

ابزارچه می‌کنداجازه‌ی لازم
list_scopesچهره‌هایی که این 3P ارائه می‌دهدread
get_personaترجیح‌ها، قاعده‌ها و زمینه‌ی یک چهره، با خلاصه‌ای از یادداشت‌هایشread
search_factsجست‌وجو در یادداشت‌های یک چهرهread
attested_factsفقط یادداشت‌هایی که کس دیگری تأییدشان کردهread
get_salienceآنچه حالا مهم است، در یک چهرهread
publishedآنچه منتشر شده، و اینکه زنده است، منقضی شده یا پس گرفته شدهread
withdrawپس گرفتن کارت منتشرشدهread: پس گرفتن همیشه فقط کمتر نشان می‌دهد
logنوشتن یادداشت با کلمات خود آدم، با نشانِ «رسانده‌شده به دست دستیار»log
correctاصلاح یک یادداشت؛ متن قبلی نگه داشته می‌شودlog
mint_packetامضای یک کارت برای یک چهرهsign
mint_salienceامضای به‌روزرسانیِ آنچه حالا مهم استsign
publishانتشار بخش بازِ یک چهره در دفتر جمعیpublish
python3 consent.py requests                         # what asked, and was refused
python3 consent.py grant claude-code work --tiers public --for 1h
python3 consent.py grant claude-code work --for 8h --allow log,publish
python3 consent.py revoke 3

بی‌اجازه‌ی زنده، درخواست رد می‌شود و برای اینکه خود آدم ببیند ثبت می‌شود. هر فراخوانی ثبت می‌شود، چه اجازه داشته باشد چه نه. private را به هیچ چیز نمی‌شود اجازه داد.

دستیار هرگز نمی‌تواند اجازه‌ای را که دادی گسترده‌تر کند.

نام یک کلاینت MCP همان است که خودش می‌گوید. اجازه مرزی است در برابر نرم‌افزاری که بی‌پرسش کاری بکند؛ ثابت نمی‌کند کدام نرم‌افزار می‌پرسد.

قرارداد ثبت: 3p.capture/1

آنچه یک 3P بیرون می‌دهد، و آنچه ابزار دیگری (یک برنامه‌ی ثبت، یک آینه) می‌تواند به آن بدهد. دو فهرست دارد:

بیرون از schema، بررسیِ انطباق این را هم می‌سنجد: هر fact به actی در همان سند ارجاع می‌دهد، شناسه‌ها یکتا هستند، و هیچ فیلدی از آینه در هیچ عمقی نیست. آینه هرگز جابه‌جا نمی‌شود.

{"format": "3p.capture/1", "exported_at": "2026-10-19T09:00:00Z",
 "acts":  [{"id": "act:fixture05", "kind": "relayed", "captured_at": "2026-10-16T10:00:00Z",
            "device": "mcp", "relayed_by": "claude-code",
            "content_sha256": "28fea5dcc347d363cc771873322e9e66b4e8e17ada0c2ac0d624c03991c2d2f0"}],
 "facts": [{"id": "fact:5", "text": "Load-tested retries at 5x #work", "occurred": "2026-10-16",
            "recorded": "2026-10-16T10:00:00Z", "entry_mode": "live", "act": "act:fixture05",
            "share_tier": "private", "tags": []}]}

schema. این نمونه از آزمون‌هاست و ساختگی است.

آنچه هنوز در پروتکل نیست

دفترت را شروع کن.

نوشتن را شروع کن