> For the complete documentation index, see [llms.txt](https://www.saladpuk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.saladpuk.com/cloud/blockchain/consensus-algorithm.md).

# Consensus Algorithm คืออะไร ?

## 😢 ปัญหา

จากบทความตอนที่แล้วเราก็จะทราบว่า การเก็บข้อมูลของ Blockchain มันไม่ได้เก็บข้อมูลไว้ที่เซิฟเวอร์เดียว แต่มันกระจายข้อมูลออกไปเก็บไว้กับเซิฟเวอร์นับแสนๆตัวทั่วทั้งโลก ดังนั้นถ้ามีการอัพเดทกันเกิดขึ้นมันก็จะต้องอัพเดทข้อมูลให้กับเซิฟเวอร์นับแสนๆตัวทั่วทั้งโลกด้วยนั่นเอง

จากที่ว่ามาปัญหาของมันจะเริ่มเกิดขึ้นก็เพราะ จริงๆ**เซิฟเวอร์ที่อยู่ในระบบมันทำงานแยกของใครของมันเลย** ดังนั้นเซิฟเวอร์แต่ละตัวก็จะมีข้อมูลที่ไม่เหมือนกันอยู่เต็มไปหมด และเซิฟเวอร์เหล่านั้นจะต้องแข่งกันแก้โจทย์เพื่อหา**คนที่แก้โจทย์ได้เร็วที่สุดถึงจะมีสิทธิ์เอาข้อมูลของตัวเองไปอัพเดทให้คนอื่น**นั่นเอง ดังนั้นมันก็มีโอกาสที่จะมีเซิฟเวอร์ที่แก้โจทย์ได้เสร็จในเวลาที่พร้อมกันเกิดขึ้นนั่นเอง แล้วเซิฟเวอร์ในระบบจะเชื่อแหล่งข้อมูลจากไหนดี? ดังนั้นในบทความนี้เราจะมีดูวิธีการรับมือกับข้อขัดแย้งนี้ของ Blockchain กันครับ

> **ตัวอย่าง**\
> ถ้ามีคนซื้อของผ่านเซิฟเวอร์ A ก็จะมีแค่เซิฟเวอร์ A เท่านั้นที่รับรู้และมันจะบันทึกการซื้อของนั้นลงไป โดยที่เซิฟเวอร์อื่นๆที่เหลือจะไม่รู้ว่ามีการซื้อของเกิดขึ้น จนกว่าเซิฟเวอร์ A จะทำการสร้าง Block ได้ก่อนเซิฟเวอร์อื่นๆ มันถึงจะค่อยส่งข้อมูลอัพเดทล่าสุดให้กับเซิฟเวอร์อื่นๆเอาไปใช้ต่อ ซึ่งจากที่ว่ามา มันไม่ได้มีแค่เซิฟเวอร์ A ตัวเดียวที่พยายามจะสร้าง Block แต่เซิฟเวอร์ A ต้องแข่งกับเซิฟเวอร์อีกนับแสนๆตัวต่างหาก ดังนั้นมันก็มีโอกาสที่จะมีเซิฟเวอร์อื่นที่สร้าง Block เสร็จในเวลาที่พร้อมกันเกิดขึ้นได้นั่นเอง

{% hint style="success" %}
**แนะนำให้อ่าน**\
บทความนี้เป็นหนึ่งในซีรี่ **Blockchain** ดังนั้นถ้าเพื่อนสนใจบทความทั้งหมดตั้งแต่เริ่มต้นว่า Blockchain คืออะไร แล้วจะเริ่มต้นสร้าง Blockchain เป็นของตัวเองได้ยังไง เพื่อนสามารถกดไปอ่านได้จากลิงค์นี้ครับ [👶 Blockchain](https://saladpuk.gitbook.io/learn/cloud/blockchain) และเราก็มีบทความเรื่องอื่นๆที่น่าสนใจซึ่งสามารถกดดูได้จาก Side menu เบย
{% endhint %}

## 😄 วิธีแก้ปัญหา

Blockchain แก้ข้อขัดแย้งนี้โดยใช้สิ่งที่เรียกว่า **Consensus Algorithm** โดยมีหลักการง่ายๆว่า **ข้อมูลที่อัพเดทจากฝั่งไหนยาวสุดให้ใช้ตัวนั้น** ฟังดูแล้วอาจจะ งงๆ ดังนั้นจะขอยกตัวอย่างให้เข้าใจได้ง่ายขึ้นคือ สมมุติว่าในตอนนี้เซิฟเวอร์ทุกตัวในระบบมีข้อมูลตรงกันหมด โดย Block ตัวล่าสุดคือสีน้ำเงินตามรูป

![](/files/-Lql-kGn7S9QCACBFFhY)

แล้วพอถึงช่วงเวลานึงก็มีเซิฟเวอร์ 2 ตัวที่แก้สมการขึ้นมาได้เสร็จพร้อมกัน (สมมุติว่าเซิฟเวอร์ A กับ B ละกัน) ดังนั้นมันเลยกระจายข้อมูลของตัวมันเองให้เซิฟเวอร์อื่นๆค่อยๆอัพเดทไปเรื่อยๆ ดังนั้นในตอนนี้ในระบบก็จะถูกแบ่งออกเป็น 3 กลุ่มคือ

1. **กลุ่มสีแดง** - ที่ใช้ข้อมูลอัพเดทจากเซิฟเวอร์ A&#x20;
2. **กลุ่มสีเขียว** - ที่ใช้ข้อมูลอัพเดทจากเซิฟเวอร์ B
3. **กลุ่มสีน้ำเงิน** - ยังไม่ถูกใครอัพเดท

คำถามคือแล้วสุดท้ายเซิฟเวอร์ทั้งหมดในระบบ จะต้องใช้อัพเดทจากกลุ่มไหนกันแน่นะ ตามรูปด้านล่างเลย

![](/files/-Lu5XuvykTd1Oh4WWtXW)

คำตอบคือถ้าเกิดกรณีแบบนี้เกิดขึ้นเซิฟเวอร์ในแต่ละกลุ่มก็จะใช้ **Consensus Algorithm** เข้ามาเลือกว่าจะใช้อัพเดทจากตัวไหน โดยมันจะเอาข้อมูลที่อัพเดททั้ง 2 แหล่งมาเทียบกัน แล้วดูว่าข้อมูลอัพเดทจากแหล่งไหนที่มันต่อ Block ได้ยาวที่สุด มันก็จะเลือกใช้การอัพเดทจากเซิฟเวอร์ฝั่งที่ยาวที่สุดนั่นเอง ตามรูปด้านล่างเลย

![](/files/-Lu0nB0mzLVSh_jlNOyo)

> **อธิบายรูป**\
> สมมุติว่ามีการอัพเดทเข้ามา 2 แหล่งที่ไม่เหมือนกันเช่น ด้านบนที่เป็นกลุ่มสีเขียว กับ ด้านล่างที่เป็นกลุ่มสีส้ม ระบบจะทำการเอาการอัพเดททั้ง 2 มาเทียบกันแล้วเลือกตัวที่มี Block ยาวที่สุด ซึ่งในตัวอย่างนั้นกลุ่มสีส้มมันยาวที่สุด ดังนั้นระบบก็จะเลือกใช้การอัพเดทจากกลุ่มสีส้มนั่นเอง

กลับมาที่ตัวอย่างของเรากันต่อ สมมุติว่าข้อมูลจาก**กลุ่มสีแดง**และ**กลุ่มสีเขียว**มันมีจำนวน Block ที่เท่ากันขึ้นมา เซิฟเวอร์ก็จะเลือกใช้ตัวใดตัวนึงไปก่อน ตามรูปด้านล่างจะเห็นว่ากลุ่มสีแดงและสีเขียวมี Block ต่อขึ้นมาจากสีน้ำเงินแค่ 1 ตัวเท่ากัน ดังนั้นเซิฟเวอร์ทั้งหมดในระบบก็จะถูกอัพเดทเป็นตัวไหนก็ได้แต่จะไม่เหลือสีน้ำเงินในระบบแล้ว เพราะมันเป็นข้อมูลที่เก่าไปละ

![](/files/-Ln6AMQ555dXJxBR2iwJ)

แล้วในระบบก็จะมีข้อมูลแบ่งเป็น 2 กลุ่มแบบนี้ไปซักระยะนึง จนกว่าจะถึงเวลาที่มีเซิฟเวอร์จากฝั่งใดฝั่งหนึ่งแก้สมการถัดไปได้ก่อนเพื่อน แล้วเซิฟเวอร์ตัวนั้นก็จะอัพเดทเซิฟเวอร์ตัวอื่นๆว่ามีข้อมูลใหม่มาแล้วนะ ซึ่งในรูป**กลุ่มสีชมพู**สามารถแก้สมการได้ก่อน ซึ่งกลุ่มสีชมพูนั้นเป็นกลุ่มที่ถูกต่อยอดมาจากกลุ่มสีเขียว ดังนั้นถ้าดูจาก Consensus Algorithm แล้วสุดท้ายข้อมูลในระบบทั้งหมดก็จะกลายเป็นกลุ่มสีชมพูไปในที่สุด เพราะมันมี Block ที่ยาวที่สุดยังไงล่ะ

![](/files/-LpTyLjYPVehQW0d0Vmo)

## 🤔 จะเกิดอะไรขึ้นกับกลุ่มที่มี Block สั้นๆ

ตอบง่ายๆเลยว่า **มันก็จะถูกลืมไปในที่สุด** เหมือนกับไม่เคยมีอะไรเกิดขึ้นมาก่อน เพราะไม่มีเซิฟเวอร์ตัวไหนอยากใช้ข้อมูลที่มีอัพเดทต่ำกว่ายังไงล่ะ ดังนั้นการดำเนินการต่างๆของกลุ่มนั้นจะถือว่ามันไม่เคยเกิดขึ้นมาก่อนในระบบนั่นเอง เช่น Alex โอนเงินค่าซื้อของให้ Katie จำนวน $500 ไป ก็จะถือเป็นโมฆะไป และในระบบก็จะไม่มีข้อมูลการโอนเงินนั้นเกิดขึ้นอีกด้วย

จากที่ว่ามาก็จะเป็นปัญหากับ Katie เพราะ Katie ไม่ได้รับเงิน แต่ Alex ได้รับของไปแล้ว และก็จะเป็นปัญหากับเซิฟเวอร์เพราะก็จะไม่มีคนเชื่อถือเซิฟเวอร์นั้นๆอีกต่อไปเพราะดำเนินการไปแล้วอยู่ๆก็บอกว่าไม่ได้ทำนั่นเอง ดังนั้นเซิฟเวอร์ที่ถูกลืมพวกนี้ก็จะต้องรีบอัพเดทข้อมูลเป็นตัวล่าสุดตามเพื่อนๆ แล้วรีบเอาข้อมูลที่เคยถูกลืมไปกลับไปสร้างเป็น Block ไปต่อใน Chain ให้ได้อีกครั้งนั่นเอง

{% hint style="success" %}
**Confirmation time & Confirmed blocks**\
จากที่บอกไปว่ามันมีโอกาสที่การดำเนินการนั้นจะถูกเลือนหายไปเหมือนกับว่ามันไม่เคยเกิดขึ้นมาก่อน ดังนั้นตอนที่ใช้ระบบ Blockchain มันจะมีสิ่งที่เรียกว่า Confirmation time หรือพูดง่ายๆคือหลังจากดำเนินการไปเราจะต้องรอให้ผ่านเวลา x ไปก่อน เช่น 30 นาที หรือ 1 วัน บลาๆแล้วแต่ที่ตกลงกัน เพื่อเป็นการยืนยันว่าการดำเนินการนั้นจะไม่ถูกลบเลือนไปนั่นเอง หรือในบางทีเราก็จะใช้จำนวน Block ที่ถูกสร้างต่อจากการดำเนินการนั้นๆไปจำนวนกี่ตัวถึงจะถือว่าการดำเนินการนั้นน่าจะใช้งานได้นั่นเอง
{% endhint %}

## 🤔 การทำงานจริงๆของ Blockchain เป็นยังไง

ในการทำงานจริงๆของ Blockchain นั้นมันแล้วแต่ว่าคนที่เอา blockchain ไปใช้เขามีการปรับแก้อะไรลงไปบ้าง ดังนั้นผมจะขอยกตัวอย่างการทำงานของ Bitcoin แทนละกันว่าโดยรวมระบบของมันทำงานกันยังไงตั้งแต่เริ่มต้นเลย

ขั้นตอนการทำงานทั้งหมดของ Bitcoin จะเริ่มขึ้นเมื่อมีการสร้าง transaction เกิดขึ้นระบบก็จะรวม transaction ต่างๆเอาไว้ โดยเฉลี่ยของ Blockchain จะทำการอัพเดทกันเสร็จราวๆ 10 นาที โดยที่**คนขุดเหมือง**หรือ **Minders** ก็จะทำการสร้าง Block ขึ้นมาแล้วทำการแก้สมการให้เสร็จก่อนเซิฟเวอร์อื่นๆ

![](/files/-M-w55OmmuV7E8GqUZqa)

เมื่อ**คนขุดเหมือง**หรือ **Minders** ก็จะทำการแก้สมการได้เสร็จหรือเราเรียกว่า **Proof of work** ได้ ระบบก็จะทำการแจ้งไปยังเซิฟเวอร์อื่นๆ หรือเราเรียกพวกนั้นว่าคนขุดเหมือนอื่นๆ Minders อื่นๆ ก็ได้ โดยพวกเซิฟเวอร์เหล่านั้นก็จะทำการตรวจสอบว่าเราแก้สมการได้ถูกต้องจริงๆหรือเปล่า ซึ่งถ้าถูกต้อง เซิฟเวอร์อื่นๆก็จะทำการใช้ข้อมูลที่เราแก้ได้ไปใช้เป็นตัวล่าสุดเลยนั่นเอง

![](/files/-LpwFc1UL2Blz5SMecqn)

สุดท้ายระบบก็จะกลับมาเริ่มวงจรเดิมอีกครั้ง ทำให้เราได้แผนภาพการทำงานทั้งหมดเป็นตามรูปข้างล่างนี้เลย

![](/files/-Lnln37WDuwMWKRnmNiD)

## 🎯 บทสรุป

จากที่ว่ามาจะเห็นว่า Blockchain นั้นมีกลไกในการปรับตัวเพื่อเอาข้อมูลที่อัพเดทเป็นตัวใหม่ที่สุดเข้าไปเสมอ โดยเซิฟเวอร์ฝั่งที่มีข้อมูลเป็นข้อมูลเก่าก็จะต้องรีบสลัดข้อมูลเก่าทิ้งไปแล้วรีบอัพเดทกลับมาให้เท่ากับเพื่อนๆ เพื่อที่จะได้ทำงานกับเพื่อนต่อได้นั่นเอง
