Saladpuk.com
🏆 เนื้อหาหลัก
🏆 เนื้อหาหลัก
  • 💖สลัดผัก
  • 📰มีอะไรใหม่บ้าง
    • 2020
      • 2020-11
      • 2020-10
      • 2020-09
      • 2020-08
      • 2020-03
      • 2020-02
      • 2020-01
    • 2019
      • 2019-12
      • 2019-11
      • 2019-10
      • 2019-09
      • 2019-08
  • 🤔อ่านเรื่องไรดี ?
  • มือใหม่หัดเขียนโค้ด
    • 👶เขียนโค้ดด้วยภาษา C#
      • เกิดมาไม่เคยเขียนโค้ดมาก่อนเบย
      • 👶พื้นฐาน
        • 1.โปรแกรมที่ต้องลง
        • 2.โครงสร้างของโค้ด
        • 3.ชนิดของข้อมูล
        • 4.การสร้างตัวแปร
        • 5.คำสั่งพื้นฐาน
        • 6.การแปลงข้อมูล
        • 7.การเปรียบเทียบค่า
        • 8.การตัดสินใจด้วย IF statements
        • 9.การตัดสินใจด้วย Switch statements
        • 10.การทำงานซ้ำๆด้วย While
        • 11.การทำงานซ้ำๆด้วย Do While
        • 12.การทำงานซ้ำๆด้วย For
        • 13.การแก้โจทย์จากรูป
        • 14.มารู้จักกับ Array กัน
      • 🧑ระดับกลาง
        • 15.Value type vs Reference type
        • 16.ลดงานซ้ำๆด้วย Method
        • 17.มารู้จักกับ Class & Field กัน
        • 18.มารู้จักกับ Constructor กันบ้าง
        • 19.มาเขียน Method ใน Class กัน
        • 20.มารู้จักกับ Property กัน
        • 21.ลองใช้คลาสแบบจริงจังบ้าง
        • 22.การสืบทอด Inheritance
        • 23.Polymorphism
        • 24.Abstract Class
        • 25.Interface
        • 26.Namespace
        • 27.Enum
        • 28.Exception handler
        • 29.ลงลึกกับ string
        • 30.StringBuilder เพื่อนคู่ string
      • 👨⏳ระดับสูง
        • Generic
        • Delegates
        • Action & Func
        • Lambda expression
        • LINQ
        • พระคัมภีร์การใช้คำสั่ง LINQ
      • 💡Tips
        • 💡C# version 8.0
        • 💡Boxing & Unboxing
    • 👶Algorithm
      • 👾Algorithm Big-O
      • 👽Algorithm P & NP
    • 👦OOP
      • 💖Abstraction
      • 💖Encapsulation
      • 🏆Abstraction & Encapsulation
      • 💖Inheritance
      • 💖Polymorphism
      • 🏆Inheritance & Polymorphism
      • 📝ลองเขียน OOP ดูดิ๊
      • 👑OOP + Power of Design
      • 🥰เทคนิคในการออกแบบ
    • 👶บทสรุปฐานข้อมูล
      • เก็บรูปในฐานข้อมูล
      • Database indexing
      • การลบข้อมูล
    • 👦Communication Patterns
    • 👦Design Patterns
      • 🤰Creational Patterns
        • 🏭Factory Method
        • 🏭Abstract Factory
        • ☝️ Singleton Pattern
        • 🏗️ Builder Pattern
        • 🎎Prototype Pattern
      • 🧱Structural Patterns
        • 🔌Adapter Pattern
        • 📪Proxy Pattern
  • Puzzle
    • 🧠Challenges
      • 🐴Google ม้า 25 ตัว
      • 🌉Amazon เสา 2 ต้น
      • 🥇ทองเก๊
      • 💊ยาต้านโควิด
      • 🎩CP หมวก 5 ใบ
      • 🧓Einstein's Riddle 01
  • พื้นฐานที่ควรต้องรู้
    • 🐳Docker
      • 📦Docker Containers
      • 🃏Docker Exercise 01
      • 🛠️ Docker Tools
      • 🗃️ Docker Registry
      • 🖼️ Container Image
      • 📢Docker Push
      • 🔄WSL
    • 👶Clean Code
      • 🧓Uncle Bob - Clean Code
      • 🧓Uncle Bob - Comments
      • 🧓Uncle Bob - Naming
      • 🧓Uncle Bob - Mindset
      • 🧓Uncle Bob - TDD
    • 👶Code Smells
    • 👶สิ่งที่คนเขียนโค้ดมักเข้าใจผิด
    • 👶AI พื้นฐาน
    • 👶Git พื้นฐาน
      • Git branching strategy
    • 👶Cloud พื้นฐาน
    • 👶UML พื้นฐาน
      • Activity Diagram
      • Class Diagram
      • Sequence Diagram
      • Use case Diagram
      • บทสรุปการใช้ UML
    • 👶Data Scientist
      • การเลือก Algorithms ให้ AI (1/5)
      • การเตรียมข้อมูลให้ AI (2/5)
      • หลักการตั้งคำถามให้ AI (3/5)
      • แฉความลับของ AI Model (4/5)
      • หัดเขียน AI จาก AI ของคนอื่น (5/5)
    • 👶DevOps พื้นฐาน
    • 👶Docker ขั้นพื้นฐาน
      • Image and Container
      • แชร์ Docker Image ที่สร้างไว้
    • 👶Microservices พื้นฐาน
      • Microservices ที่ดีมีลักษณะยังไง
      • Microservices Tips
      • จาก Monolith สู่ Microservices
    • 👶ความรู้พื้นฐานในการทำเว็บ
    • 👦Bottlenecks of Software
      • หัวใจที่สำคัญที่สุดของฐานข้อมูล
    • 👦Agile Methodology
      • Agile in a Nutshell
      • Software Development Life Cycle
      • Code Review
    • 👦Security พื้นฐาน
      • การเก็บรหัสผ่านที่ถูกต้อง
      • Security in actions
        • Hash function
      • Security Principles
      • 😎The Matrix 1
      • 😎The Matrix 2
      • HTTPS in a nutshell
    • 👦SOLID Design Principles
      • มารู้จักกับ SOLID กันดีกว่า
      • Single-Responsibility Principle
      • Open/Closed Principle
      • Liskov Substitution Principle
      • Interface Segregation Principle
      • Dependency-Inversion Principle
  • Cloud Computing
    • 👶Microsoft Azure 101
      • สมัคร Microsoft Azure
      • รู้จักกับ Resource Groups
      • สร้างเว็บตัวแรกกัน
      • สร้าง Virtual Machine กัน
      • ประเภทของคลาว์เซอร์วิส
      • มาสร้าง Logic App กัน
      • มาสร้าง Function App กัน
      • คลาว์คิดเงินยังไง ?
      • Cloud Native
      • Guideline for Cloud scaling
      • Auto Scaling
    • 👶Azure App Services
    • 👶App Service Plan
    • 👶Azure Storage
      • Blob storage
        • ลองสร้างที่เก็บไฟล์กันเลย
        • เข้าใจ Blob storage ให้มากขึ้น
        • ลองเขียนโค้ดอัพโหลดไฟล์กันบ้าง
        • สร้างเว็บจากที่ฝากไฟล์บนคลาว์
    • 👶Azure Bot Service
      • Bot เข้าใจเราได้ยังไงกันนะ
    • 👶Azure Cognitive Services
      • การสร้าง Cognitive Services
      • การ Login ด้วยใบหน้า
      • อ่านลายมือจากรูปเป็นตัวอักษร (OCR)
      • เขียน AI แยกของต่างๆทำยังไง?
      • เขียนแอพ ทายอายุ บอกเพศ ง่ายจิ๊ดเดียว
      • เขียนแอพให้ AI อธิบายรูปเป็นภาษาคน
    • 👶Machine Learning Studio
      • มาสร้าง AI ของแท้ตัวแรกของเรากัน
      • สร้าง AI ตัดสินใจอนุมัติบัตรเครดิต 💳
      • ลองเรียกใช้ AI ของเรากัน
    • 👶Azure Service Fabric
      • สร้าง Service Fabric กัน
    • 👶Blockchain
      • Blockchain ทำงานยังไง ?
      • Consensus Algorithm คืออะไร ?
      • สร้าง Blockchain ใช้เองกัน !
      • หัดเขียน Smart Contract กัน
    • 👶Power BI
    • 👶Azure Web App
      • เซิฟเวอร์บนคลาว์ ราคา? ต่าง?
    • 👶Azure DevOps
      • เล่น Azure DevOps กัน
      • เล่นกับ Repository
      • ลองทำ Continuous Integration (CI)
      • ลองทำ Continuous Delivery (CD)
      • เล่น Kanban Board
    • 🤠Cloud Playground
      • การป้องกันความลับหลุดตอนที่ 1
      • การป้องกันความลับหลุดตอนที่ 2
      • การป้องกันความลับหลุดตอนที่ 3
      • การป้องกันความลับหลุดตอนจบ
  • Software Testing
    • 👦Test-First Design
    • 👦Test-Driven Development
      • 1.มารู้จักกับ TDD กันดีกว่า
      • 2.Test cases เขาเขียนกันยังไงนะ
      • 3.เครื่องมือในการทดสอบ
      • 4.การใช้ Theory และ InlineData
      • 5.โค้ดที่ทดสอบได้
      • 6.Mantra of TDD
      • 7.Functional & None-Functional testing
      • 8.Manual vs Automation testing
      • 9.Automation Frameworks in .NET
      • 10.Mock Framework
      • 11.มาเรียนการใช้ Moq กันเถอะ
      • 12.สรุป
  • Web
    • 👦Web API
      • 1.Web API คืออะไร
      • 2.ติดตั้ง .NET Core SDK
      • 3.สร้าง Web API ตัวแรกกัน
      • 4.Verbs
      • 5.Swagger เพื่อคู่ API
      • 6.การใช้ Model
      • 7.เรียก Web API ผ่าน Postman
      • 8.มาจัดกลุ่ม API กัน (1/2)
      • 9.มาจัดกลุ่ม API กัน (2/2)
  • Software Design
    • 🤴Design Patterns
      • 🦈Creational patterns
        • Abstract Factory
        • Builder
        • Factory Method
        • Prototype
        • Singleton
      • 🦈Structural patterns
        • Adapter
        • Bridge
        • Decorator
        • Facade
        • Proxy
      • 🦈Behavioral patterns
        • Chain of Responsibility
        • Command
        • Iterator
        • Mediator
        • Memento
        • Observer
        • State
        • Strategy
        • Template Method
        • Visitor
Powered by GitBook
On this page
  • 😢 ปัญหา
  • 😄 วิธีแก้ปัญหา
  • 🤔 จะเกิดอะไรขึ้นกับกลุ่มที่มี Block สั้นๆ
  • 🤔 การทำงานจริงๆของ Blockchain เป็นยังไง
  • 🎯 บทสรุป

Was this helpful?

Export as PDF
  1. Cloud Computing
  2. Blockchain

Consensus Algorithm คืออะไร ?

🤔 เวลาที่ Blockchain เกิดข้อขัดแย้งมันหาข้อสรุปยังไงมาดูกัน

PreviousBlockchain ทำงานยังไง ?Nextสร้าง Blockchain ใช้เองกัน !

Last updated 5 years ago

Was this helpful?

😢 ปัญหา

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

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

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

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

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

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

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

  1. กลุ่มสีแดง - ที่ใช้ข้อมูลอัพเดทจากเซิฟเวอร์ A

  2. กลุ่มสีเขียว - ที่ใช้ข้อมูลอัพเดทจากเซิฟเวอร์ B

  3. กลุ่มสีน้ำเงิน - ยังไม่ถูกใครอัพเดท

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

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

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

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

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

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

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

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

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

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

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

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

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

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

🎯 บทสรุป

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

👶
👶 Blockchain