- โปรโตคอล AT เป็นโปรโตคอลที่เป็นรากฐานของโซเชียลเน็ตเวิร์กแบบกระจายศูนย์ โดยข้อมูลทั้งหมดจะถูกระบุด้วย at:// URI
- at:// URI ใช้ ผู้สร้างข้อมูล (ผู้ใช้) เป็น authority และต้องค้นหาแยกต่างหากว่า โฮสต์อยู่ที่ไหนจริง
- ขั้นตอนการ resolve URI ประกอบด้วยการ แปลง handle เป็นตัวตน (DID), การตรวจสอบ เซิร์ฟเวอร์โฮสต์ผ่าน DID Document, และการ ร้องขอข้อมูล JSON จากเซิร์ฟเวอร์นั้นตามลำดับ
- รองรับ DID สองรูปแบบ (did:web, did:plc) ซึ่งมี ข้อดีข้อเสียและวิธีการคงอยู่ของข้อมูล ต่างกัน
- แนวทางนี้เน้นว่า ความเป็นเจ้าของข้อมูลอยู่ที่ผู้ใช้ และรับประกัน ความคงทนของการเชื่อมโยง แม้ handle และโฮสต์จะเปลี่ยนไปก็ตาม
โปรโตคอล AT, at:// URI และกระบวนการ resolve ตัวตนของข้อมูลโซเชียล
# โครงสร้างพื้นฐานของโปรโตคอล AT และ at:// URI
- โปรโตคอล AT ทำให้เซิร์ฟเวอร์แบบกระจายหลายแห่งสื่อสารกันได้ตามมาตรฐานที่กำหนด และเรียกระบบรวมนี้ว่า 'atmosphere'
- ข้อมูลแต่ละชิ้นใน atmosphere จะได้รับ URI เฉพาะที่ขึ้นต้นด้วย at:// ซึ่งทำหน้าที่เสมือนลิงก์ไปยังข้อมูล JSON
- ต่างจากโครงสร้าง URI แบบดั้งเดิม ในโปรโตคอล AT จะกำหนดให้ ผู้สร้างข้อมูล (ผู้ใช้) เป็น authority ของ URI
- ตัวอย่างเช่น ในรูปแบบ at://ruuuuu.de/app.bsky.feed.post/3lzy2ji4nms2z, ruuuuu.de ระบุว่าเป็นเจ้าของข้อมูลนั้น
- เซิร์ฟเวอร์จริงที่โฮสต์ข้อมูลทางกายภาพไม่ได้ถูกรวมไว้ใน URI โดยตรง จึงต้องมีขั้นตอน resolve เพิ่มเติมเพื่อค้นหา
# สามขั้นตอนของการ resolve at:// URI
- การแมป at:// URI ไปยังข้อมูลจริง (JOSN) ต้องมีสามขั้นตอน
- แปลง handle (เช่น ruuuuu.de) เป็นตัวตน (DID: Decentralized Identifier)
- handle เป็นชื่อแทนสำหรับระบุผู้ใช้และสามารถเปลี่ยนได้
- จึงต้องแปลงเป็น DID ซึ่งเป็น Global ID ที่ไม่เปลี่ยนแปลง
- วิธีแปลง:
- ตรวจสอบข้อมูลโฮสต์ของข้อมูลผ่าน DID Document
- ร้องขอข้อมูล JSON ผ่าน API ของเซิร์ฟเวอร์โฮสต์
- ส่งแต่ละส่วนของ at:// เป็นพารามิเตอร์ไปยัง endpoint
com.atproto.repo.getRecord เพื่อร้องขอข้อมูล
- JSON ที่ส่งกลับมาคือข้อมูลจริงที่แมปกับ at:// URI
# อธิบายกระบวนการ resolve ผ่านตัวอย่าง
- ตัวอย่าง: at://ruuuuu.de/app.bsky.feed.post/3lzy2ji4nms2z
- แม้ handle จะเปลี่ยนไป หากใช้ at:// URI (permalink) ที่อิง DID ความเชื่อมโยงระหว่างบัญชีกับข้อมูลก็ยังคงอยู่
# ความแตกต่างระหว่าง did:web และ did:plc
- did:web:
- สามารถจัดการและยืนยันโดเมนของตนเองได้
- หากสูญเสียสิทธิ์ควบคุมโดเมน ก็อาจสูญเสีย ID ทั้งหมดได้
- did:plc:
- PLC (Public Ledger of Credentials) เป็นผู้ดำเนินการ ID
- ไม่ผูกติดกับโดเมน แต่ก็มีความเป็นไปได้ของการควบคุมแบบจำกัด เช่น ผู้ดำเนินการ PLC อาจปฏิเสธการอัปเดต
- ประวัติการเปลี่ยนแปลงทั้งหมดสามารถตรวจสอบและติดตามได้ด้วยแฮช
# การแยกตัวตน โฮสต์ และข้อมูลออกจากกัน พร้อมความคงทน
- at:// แยกตัวตนออกจากการโฮสต์ข้อมูล ทำให้ข้อมูลผู้ใช้พกพาได้และสร้างลิงก์ถาวรได้
- Handle (ชื่อเล่น) สามารถเปลี่ยนได้ตลอดเวลา และเซิร์ฟเวอร์โฮสต์ก็สามารถย้ายได้เช่นกัน
- DID (ตัวตน) ไม่เปลี่ยนแปลง และ at:// URI ที่อิงสิ่งนี้สามารถใช้เป็น permalink แบบถาวรได้
- DID Document มีทั้งหลักฐานความเป็นเจ้าของ handle, คีย์สำหรับตรวจสอบลายเซ็น, และข้อมูลโฮสต์ จึงรับประกันทั้งความน่าเชื่อถือและความยืดหยุ่น
# การใช้งานจริงและประเด็นด้านการพัฒนา
- ในทางปฏิบัติ แอปส่วนใหญ่ที่สร้างบน AT มักรับข้อมูลแบบ push ผ่าน Websocket เป็นต้น แล้วรวบรวมลงฐานข้อมูลภายใน
- ถึงอย่างนั้น การเข้าใจวิธี resolve at:// URI ก็ยังจำเป็นต่อการ ทำความเข้าใจลักษณะของเครือข่ายและการย้ายข้อมูลได้
- ระบบ at:// มอบชั้น abstraction สำหรับโซเชียลเน็ตเวิร์กบนพื้นฐานของ HTTP, DNS และ JSON และ ทำให้ความเป็นเจ้าของข้อมูลของผู้ใช้เกิดขึ้นจริงในเชิงเทคนิค
# บทสรุป
- โปรโตคอล AT และ at:// URI ยกระดับเรื่องตัวตน การเชื่อมโยง และความคงทนของข้อมูลโซเชียลในเชิงเทคนิคไปอีกขั้น
- นักพัฒนาจำเป็นต้องเข้าใจ เวิร์กโฟลว์หลัก เช่น การ resolve handle, การใช้ DID, โครงสร้าง DID Document และวิธีร้องขอข้อมูลจริง
- ด้วยโครงสร้างนี้ ผู้ใช้จึงได้รับทั้งความยืดหยุ่นและความเป็นเจ้าของระหว่างคอนเทนต์ ตัวตน และตำแหน่งที่โฮสต์ของตนเอง
1 ความคิดเห็น
ความเห็นจาก Hacker News
ได้แรงบันดาลใจจากบทความเกี่ยวกับ ATProto ช่วงหลัง ๆ เลยลองสมัคร bsky ดู แต่สิ่งที่เห็นมีแต่เรื่องการเมืองอเมริกันไม่รู้จบ กด "แสดงโพสต์แบบนี้ให้น้อยลง" ไปเรื่อย ๆ ก็แทบไม่ช่วยอะไร เลยสงสัยว่านี่คือธรรมชาติของแพลตฟอร์มนี้หรือเปล่า การต้องเห็นแต่ความเห็นซ้ำ ๆ ต่อประเด็นถกเถียงแปลก ๆ ในต่างประเทศมันไม่ค่อยดีต่อสุขภาพจิตเท่าไร
ผมยังไม่แน่ใจว่าโปรเจกต์นี้แก้ปัญหาเรื่องอัตลักษณ์และการเป็นเจ้าของข้อมูลได้อย่างมีความหมายจริงหรือไม่ ในแง่อัตลักษณ์มันก็มีแค่ใช้โดเมนของตัวเองหรือใช้โดเมนของคนอื่น (เช่น Bluesky) คนส่วนใหญ่ไม่มีโดเมนอยู่แล้ว สุดท้ายอัตลักษณ์ของพวกเขาก็ไปอยู่กับบุคคลที่สามเหมือนเดิม ข้อมูลก็เช่นกัน ถ้าบัญชีถูกบล็อกจาก Bluesky หรือเซิร์ฟเวอร์อื่น ตัวที่เก็บข้อมูลก็จะถูกปิด และคุณอาจเสียโอกาสแม้แต่จะย้ายข้อมูลไปที่อื่นด้วยซ้ำ มันก็เหมือนอีเมลนั่นแหละ ถ้าไม่มีโดเมนและเซิร์ฟเวอร์ของตัวเอง คุณแทบควบคุมอะไรไม่ได้เลย
คำอธิบายของ Dan ยอดเยี่ยมทุกครั้ง และยิ่งตรงจังหวะกับข่าวล่าสุดเรื่อง Bluesky จะโอนสิทธิ์การดูแล PLC ด้วย ทีมของเราก็เลือกใช้ระบบ DID เดียวกันที่ fair.pm เพื่อกระจายการเผยแพร่ปลั๊กอิน WordPress (พูดง่าย ๆ คือระบบจัดการแพ็กเกจคล้าย App Store) ฝั่ง Bluesky โดยเฉพาะ Bryan ช่วยเราเยอะมาก และเรายังขอให้รองรับคีย์ Ed25519 เพื่อให้ใช้ libsodium ได้ด้วย โปรโตคอลของเรากำลังออกแบบอยู่บน DID และระบบ stackable moderation ของ Bluesky แต่ไม่ได้ใช้ atproto โดยตรง ประเด็นสำคัญคือ DID เป็นมาตรฐาน W3C ดังนั้น PLC จึงไม่ได้ผูกติดกับ atproto
ถ้าจะหา at:// ต้องส่ง GET ไปที่ plc.directory ซึ่งตรงนี้ทำให้ระบบดูเหมือนกลายเป็นโมเดลรวมศูนย์ 100% อย่างน้อยน่าจะแยก trusted directories หลายแห่งออกจากโปรโตคอลได้ (คล้าย DNS root หรือ CA)
ทุกเซิร์ฟเวอร์ที่เก็บลิงก์ at:// สุดท้ายคงต้องผ่าน DNS/HTTPS เพื่อหา representation แบบถาวร (permalink) ที่เป็นทางการ ถ้า DNSSEC ไม่แน่นหนา โครงสร้างนี้ก็ดูเปราะบางพอสมควร ยังไม่ได้คิดลึกมาก แต่ความกังวลที่นึกออกทันทีคือปัญหาอย่าง DNS poisoning อาจทำให้ผู้โจมตีโพสต์ในนามของผมได้ (เพราะ public key อยู่ใน DID ที่ดึงมาจาก DNS)
ในบทความมีข้อมูลน้อยเกินไปเกี่ยวกับคีย์ที่ใช้ในประวัติการเปลี่ยน DID เช่น ถ้าผมคือ foobar.bsky.social ผมไม่เคยจำได้ว่าเคยอัปโหลดคีย์เองหรือมีคำแนะนำให้ดาวน์โหลดเลย เลยอยากรู้ว่าคีย์นั้นอยู่ที่ไหนกันแน่ ใครเป็นเจ้าของ และมันถูกใช้อย่างไรเมื่อไร อีกอย่าง ถ้า DID อยู่ใน plc.directory กลไกอะไรที่ป้องกันไม่ให้ผู้ดูแลเว็บไซต์นั้นเขียนทับ DID ของผมตามอำเภอใจแล้วขโมยอัตลักษณ์ของผมไป
แนวคิด at:// น่าสนใจ แต่ก็อดกังวลเรื่องปัญหาที่อาจเกิดในระบบซึ่งยึดการเป็นเจ้าของข้อมูลจริง ๆ ไม่ได้ เช่น ถ้าผู้ใช้ถือข้อมูลเอง ก็สามารถแก้หรือจะลบเนื้อหาเมื่อไรก็ได้ตามใจ สมมติว่าเขาเขียนโพสต์ดี ๆ ไว้ตอนแรก แล้วภายหลังแก้เป็นเนื้อหาร้าย ๆ แม้เราจะเก็บ hash ของโพสต์เก่าไว้เพื่อกันการเปลี่ยนแปลง บริการใหม่ ๆ ก็อาจไม่รู้ประวัตินั้น อีกทั้งการติดตามสิ่งอย่างไลก์หรือ upvote ก็ยาก ถ้าทุกคนเก็บวัตถุของตัวเองแยกกัน ก็ยิ่งหายากว่าใครโหวตอะไร นอกจากนี้ถ้าสร้างบัญชีปลอมขึ้นมาแล้วโพสต์ดันงานของตัวเองเรื่อย ๆ ก็ดูเหมือนไม่มีข้อจำกัด สุดท้ายถ้ามีบัญชีจำนวนมหาศาลจากหลายแพลตฟอร์ม การทำ moderation กับสแปมหรือพฤติกรรมไม่หวังดีจะกลายเป็นไปไม่ได้ไหม ภายใต้สมมติฐานว่าทุกบัญชีจัดการข้อมูลตัวเอง ผมยังไม่แน่ใจว่าการออกแบบระบบในแง่ความโปร่งใส ความรับผิดชอบ การกลั่นกรอง และการกันสแปม จะตั้งอยู่ได้จริงหรือไม่
strongRefซึ่งเป็น permalink จริงแบบอิง hash อยู่ Dan ไม่ได้ลงรายละเอียดเรื่องนี้ในบทความมากนัก แต่ถ้าเก็บstrongRefไว้ ก็ตรวจจับได้ทันทีว่าโพสต์เดิมถูกเปลี่ยนเนื้อหาไปหรือไม่ เหตุผลที่ Bluesky ยังไม่ใส่ฟีเจอร์ edit ก็เพราะกังวลเรื่องการแก้ไขแบบไม่หวังดี (ดู สรุปการทดลอง permalink, การทดลองประวัติการแก้ไข record ประกอบ) ส่วนการติดตาม upvote ถ้า crawl เครือข่ายมาเก็บข้อมูลก็น่าจะพอทำได้คร่าว ๆ ด้วย roaring bitmap หรืออะไรแนวนี้ (ตัวอย่าง roaring-bitmaps) เรื่อง moderation ก็มี stackable moderation ซึ่งเจ๋งกว่าระบบเดิมมาก และก็มีการคุยกันเรื่องทำ labeler/feedgen ให้เป็น DAG (ระบบประกอบกฎแบบเซตโอเปอเรชัน) ด้วย ปัญหาการปลอมข้อมูลก็ตรวจจับการเปลี่ยนแปลงได้ผ่าน CID hash ของแต่ละรายการ และการติดตาม history ก็เป็นไปได้ทางเทคนิคมันให้ความรู้สึกคล้ายโปรโตคอลคริปโตหลาย ๆ ตัวที่พูดเรื่องกระจายศูนย์ แต่สุดท้ายก็ยังผูกติดกับแพลตฟอร์มเดียวอยู่ดี
มีคำถามเชิงโครงสร้างว่า "จะหา JSON ผ่าน at:// URI ได้อย่างไร" อ่านเอกสารแล้วก็ยังไม่ค่อยเข้าใจว่าทำไมถึงต้องมี 'JSON นั้น' ด้วย ส่วนตัวรู้สึกว่าวิธีนี้ไม่ค่อยเข้าท่า
สงสัยว่าโปรโตคอลนี้ทำหน้าที่คล้าย public Kafka topic ขนาดมหึมาหรือไม่ เช่น เวลาสร้างเว็บแอปใหม่ ไม่ต้องเก็บข้อมูลเอง แต่ให้ผู้ใช้แต่ละคนเก็บข้อมูลของตัวเองไว้ แล้วเราแค่มี listener ที่คอยฟัง โดยโปรโตคอลรับประกันการกระจายข้อมูล แอปก็ฟังและ cache เอาไว้ แบบนี้หรือเปล่า ฟังดูน่าสนใจในเชิงแนวคิด แต่ก็สงสัยด้วยว่าแนวคิดของ Kafka อย่าง offset หรือ partition เพื่อสเกลและกันพลาดอัปเดต ถูกนำมาใช้ด้วยไหม