ผมอธิบายใหม่ในประเด็นที่คุณสงสัยนะครับ
เนื่องจากเป็นระบบปิด เงินทุกยอดรวมกันต้องได้ ตัวเลขคงที่เสมอ ดังนั้นจึงมีบัญชีระบบอยู่ด้วยคือ
SYSTEM = 1,000,000 ล้านเป็นต้น
เริ่มแรกถ้าใครฝากเงิน Admin จะต้องโอนเงินจากระบบเข้า A เช่น A ฝาก 1000
B ฝาก 2000 ก็จะได้
SYSTEM -> A 1,000
SYSTEM -> B 2,000
เกิดรายการ
1. SYSTEM -1000
2 A +1000
3 SYSTEM -2000
4 B +2000
หาก A ถอนเงิน 500 ก็จะเกิด
A -> SYSTEM 500
เกิดรายการ
1. A - 500
2 SYSTEM + 500
แต่ละ User คือ A,B... System ก็จะมี Balance เกาะติดอยู่ด้วย จำนวน 2 balance คือ Balance ปัจจุบันตอนนี้ กับ Balance ล่าสุดจากเที่ยงคืนเมื่อวาน
ดังนั้นรวมทุก Balance ก็จะเป็น 1,000,000 เท่าเดิม
คราวนี้ถึงจุดหนึ่งในเวลาผ่านไป
สมมุติมีรายการเข้ามาติดๆ กัน 5 รายการ ตัวอย่างง่ายๆนะครับ
1 A -> B 20
2 C -> D 10
3 B -> C 10
4 B -> A 10
5 A -> D 10
จะเกิด transaction ที่ต้องใส่ DB ที่ชื่อว่า transaction โดยจะต้องใส่ Hash จับคู่ฝั่งโอนเข้า โอนออกในแต่ละรายการ
หนึ่งรายการ (2 row) จะต้องมี hash เดียวกันไม่ซ้ำกับอย่างอื่น โดยการเอา DB ID ของคนโอนออกมาใช้ในการ hash
1 A - 20
2 B + 20
3 C - 10
4 D -10
5 B -10
6 C +10
7 B -10
8 A +10
9 A -10
10 D + 10
การเกิดแต่ละ transaction ก็จะมีการหักลบ Balance ปัจจุบันไปเรื่อยๆ เพื่อจะได้แสดงยอดเงินได้อย่างรวดเร็ว
แต่ละคนเองจะเห็นรายการที่เกิดขึ้นในฝั่งตัวเองเท่านั้น ดังนั้นใน table transaction จะมีว่า จำนวนเงิน สถานะโอนเข้าหรือออก หรือจะใส่สองคอลัมน์ เข้า 0 ออก 10 ถ้าโอนออก หรือ เข้า 10 ออก 0 ถ้าโอนเข้า แล้วแต่สะดวก
เวลาเราแสดงยอดเงินให้กับ ลูกค้าก็เอาผลการคำนวนสุดท้ายหรือ Balance สุดท้ายมาแสดง
พอถึงสิ้นวัน เริ่มตรวจสอบระบบใหม่ ว่ายอดเงินทุกคนรวมกัน รวมกับ SYSTEM เท่าเดิมหรือไม่
ถ้าเท่าก็รอดตัว แต่ถ้าไม่เท่ากัน เราจะเห็นว่ารายการไหนมันเพิ่มเข้ามาผิดปกติ
พวกรายการเดียว ข้ามไป
พวกหลายรายการ ตรวจสอบว่า Hash transaction ID ซ้ำกันหรือไม่
ถ้าซ้ำรายการไหน ก็มาทำ algorithm ปรับค่าแสดงผลให้ admin ทราบอีกที แล้วก็ปรับค่า Balance ใหม่
ตอนนี้ Balance เมื่อวาน ก็จะเท่ากับวันนี้แล้ว
ประมาณนี้นะครับ
เพราะถ้าไม่ทำแบบนี้ จะไม่มีวันรู้ว่าใครแอบเติมเงินเข้าฐานข้อมูลบ้าง
-----
การ encrypt ยอดเงินในฐานข้อมูลเก็บทั้งตัวเลข และ hash
การ hash เอาทั้ง user id + ยอดเงิน + เกลือ แล้วเก็บในฐานข้อมูลใน transaction นั้นๆ
เมื่อไหร่ที่ยอดเงินถูกแก้ hash ไม่ตรง ก็ห้ามโอน ให้แจ้งเตือน
นั่นแสดงว่า ทุกครั้งก่อนโอนตร้องตรวจ hash ก่อน
รับเงินมาแล้ว สร้าง hash ใหม่ทุกครั้งไป
พบว่า ใน host บางที แฮกเกอร์เข้ามาเปลียนข้อมูลใน DB เฉยเลยครับ
โหขอบคุณจริงๆครับ พอเห็นภาพระดับนึงครับ ตอนแรกก็งงๆอ่านไปสามสี่รอบ ก็คือเราต้องมี SYSTEM ไว้สำหรับคอยตรวจเช็คเงิน หากวันดีคืนดีมีแฮกเกอร์แอบย่องเข้ามาเติมตัวเลขเข้าไปยอดมันจะเกิน ตามที่ตั้งไว้
- ถ้าอย่างงี้แสดงว่าถ้าคิดว่าอนาคตผู้ใช้บริการจะเยอะขึ้น ควรตั้ง SYSTEM ให้มียอดสูงๆไว้
- ถ้ากรณีที่มีผู้ใช้มากจริงๆแล้วทะลุ SYSTEM มันจะปรับอย่างไรในอนาคตครับเพื่อไม่ให้กระทบกับ SYSTEM ที่เคยตั้งไว้ตอนแรก หรือเพิ่มได้เลย
---------------------------------------
ผมสงสัยว่า
พวกรายการเดียว ข้ามไป
พวกหลายรายการ ตรวจสอบว่า Hash transaction ID ซ้ำกันหรือไม่
ถ้าซ้ำรายการไหน ก็มาทำ algorithm ปรับค่าแสดงผลให้ admin ทราบอีกที แล้วก็ปรับค่า Balance ใหม่
ตอนนี้ Balance เมื่อวาน ก็จะเท่ากับวันนี้แล้ว
อันนี้มันจะซ้ำอย่างไรหรอครับ ในเมื่อเราต้องเก็บ Hash transaction ID ไว้กรณีผู้โอนและผู้รับต้องระบุ Hash transaction ID ของผู้โอนไว้ ทั้งสองที่ อย่างงี้มันจะซ้ำกันนิครับหรือผมเข้าใจผิด คือที่ผมเข้าใจก็คือ เอาไว้เช็คว่ามีเงินเกินมั้ยถ้ามีก็หาว่าใครที่ผิดปกติ แล้วให้ระบบทำการปรับให้ตรง
---------------------------------------
อันนี้เป็นภาพที่ผมสรุปจากที่ท่านแนะนำมานะครับ หากผมเข้าใจผิดส่วนใดฝากแนะนำด้วยนะครับ โดยเฉพาะส่วนของ hash ที่ท่านบอกนั้น ที่เอาผู้โอนมาใส่ของทั้งรับและส่ง ให้เหมือนกัน ส่วนคนที่ฝากหรอถอนปกติไม่ได้โอนให้ใคร จำเป็นต้องใส่ Hash transaction ID ไหมครับ
---------------------------------------
อีกคำถามครับ เคยพบว่าในส่วนของ transaction โดนแก้ไขไหมครับ ถ้าโดนแก้ทั้งสองที่มีโอกาสแค่ไหน แล้วท่านรับมืออย่างไร
ผมต้องขอขอบคุณสำหรับคำแนะนำอีกรอบนะครับ และผมต้องขออภัยที่ต้องถามเยอะๆจนบางครั้งอาจจะดูเยอะเกินไป แต่เพื่อให้เคลียที่สุดในฐานะผู้พัฒนาก็เลยคิดว่าถามให้เคลียไปเลย จะได้ไม่ค้างคา แล้วพัฒนากับต่อยอดได้ไม่ติดขัด