มาทำความเข้าใจ Corda Blockchain กันดีกว่า Part 1

Apsa_sue
4 min readMar 15, 2019

** ขอบอกก่อนว่า เนื้อหาที่จะเล่านี้ค่อนข้างจะ technical ดังนั้นจึงอาจจะมีศัพท์ยากๆ จึงไม่ค่อยแนะนำสำหรับมือใหม่เท่าไหร่ แต่จะพยายามให้ clean and simple ที่สุดครับ!! โดยผมจะแบ่งบทความเกี่ยวกับ Corda ออกเป็น 2 ส่วนคือ ส่วนที่ผมจะแนะนำให้รู้จักกับ Corda และ Key Concept ทั้งหมด ส่วนที่สองจะไปลงลึกในส่วนของการ Setup ระบบต่างๆ เพื่อให้พร้อมนำไปพัฒนาต่อยอดได้ **

** ผมจะอธิบายเพิ่มเติมศัพท์บางคำที่ถูกใช้ในบทความนี้ ไว้ตอนท้ายของบทความ

ขอเกริ่นซักหน่อย!!

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

แต่ก็ยังมี Blockchain อีกประเภทหนึ่งที่เรียกว่า Private Blockchain ซึ่งจะตรงข้ามกับ Public Blockchain แทบทุกอย่าง เพราะ Blockchain ประเภทนี้จะเน้นใช้กับองค์กรเป็นหลักและเน้นความปลอดภัยของข้อมูลสูง ทำให้คนส่วนใหญ่จะไม่ค่อยรู้จักนัก ตัวอย่างของ Blockchain ประเภทนี้ก็เช่น Hyperledger, Quorum หรือตัวที่ผมจะมาแนะนำในวันนี้นั่นคือ Corda จากทีม R3

Corda นั้นจัดว่าตัวเองเป็น Blockchain Technology ในรูปแบบของ Permissioned Blockchain ที่ต้องยืนยันตัวตนก่อนจึงจะเข้าใช้งานภายในเครือข่ายได้

Corda เป็น Blockchain แบบ Permissioned ที่ต้องยืนยันตัวตนก่อนจึงจะเข้าใช้งานเครือข่ายได้

ทีนี้เรามาทำความรู้จักกับ Corda ให้มากขึ้นกันดีกว่า

อย่างแรกที่ต้องรู้เลยคือ Corda เป็น Private Blockchain และตัดระบบ Global broadcast ออกและใช้ระบบ Point-to-Point แทน

ถ้าใครเคยศึกษา Blockchain แบบ Public มาบ้างจะเห็นว่า Public Blockchain ส่วนใหญ่อย่าง Bitcoin หรือ Ethereum จะมีระบบที่เรียกว่า Global Broadcast

แล้ว Global Broadcast คืออะไร?

Global Broadcast คือระบบที่จะทำการกระจายข้อมูลไปยังทุกๆโหนดในระบบเพื่อให้ทุกๆโหนดในระบบมีข้อมูลเดียวกัน ทั้งนี้ระบบลักษณะนี้ออกแบบมาเพื่อเพิ่มความปลอดภัยให้กับทั้งระบบ เพราะถ้าทุกโหนดมีข้อมูลเดียวกันและมีจำนวนโหนดมากพอ การที่ใครสักคนจะพยายามเปลี่ยนแปลงข้อมูลทั้งระบบเพื่อจะโกงระบบ ก็แทบเป็นไปไม่ได้ และยังต้องใช้ค่าใช้จ่ายมหาศาล แต่ก็มีข้อเสียที่ว่า ความเป็นส่วนตัวของข้อมูลจะค่อนข้างต่ำ เพราะทุกคนจะเห็นข้อมูลของเราหมด

เครือข่าย Corda

แต่ Corda นั้นจะเปลี่ยนมาใช้ระบบ Point-to-Point แทน เพราะมีความปลอดภัยและความเป็นส่วนตัวของข้อมูลมากกว่า เนื่องจากแต่ละโหนดจะเห็นแค่ข้อมูลที่ตัวเองเกี่ยวข้องเท่านั้น ไม่มีโหนดใด สามารถเข้าไปแอบดูข้อมูลของโหนดอื่นๆ ได้ แต่ก็มีข้อเสียที่ว่า ถ้าข้อมูลเกิดความเสียหาย ก็จะไม่สามารถไปดึงข้อมูลจากโหนดอื่นๆมาได้เลย เพราะโหนดเหล่านั้นไม่ได้เก็บข้อมูลไว้ ดังนั้นจะต้องมีดูแลรักษาข้อมูลไว้เป็นอย่างดี ซึ่งจะมีค่าใช้จ่ายเพิ่มมากขึ้น

Corda นั้น แต่ละโหนดจะทำงานบน JVM Environment เพื่อทำหน้าที่เป็น ประมวลผลให้กับ CorDApp ที่เขียนด้วยภาษา Java/Kotlins และอย่างที่บอกไปว่า Corda ใช้ระบบ Point-to-Point ในการสื่อสารระหว่างโหนด ข้อมูลจึงถูกจัดเก็บแค่ภายในโหนดที่เกี่ยวข้องกันเท่านั้น (Participant) แม้จะมีการเชื่อมต่อกันหลายโหนดภายในเครือข่ายก็ตาม โดยสื่อสารกันระหว่างโหนดเป็นการส่งข้อมูลแบบเข้ารหัสลับผ่าน AMQP/1.0 Over TLS ภายในเครือข่ายแต่ละโหนดจะอาศัย network map service ในการขอ IP ของโหนดอื่นๆ ที่ต้องการสื่อสาร ซึ่งแต่ละโหนดที่จะเข้าร่วมภายในเครือข่ายได้นั้น ต้องผ่านการตรวจสอบและยืนยันตัวตนจาก Doorman (เป็น network’s permissioning service) แล้วเท่านั้น เพราะเนื่องจาก Corda เป็นระบบแบบ Semi-Private ในการจะเข้าร่วมจึงต้องมีการทำ KYC (Know-Your-Customer) ก่อนถ้าหาก Doorman อนุมัติให้เข้าเชื่อมต่อกับเครือข่ายได้ โหนดนั้นๆ จะได้รับ root-authority-signed TLS certificate เพื่อใช้ในการเข้าร่วมกับเครือข่าย

นอกจากโหนดของแต่ละองค์กรที่จะเข้ามาเชื่อมต่กันในเครือข่ายแล้ว ภายในเครือข่ายก็ยังมีส่วนของ Network Services หลักๆ ที่ควรจะต้องมีในเครือข่ายอีก 2 ประเภทด้วย ดังนี้

  1. Notary Services (จำเป็นต้องมี) เป็น Service ที่จะคอยตรวจสอบ Uniqueness validity (เดียวเราจะไปลงลึกกันอีกทีบทต่อๆไป) ซึ่งจะช่วยป้องกันไม่ให้เกิด Double-spending transaction ขึ้นภายในเครือข่าย
  2. Oracle Services (มีหรือไม่มีก็ได้) เป็น Service ที่จะคอยเชื่อมต่อกับข้อมูลภายนอก (Off-chain Data) เพื่อในกรณีที่การ Validity(ตรวจสอบความถูกต้อง) ต้องมีการใช้ข้อมูลจากภายนอกเครือข่ายมาตรวจสอบและยืนยัน Transaction ด้วย เช่น ราคาหุ้น ณ ปัจจุบัน เพราะเนื่องจาก หากให้แต่ละโหนดเชื่อมต่อข้อมูลและดึงข้อมูลจากภายนอกมายืนยันธุรกรรมกันเอง ก็จะเกิดปัญหาที่ข้อมูลเหล่านั้น ไม่มีความถูกต้อง หรือ ไม่น่าเชื่อถือ จึงจำเป็นต้องมีคนกลางที่น่าเชื่อถือมาคอยดึงข้อมูลให้แทน

ก็จบกันไปกับภาพรวมของเครือข่ายบน Corda หลังจากนี้ เราจะไปลงลึกกันในแต่ละส่วนเลยว่า Corda นั้นมีการทำงานในส่วนต่างๆ อย่างไร ตั้งแต่ Ledger, Transaction, Flow ไปจนถึงองค์ประกอบในแต่ละโหนดว่ามีอะไรบ้าง

The Ledger

Ledger หรือ สมุดบัญชี คือ สิ่งที่ใช้ในการเก็บข้อมูลของแต่ละโหนด โดย Corda นั้นแต่ละคู่โหนดจะเก็บข้อมูลเดียวกันบน ledger เช่น Ledger ของโหนด Bob และโหนด Alice ก็จะมีข้อมูลชุดหนึ่งที่ Bob และ Alice มีเหมือนกัน ส่วน Ledger ระหว่าง Bob และ Carl ก็จะเป็นข้อมูลอีกชุดหนึ่งที่ Bob และ Carl จะมีเหมือนกัน แต่ทุกโหนดจะมีแค่ 1 Ledger โดยข้อมูลที่ระหว่างแต่ละโหนดมีเหมือนกันเรียกว่า Facts (คล้ายๆกับ เป็นข้อเท็จจริงที่ระหว่างโหนดจะมีข้อเท็จจริงเดียวกัน หรือ Share facts ร่วมกันนั่นเอง)

Identity

Corda มีการนำมาตรฐาน X.509 Certificate มาใช้โดย identity จะมีทั้งแบบ legal identities หรือ service identities

Legal Identities จะใช้กับ Party Node ภายใน Transaction

Service identities จะใช้กับ Notary Node / Oracle Node ภายใน Transaction

ซึ่งทั้งสองรูปแบบก็จะมีทั้งแบบ Well-Known และ Confidential

โดย Well-Know (ใช้แค่ Public key ของตัวเองเท่านั้นในการสร้าง Transaction) จะมองเห็น Transaction ทั้งหมดใน chain ที่เกี่ยวข้องกับ Transaction นั้นๆ แต่ถ้าเป็น Confidential (ใช้ Public Key ของคนที่จะคุยด้วย และ Private Key ของตัวเองในการสร้าง Transaction) จะเห็นแค่ Transaction ที่เกี่ยวข้องกับตัวเองเท่านั้น เช่น นาย A โอนเงินไป นาง B แล้วนาง B ส่งเงินต่อให้นางสาว C ถ้า C เป็นแบบ Well-know ก็จะเห็น Transaction ทั้งหมดตั้งแต่ A ไปจนถึง C เลย แต่ถ้าเป็นแบบ Confidential ก็จะเห็นแค่ B ไป C

States

โครงสร้างของ State

State คือ สถานะของโหนด ณ ช่วงเวลาต่างๆ ของ Party Node นั้นๆ โดยจะเป็นข้อมูลแบบ Object ที่เป็น Immutable (แก้ไขไม่ได้) ซึ่ง State จะมีรูปแบบเป็นอย่างไรก็ขึ้นอยู่กับการออกแบบ State ภายใน Party นั้นๆ

โดยในแต่ละ State แม้จะมีการออกแบบที่แตกต่างกันได้ แต่โครงสร้างหลักๆของ State จะประกอบด้วย 3 ส่วนดังนี้

  1. Contract Code Reference = เป็นส่วนเก็บข้อมูลที่ใช้อ้างอิง Contract เอาไว้ เช่น Contract Version เพื่อใช้ในการ Validity เช่น State ของทั้ง Party จะต้องมี Version เดียวกัน
  2. Legal Prose Reference (Participate) = เป็นส่วนเก็บข้อมูลว่า State นั้นเกี่ยวข้องกับใครบ้าง ใครสร้าง? ใครตรวจสอบ?
  3. State Properties = เป็นส่วนเก็บข้อมูลทั้งหมดของ State นั้นๆ
The Vault (ตู้นิรภัยของ State)

โดย State จะถูกแบ่งเป็น Consumed State (Consumed Historical State) และ Unconsumed State (Current State) และอย่างที่ผมบอกไปแล้วว่า State เป็น Immutable Object เพราะฉะนั้นการจะเปลี่ยนแปลงข้อมูลใน State จะเป็นการ State Mark โดยการสร้าง Transaction Proposals ขึ้นมา เพื่อเปลี่ยนให้ State นั้นกลายเป็น Consumed State และนำ State ใหม่มาแทนที่เป็น Unconsumed State แทน โดย Consumed State จะถูกจัดเก็บอยู่ภายใน Vault (ตู้นิรภัยของ State) ของโหนดนั้นๆ โดยการจะเปลี่ยนแปลง State ได้นั้น ต้องได้รับการยินยอมจากทั้ง Party Node แล้วเท่านั้น

The Vault จะมีการเก็บแยกเฉพาะของแต่ละโหนดเพื่อใช้เก็บ Uncosumed State และ Consumed State ไว้เรียกใช้เพื่อการทำ Transaction Validity

Contracts

Contract จะมีหน้าที่ในการ Validate Transaction ที่จะถูกสร้างขึ้น โดยจะคอยทำหน้าที่ตรวจสอบว่า Transaction ใหม่ที่ถูกสร้างนั้น ตรงตามข้อกำหนดต่างๆ ที่ถูกกำหนดไว้ภายใน Party Node นั้นๆ หรือไม่ โดยมีเงื่อนไขที่ว่าทุกๆโหนดภายใน Party Node จะต้องมี Contract เวอร์ชั่นเดียวกันทั้งหมด เพื่อป้องกันไม่ให้มีโหนดใดแอบทำการเปลี่ยนแปลง Contract ในฝั่งของตัวเองเท่านั้น

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

Transaction Verification (การยืนยัน Transaction)

แต่ละ Transaction นั้นๆ จำเป็นจะต้องถูก signed โดยที่ผู้เกี่ยวข้องทุกคนใน Party Node แต่ถ้าหาก Transaction นั้นไม่ถูกยืนยันความถูกต้องโดย Contract ก่อน Transaction นั้น ก็จะไม่สมบูรณ์ โดย Contract จะทำการนำ Input State และ Output State ภายใน Transaction มาทำการตรวจสอบว่าผ่านเงื่อนไขภายใน Contract หรือไม่ โดยภายใน State จะต้องมีการ Reference ไปยัง Contract ด้วย (ใน State จะมีส่วนของ Contract Code Reference อยู่)

ซึ่งถ้าผ่านเงื่อนไขดังนี้ ก็จะถือว่า Transaction สมบูรณ์

  1. ทุกๆ State จะต้องอ้างอิงไปยัง Contract นั้นๆ
  2. Contract จะเรียกใช้งาน Transaction (Contract มอง Transaction เป็น Input) และ State เป็นหลัก ว่ามีเงื่อนไขตรงตามที่ Contract ได้ระบุไว้หรือไม่
  3. Transaction จะ Valid ก็ต่อเมื่อ Contract นั้นๆ มองว่าทุกๆ Input state และ Output state ถูกต้องสมบูรณ์

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

สำหรับบทความแรก ผมขอจบไว้ตรงนี้ก่อน เพราะในบทความหน้าผมจะไปพูดเจาะลึกในส่วนของ Transaction และ Flow กันต่อ ซึ่งมันค่อนข้างเยอะ เดี่ยวบทความนี้ จะยาวเกินไป แล้วมาเจอกันใหม่ใน Part.2 ครับ

คำศัพท์เพิ่มเติม

  • AMQP /1.0 Over TLS (Advanced Message Queuing Protocol)= เป็นโปรโตคอลการสื่อสารแบบเข้ารหัสลับระหว่างโหนดบน Application Layer
  • Immutable = ข้อมูลที่เปลี่ยนแปลงไม่ได้ แก้ไขไม่ได้ ลบทิ้งไม่ได้ มักถูกใช้ใน Blockchain หลายแพลตฟอร์ม
  • Party Node = กลุ่มของโหนดที่เกี่ยวข้องและร่วมกันสร้าง Transaction และเปลี่ยนแปลง State ร่วมกัน
  • Private Key = เป็นรหัสลับสำหรับใช้ในการเข้ารหัสลับข้อมูลเพื่อส่งต่อ โดยจะถูกสร้างขึ้นในลักษณะของ กุญแจไม่สมมาตรซึ่งจะประกอบด้วย Private Key และ Public Key โดยสามารถใช้ Private Key ในการเข้ารหัสลับ และถอดรหัสลับกลับด้วย Public Key ได้
  • Public Key = เป็นสิ่งที่ถูกสร้างขึ้นจาก Private Key ของโหนดนั้นๆ เพื่อให้โหนดอื่นๆ ใช้ในการยืนยันตัวตนว่า Transaction นั้นมาจากโหนดที่สร้างมันขึ้นมาจริงๆ ตัวอย่างเช่น โหนด A สร้าง Transaction ขึ้นโดย Signed ด้วย Private Key ของตัวเอง และส่งให้โหนด B หลังจากนั้นโหนด B จึงทำการถอดรหัสลับข้อมูลด้วย Public Key ของโหนด A ซึ่งถ้าถอดรหัสข้อมูลได้ ก็แปลว่า Transaction นั้นๆ มาจากโหนด A จริงๆ
  • Sandbox = เป็นการทำงานโดยตัดเงื่อนไขภายนอกออกทั้งหมด ไม่ไปยุ่งเกี่ยวกับระบบอื่นๆ เพื่อลดข้อผิดพลาดทั้งของตัวระบบเอง และ ระบบส่วนอื่นๆ ด้วย และทำให้ปลอดภัยมากขึ้น แต่ก็ทำให้เกิดข้อจำกัดตามมาด้วยเช่นกัน

--

--