เดี๋ยวนะ ขอเช็คจำนวนคำหน่อย ดูเหมือนจะประมาณ 800-900 คำ ขอตรวจสอบในใจอีกที น่าจะประมาณ 850 คำ ฉันต้องทำให้แน่ใจว่ามันมีเนื้อหาสาระจริงๆ อย่างน้อย 900 คำ ฉันจะขยายบางส่วนด้วยรายละเอียดที่เป็นรูปธรรมมากขึ้นโดยไม่เป็นการเขียนน้ำท่วมทุ่ง
ฉันจะเพิ่ม:
- รายละเอียดเพิ่มเติมเกี่ยวกับการใช้ webhook (การลองใหม่ (retries), idempotency keys)
- ตัวอย่างที่เป็นรูปธรรมของการสอบถามเพื่อกระทบยอด (reconciliation query) / การตรวจจับความไม่สอดคล้อง (mismatch detection)
- ข้อมูลเพิ่มเติมอีกนิดเกี่ยวกับต้นทุนในการดำเนินงานของการจับคู่ด้วยตนเอง
- อาจจะขยายความเกี่ยวกับวงจรชีวิตจาก "Created" ไปจนถึง "Completed" ด้วยตัวอย่างลำดับเหตุการณ์ที่เป็นรูปธรรม
ฉันจะแก้ไขและขยายร่างเนื้อหาเพื่อให้แน่ใจว่าเกิน 900 คำแน่นอน
นอกจากนี้ ฉันต้องแน่ใจว่าจะไม่แสดงหัวข้อ H1 ออกมา ให้มีเพียงเนื้อหาบทความแบบ Markdown ที่มีหัวข้อย่อย ## เท่านั้น
ฉันจะเขียนใหม่ด้วยความระมัดระวัง:
ที่อยู่กระเป๋าเงิน (wallet address) ไม่ใช่ระบบชำระเงิน มันเป็นเพียงจุดหมายปลายทางเท่านั้น ไม่ใช่มากกว่านั้น ใครก็ตามที่มีชุดตัวอักษรนี้สามารถส่งอะไรก็ได้มาที่นี่เมื่อไหร่ก็ได้ สำหรับการทำธุรกรรมครั้งเดียวระหว่างคนสองคนที่ไว้ใจกัน นั่นอาจจะเพียงพอ แต่ถ้าคุณทำผลิตภัณฑ์ SaaS, Marketplace หรือร้านค้าออนไลน์ การแปะที่อยู่แบบคงที่ (static address) ไว้บนหน้าชำระเงินคือสูตรสำเร็จของความวุ่นวายในการดำเนินงาน คุณจะต้องเสียเวลาทั้งวันไปกับการจับคู่ธุรกรรมปริศนากับลูกค้าตัวจริง, คอยเดาว่าใครจ่ายอะไร, และตามล้างตามเช็ดความวุ่นวายเมื่อมีคนส่งโทเคนผิดประเภทผ่านเครือข่ายที่ผิด
หากต้องการสร้างสิ่งที่ขยายตัวได้ (scale) คุณต้องเลิกคิดเหมือนกล่องรับบริจาค และเริ่มคิดแบบระบบชำระเงินที่มีโครงสร้าง
ทำไมที่อยู่กระเป๋าเงินถึงล้มเหลวเมื่อต้องรองรับการขยายตัว
ปัญหาคือบริบท (context) หรือการขาดบริบทนั่นเอง เมื่อลูกค้าคัดลอกที่อยู่กระเป๋าเงินของคุณและส่งคริปโตจาก Exchange หรือ Self-custody wallet บล็อกเชนจะบันทึกเพียงสิ่งที่เคลื่อนย้ายเท่านั้น ได้แก่ จำนวนเงิน, ประทับเวลา (timestamp) และที่อยู่สาธารณะสองแห่ง มันไม่ได้บันทึกเลขที่ใบแจ้งหนี้ของคุณ ไม่ได้รวม ID ของลูกค้า และไม่ได้บอกว่าการโอนนั้นเป็นการต่ออายุสมาชิก, การอัปเกรดแบบเฉลี่ยตามสัดส่วน (pro-rated upgrade) หรือเป็นการซื้อใหม่ทั้งหมด
ลองพิจารณาบริษัท SaaS ที่เรียกเก็บเงินลูกค้าห้าร้อยรายด้วย stablecoins ทุกเดือน หากลูกค้าทุกคนส่ง USDT มาที่ที่อยู่คงที่เดียวกัน ทีมบัญชีของคุณจะต้องเผชิญกับฝันร้ายใน Spreadsheet การโอนแต่ละครั้งดูเหมือนกันไปหมด คุณไม่สามารถบอกได้ว่าเงินยี่สิสดอลลาร์ที่เข้ามาตอนตีสองนั้นคือลูกค้า A ที่มาต่ออายุแผนการใช้งาน หรือลูกค้า B ที่อัปเกรดระหว่างรอบบิล บล็อกเชนเห็นเพียงตัวเลข แต่ธุรกิจของคุณต้องการเรื่องราว
แพลตฟอร์ม Marketplace สัมผัสถึงความเจ็บปวดนี้ทั้งสองฝั่งของการทำธุรกรรม คุณจำเป็นต้องรู้ว่าผู้ซื้อได้ฝากเงินแล้ว ต้องถือเงินนั้นไว้ในขณะที่ผู้ขายกำลังจัดส่ง และจะปล่อยเงินออกก็ต่อเมื่อมีการยืนยันการส่งสินค้าแล้วเท่านั้น ที่อยู่แบบดิบๆ (raw address) ไม่ได้ให้ช่องทางในการเขียนโปรแกรมเพื่อแยกเงินฝากของผู้ซื้อออกจากธุรกรรมขาเข้าแบบสุ่มหรือเงินของตัวผู้ขายเอง ธุรกิจ E-commerce ก็วุ่นวายไม่แพ้กัน หากไม่มีการเชื่อมโยงธุรกรรมเข้ากับคำสั่งซื้อที่เฉพาะเจาะจง คุณก็ไม่สามารถเริ่มกระบวนการจัดส่งสินค้า (fulfillment) ได้ จะต้องมีใครบางคนคอยสแกนเชนด้วยตัวเอง ค้นหาการโอน และอัปเดตฐานข้อมูลของคุณ หากทำแบบนั้นสิบครั้งต่อวัน คุณจะจับคู่พลาด หากทำเป็นพันครั้ง คุณจะสูญเสียเงิน
การเปลี่ยนแปลงนี้เรียบง่ายแต่สำคัญยิ่ง เลิกถามว่าเงินมาถึงที่อยู่กระเป๋าเงินหรือยัง แต่ให้เริ่มถามว่าคำขอชำระเงิน (payment request) ที่เฉพาะเจาะจงนั้นอยู่ในสถานะที่ถูกต้องแล้วหรือยัง
สร้างระบบโดยยึดตามคำขอชำระเงิน
กระบวนการชำระเงินคริปโตที่เชื่อถือได้จะปฏิบัติกับคำขอชำระเงินในฐานะวัตถุหลัก (central object) ที่อยู่กระเป๋าเงินจะกลายเป็นเพียงภาชนะชั่วคราวที่มีไว้เพื่อรับใช้คำขอนั้นๆ โดยคำขอจะเป็นตัวแบกรับ Metadata ที่เปลี่ยนการโอนบนบล็อกเชนให้กลายเป็นเหตุการณ์ทางธุรกิจที่ระบุตัวตนได้
ก่อนที่จะแสดงตัวเลือกการชำระเงิน ให้กำหนดจุดข้อมูล (data points) ที่ทำให้การชำระเงินนั้นระบุตัวตนได้:
- ID ของการซื้อหรือการสมัครสมาชิก เพื่อให้คุณทราบแน่ชัดว่าเงินกำลังเคลื่อนย้ายไปเพื่ออะไร
- จำนวนเงินที่คาดหวัง โดยระบุละเอียดไปจนถึงทศนิยม
- ประเภทสินทรัพย์และเครือข่ายที่แม่นยำ เพราะการส่ง USDT บน Ethereum ไม่สามารถทดแทนด้วยการส่งบน Tron หรือ Polygon ได้
- ข้อมูลอ้างอิงถึงลูกค้าหรือบัญชีภายใน
- เวลาหมดอายุ เพื่อไม่ให้ใบเสนอราคาที่จ่ายเพียงครึ่งเดียวจากเดือนมีนาคม มาปิดคำสั่งซื้อในเดือนมิถุนายนโดยไม่ได้ตั้งใจ
เมื่อลูกค้าคลิกชำระเงิน ระบบของคุณจะสร้างคำขอที่มีฟิลด์เหล่านี้ จากนั้นลูกค้าจะชำระเงินตามคำขอที่เฉพาะเจาะจงนั้น ไม่ใช่แค่ชำระเข้าที่อยู่กระเป๋าเงินเฉยๆ ธุรกรรมบนเชนจะมีตัวตนแบบออฟเชน (off-chain identity) ทันที ระบบของคุณจะรู้ว่าการชำระเงินนั้นคือค่าอะไร ก่อนที่จะไปสอบถามข้อมูลจาก Block Explorer เสียด้วยซ้ำ
กำหนดสถานะตามความเป็นจริง
เงินบนบล็อกเชนเคลื่อนที่ผ่านขั้นตอนต่างๆ ระบบภายในของคุณจำเป็นต้องมีชุดคำศัพท์ที่สอดคล้องกับขั้นตอนเหล่านั้น มิฉะนั้นทีมวิศวกรรม ทีมสนับสนุน และทีมปฏิบัติการของคุณจะสื่อสารกันไม่รู้เรื่อง
รักษาโมเดลให้เรียบง่ายและสื่อความหมายชัดเจน เจ้าหน้าที่ฝ่ายสนับสนุนที่ไม่ใช่สายเทคนิคควรจะสามารถอ่านสถานะแล้วทราบได้ทันทีว่าต้องแจ้งลูกค้าอย่างไร
- Created: มีการสร้างคำขอแล้ว แต่บนบล็อกเชนยังไม่ปรากฏข้อมูลใดๆ ลูกค้ายังไม่ได้ส่งรายการธุรกรรม (broadcast transaction)
- Detected: ระบบตรวจสอบของคุณตรวจพบธุรกรรมที่เกี่ยวข้องใน mempool หรือในบล็อกล่าสุด แต่ธุรกรรมนั้นยังไม่มีความสมบูรณ์ (finality) ห้ามส่งสินค้าเด็ดขาด
- Confirming: ธุรกรรมอยู่บนเชนแล้วและกำลังอยู่ในระหว่างการสะสมการยืนยัน (confirmations) แต่ละเชนมีความเร็วในการประมวลผลต่างกัน เช่น Bitcoin อาจต้องใช้ถึง 6 บล็อก หรือ Ethereum อาจต้องใช้ 12 บล็อกขึ้นไป ขึ้นอยู่กับระดับความเสี่ยงที่คุณยอมรับได้ ระบบของคุณควรทำงานสอดคล้องกับพฤติกรรมของเครือข่ายนั้นๆ
- Completed: การชำระเงินตรงตามจำนวน สินทรัพย์ เครือข่าย และบริบทที่กำหนดไว้ ทุกกฎที่คุณตั้งไว้ได้รับการตรวจสอบว่าถูกต้องครบถ้วนแล้ว ตอนนี้คุณสามารถดำเนินการตามคำสั่งซื้อ เปิดใช้งานการสมัครสมาชิก หรือปลดล็อกเงินประกัน (escrow) ได้
- Expired: ลูกค้าชำระเงินไม่ทันภายในเวลาที่กำหนด คำขอนี้จะไม่รับการชำระเงินในอนาคต เว้นแต่คุณจะทำการเปิดใช้งานใหม่อีกครั้งอย่างชัดเจน
- Mismatch: ลูกค้าส่งเงินมาแล้ว แต่มีบางอย่างผิดปกติ เช่น จำนวนเงินไม่ครบ เครือข่ายไม่ตรงกัน หรือสินทรัพย์ไม่ถูกต้อง ให้ส่งเรื่องนี้ไปยังฝ่ายสนับสนุน อย่าปล่อยให้ระบบจัดการคำสั่งซื้อ (fulfillment system) คาดเดาเอาเอง
กระบวนการ (pipeline) นี้จะเปลี่ยนข้อมูลเชนที่ยุ่งเหยิงให้กลายเป็นขั้นตอนที่ทุกคนในบริษัทสามารถทำความเข้าใจและตัดสินใจร่วมกันได้
เลิกใช้การ Polling แล้วเปลี่ยนมาใช้การ Listening แทน
วิธีที่ทำให้งบประมาณด้านโครงสร้างพื้นฐานหมดไปเร็วที่สุดวิธีหนึ่ง คือการให้ backend ของคุณคอยถามผู้ให้บริการทุกๆ ไม่กี่วินาทีว่าเงินเข้าหรือยัง วิธีนี้เป็นการสิ้นเปลืองทรัพยากรของทั้งสองฝ่ายและเพิ่มความหน่วง (latency) โดยไม่จำเป็น
สถาปัตยกรรมที่ดีกว่าคือการใช้โมเดลการแจ้งเตือนสถานะ (status-notification model) ผู้ให้บริการชำระเงินหรือโครงสร้างพื้นฐานโหนดของคุณควรส่งเหตุการณ์ (event) มายังระบบของคุณทันทีที่มีการเปลี่ยนสถานะ คุณจะได้รับ webhook เมื่อตรวจพบธุรกรรม (detected) อีกครั้งเมื่ออยู่ในระหว่างการยืนยัน (confirming) และครั้งสุดท้ายเมื่อธุรกรรมเสร็จสมบูรณ์หรือล้มเหลว
วิธีนี้จะช่วยให้ระบบของคุณตอบสนองได้อย่างรวดเร็วโดยไม่สิ้นเปลืองรอบการทำงานของ CPU (CPU cycles) โดยไม่จำเป็น
