nostr live (1)
Picture of Krittanai P.

Krittanai P.

อ่าน Bitcoin Whitepaper แปลไทย ไปกับไรท์ชิฟท์

ชวนคุณอ่านเอกสาร บิตคอยน์ไวท์เปเปอร์ ฉบับแปลไทย เข้าใจง่าย ไปพร้อม ๆ กับ Right Shift

บิตคอยน์ : ระบบเงินสดอิเล็กทรอนิกส์แบบ peer-to-peer

ระบบเงินสดอิเล็กทรอนิกส์แบบ peer-to-peer นั้นจะช่วยให้เราสามารถชำระเงินผ่านทางออนไลน์ได้โดยตรงจากฝ่ายหนึ่งไปยังอีกฝ่ายหนึ่ง ไม่ต้องผ่านตัวกลางอย่างพวกสถาบันการเงิน โดยการใช้ digital signature เป็นส่วนหนึ่งในการแก้ปัญหานี้ แต่มันจะไม่มีประโยชน์ใด ๆ เลยหากยังคงต้องอาศัยตัวกลางที่เชื่อถือได้มาแก้ปัญหา double spending (การใช้เงินซ้ำซ้อน)

เราขอเสนอวิธีแก้ปัญหา double spending โดยใช้เครือข่ายแบบ peer-to-peer ให้เครือข่ายคอยประทับเวลาธุรกรรมต่าง ๆ ในระบบและนำมาเรียงร้อยกันเป็นเส้นสายของ proof-of-work ที่ใช้ hash เพื่อสร้างธุรกรรมที่ไม่สามารถเปลี่ยนแปลงได้ โดยไม่ต้องทำ proof-of-work ใหม่ โดยให้เส้นสายที่ยาวที่สุดนั้น ไม่เพียงแต่ทำหน้าที่เป็นลำดับของธุรกรรมที่เกิดขึ้น แต่ยังเป็นสิ่งที่พิสูจน์ได้ว่ามาจากกำลังประมวลผล CPU ที่มากที่สุดอีกด้วย และตราบใดที่ node ส่วนใหญ่ไม่ได้ร่วมมือกันโจมตีเครือข่ายและยังคงควบคุมกำลังประมวลผลส่วนใหญ่ในระบบเอาไว้ พวกเขาก็จะสร้างเส้นสายที่ยาวที่สุดและสามารถเอาชนะผู้ประสงค์ร้ายที่จะโจมตีระบบได้

ตัวเครือข่ายเองไม่ได้ต้องมีโครงสร้างอะไรที่ซับซ้อน ข้อมูลต่าง ๆ ในเครือข่ายจะถูกกระจายส่งต่อโดยไม่ต้องสนใจว่าผู้รับจะได้รับหรือไม่ และ node ต่าง ๆ เองก็สามารถที่จะออกจากเครือข่ายและกลับเข้าร่วมใหม่เมื่อไรได้ตามที่ต้องการ โดยยอมรับเส้น proof-of-work ที่ยาวที่สุดเป็นหลักฐานของสิ่งที่เกิดขึ้นในขณะที่ node นั้น ๆ ไม่ได้อยู่ในเครือข่าย

1. บทนำ (Introduction)

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

ผู้ค้าก็จำเป็นต้องระมัดระวังลูกค้า และต้องเรียกร้องข้อมูลมากกว่าที่จำเป็น

การฉ้อโกงกลายเป็นเรื่องที่หลีกเลี่ยงไม่ได้เนื่องจากต้นทุนและความไม่แน่นอนในทำธุรกรรมเหล่านี้ แน่นอนว่าเราสามารถหลีกเลี่ยงมันได้โดยการใช้เงินสด แต่ก็ไม่มีกลไกใดที่ทำให้สามารถใช้เงินสดผ่านช่องทางการสื่อสาร (เอาให้เข้าใจง่ายก็อินเทอร์เน็ต) ได้โดยไม่ต้องมีตัวกลาง

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

ในเอกสารชุดนี้ เราขอเสนอวิธีแก้ปัญหาการใช้จ่ายซ้ำซ้อนโดยใช้ระบบบันทึกเวลา (timestamp server) กระจายศูนย์แบบ peer-to-peer เพื่อสร้างหลักฐานการคำนวณลำดับเวลาของธุรกรรม โดยระบบนี้จะปลอดภัยตราบใดที่กลุ่มของ node ที่ซื่อสัตย์ยังคงมีกำลังประมวลผลที่มากกว่ากลุ่มที่ประสงค์ร้ายกับระบบ

2. ธุรกรรม (Transactions)

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

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

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

ดังนั้นเพื่อให้บรรลุเป้าหมายนี้โดยไม่ต้องมีตัวกลางเป็นบุคคลที่สามที่เชื่อถือได้ ธุรกรรมทั้งหมดจะต้องถูกประกาศต่อสาธารณะ [1] และเราต้องการระบบที่ผู้เข้าร่วมเห็นพ้องในประวัติธุรกรรมชุดเดียวกันตามลำดับที่ได้รับ ส่วนผู้รับเงินก็จำเป็นจะต้องมีหลักฐานว่าในขณะที่ทำธุรกรรมนั้น node ส่วนใหญ่ในระบบเห็นพ้องต้องกันว่าธุรกรรมดังกล่าวเกิดขึ้นเป็นลำดับแรก (ไม่มีธุรกรรมที่ใช้เหรียญพวกนี้มาก่อน)

3. ระบบบันทึกเวลา (Timestamp Server)

สำหรับแนวทางการแก้ปัญหาในครั้งนี้ เราจะใช้ประโยชน์จาก timestamp server ที่จะทำหน้าที่บันทึก hash ของบล็อกที่ต้องการให้มีการบันทึกเวลา และจากนั้นจะทำการเผยแพร่ hash ดังกล่าวเหมือนกับหนังสือพิมพ์หรือโพสต์ใน Usenet [2-5] (ฟีลแบบทุกคนจะเห็นโพสต์นี้น้าาา ประมาณนั้น) การบันทึกเวลานี้จะพิสูจน์ได้ว่าข้อมูลที่ถูก hash นั้นจะต้องมีอยู่จริงในเวลานั้นเพื่อให้ได้มาซึ่ง hash ดังกล่าว แต่ละการบันทึกเวลาจะรวมการบันทึกเวลาก่อนหน้านี้ไว้ใน hash ของมันเพื่อสร้างเป็นเส้นสายต่อกันหรือ “เชน” โดยการบันทึกเวลาแต่ละครั้งจะยืนยันความถูกต้องของการบันทึกก่อนหน้าได้อีกด้วยด้วย

4. พรูฟ-ออฟ-เวิร์ก (Proof-of-Work)

ในการสร้าง timestamp server กระจายศูนย์บนพื้นฐานแบบ peer to peer เราจำเป็นต้องใช้ระบบ Proof-of-Work (PoW) ที่คล้ายกับ Hashcash ของ Adam Back [6] แทนที่จะใช้วิธีการแบบเดิม ๆ อย่างการประกาศในหนังสือพิมพ์หรือ Usenet โดย PoW นั้นใช้ในการตรวจสอบค่าที่มาจากฟังก์ชันการ hash เช่น SHA-256 แล้วค่า hash จะขึ้นต้นด้วยเลขศูนย์จำนวนหนึ่ง โดยที่ work (หรือก็คือพลังในการประมวลผล) ที่ต้องใช้จะเพิ่มขึ้นแบบทวีคูณตามจำนวนเลขศูนย์ที่ต้องการ และสามารถตรวจสอบได้ง่าย ๆ โดยการรัน hash เพียงครั้งเดียว

ซึ่งสำหรับ timestamp network ของเรานั้น เราใช้ PoW โดยการเพิ่มค่า nonce (number used once) ในบล็อกไปเรื่อย ๆ จนกว่าจะพบค่าที่ทำให้ hash ของบล็อกนั้นมีจำนวนเลขศูนย์ตามที่กำหนด และเมื่อใช้กำลังประมวลผลของ CPU ไปกับการทำ PoW จนสำเร็จแล้ว บล็อกจะไม่สามารถเปลี่ยนแปลงแก้ไขได้หากไม่มีการทำงานซ้ำใหม่ทั้งหมด เนื่องจากบล็อกที่สร้างขึ้นภายหลังจะเชื่อมโยงกับบล็อกก่อนหน้า การเปลี่ยนแปลงบล็อกใด ๆ จะต้องทำ PoW ของบล็อกนั้นและบล็อกที่ตามมาใหม่ทั้งหมด

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

เพื่อชดเชยความเร็วของฮาร์ดแวร์ที่เพิ่มขึ้นและความสนใจในการรัน node ที่ผันผวน ระดับความยากของ PoW จะถูกกำหนดโดยค่าเฉลี่ย โดยตั้งเป้าไว้ที่จำนวนบล็อกเฉลี่ยต่อชั่วโมง หากมีการสร้างบล็อกได้เร็วเกินไป ระดับความยากในการขุด (difficulty)  ก็จะปรับตัวเพิ่มขึ้น

5. เครือข่าย (Network)

เครือข่ายบิตคอยน์นั้นมีการทำงาน ดังนี้

  1. การประกาศธุรกรรมใหม่ : ธุรกรรมใหม่จะถูกประกาศ (broadcast) ไปยังทุก node ในเครือข่าย
  2. การรวบรวมธุรกรรม : แต่ละ node จะรวบรวมธุรกรรมใหม่ ๆ เหล่านี้เอาไว้ในบล็อก
  3. การค้นหา PoW : แต่ละ node จะทำการคำนวณเพื่อค้นหา PoW ตามระดับความยากในการขุดสำหรับบล็อกนั้น ๆ
  4. การประกาศบล็อก : เมื่อมี node ใดค้นหา PoW ได้แล้ว node นั้นจะทำการประกาศบล็อกไปยังทุก node ในเครือข่าย
  5. การตรวจสอบและยอมรับบล็อก : node อื่น ๆ จะทำการตรวจสอบและยืนยันบล็อกนั้นเฉพาะก็ต่อเมื่อธุรกรรมทั้งหมดภายในบล็อกดังกล่าวถูกต้องสมบูรณ์และยังไม่เคยถูกใช้มาก่อ
  6. การสร้างบล็อกถัดไป : node ต่าง ๆ ยืนยันการยอมรับบล็อกโดยการเริ่มต้นสร้างบล็อกถัดไปในเชนด้วยการใช้ hash ของบล็อกที่ยอมรับเป็น hash ก่อนหน้าในโครงสร้างของบล็อกใหม่ที่กำลังสร้าง

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

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

6. แรงจูงใจ (Incentive)

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

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

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

7. การจัดการพื้นที่ดิสก์ (Reclaiming Disk Space)

เมื่อธุรกรรมถูกบรรจุลงในบล็อกแล้ว ก็สามารถกำจัดธุรกรรมที่ใช้ไปแล้วก่อนหน้านั้นออกได้เพื่อประหยัดพื้นที่ดิสก์ แต่การจะทำอย่างนี้ได้โดยไม่ให้เลข hash ของบล็อกมีการเปลี่ยนแปลงนั้น ธุรกรรมจึงจำเป็นต้องถูก hash ในรูปแบบของ Merkle Tree [7][2][5] โดยมีแค่ root hash ของ tree เท่านั้นที่จะรวมอยู่ใน hash ของบล็อก นี่เป็นวิธีที่ทำให้สามารถบีบอัดข้อมูลในบล๊อกเก่า ๆ ได้โดยการตัดพวก hash ส่วนอื่น ๆ ของ tree ที่ไม่ใช่ root hash ออก (ก็คือไม่จำเป็นต้องเก็บ hash ในชั้นอื่น ๆ ของ tree นั่นเอง)

โดยในส่วน header ของบล็อกที่ไม่มีธุรกรรมจะมีขนาดประมาณ 80 ไบต์ หากเราสมมติว่าบล็อกถูกสร้างขึ้นทุก ๆ 10 นาที จะได้ว่า 80 ไบต์ * 6 * 24 * 365 = 4.2MB ต่อปี โดยที่ระบบคอมพิวเตอร์ทั่วไปที่วางขายในปี 2008 นั้นมี RAM 2GB และกฎของมัวร์ทำนายการเติบโตในปัจจุบันที่ 1.2GB ต่อปี จึงทำให้การจัดเก็บข้อมูลไม่น่าจะเป็นปัญหาแม้ว่าส่วน header ของบล็อกจะต้องถูกเก็บไว้ในหน่วยความจำก็ตาม

8. การตรวจสอบธุรกรรมแบบง่าย (Simplified Payment Verification)

การที่จะยืนยันการชำระเงินโดยไม่จำเป็นต้องรัน full node ได้นั้น ผู้ใช้เพียงแค่เก็บสำเนาของส่วน header ของบล็อกของเชนที่ยาวที่สุด ซึ่งสามารถรับสำเนาได้โดยการสอบถามจาก node อื่น ๆ ในเครือข่ายจนมั่นใจว่าได้รับเชนของสายบล็อกที่ยาวที่สุด และรับ Merkle Branch ที่เชื่อมโยงธุรกรรมกับบล็อกที่มีการประทับเวลา (Timestamp) อยู่ ถึงแม้ผู้ใช้จะไม่สามารถตรวจสอบธุรกรรมด้วยตัวเองได้ แต่การเชื่อมโยงธุรกรรมกับตำแหน่งในสายบล็อกจะทำให้เห็นว่า node ในเครือข่ายยอมรับแล้ว และบล็อกที่เพิ่มเข้ามาหลังจากนั้นเป็นการยืนยันเพิ่มเติมว่าเครือข่ายยอมรับธุรกรรมนี้แล้ว

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

9. การควบรวมและแบ่งย่อยมูลค่า (Combining and Splitting Value)

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

ควรสังเกตว่า fan-out (กระจายของธุรกรรม) ซึ่งเป็นกรณีที่ธุรกรรมธุรกรรมหนึ่งนั้นขึ้นอยู่กับหลาย ๆ ธุรกรรม และธุรกรรมเหล่านั้นเองก็ขึ้นอยู่กับอีกหลาย ๆ ธุรกรรม แต่สิ่งนี้ไม่ใช่ปัญหาในที่นี้เนื่องจากไม่มีความจำเป็นในการดึงประวัติการทำธุรกรรมทั้งหมดออกมาเป็นสำเนา

10. ความเป็นส่วนตัว (Privacy)

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

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

11. การคำนวณ (Calculations)

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

ผู้โจมตีจึงทำได้เพียงพยายามเปลี่ยนแปลงธุรกรรมของตนเอง เพื่อนำเงินที่ใช้ไปแล้วกลับคืนมาเท่านั้น

การแข่งขันระหว่างเชนที่ซื่อสัตย์กับเชนของผู้โจมตี สามารถอธิบายได้ด้วยแบบจำลองการเดินสุ่มทวินาม (Binomial Random Walk) โดยเหตุการณ์ที่สำเร็จ หมายถึงเชนที่ซื่อสัตย์ถูกขยายออกไปอีกหนึ่งบล็อก เพิ่มความยาวนำหน้าไป +1 และเหตุการณ์ที่ล้มเหลวหมายถึงเชนของผู้โจมตีถูกขยายออกไปหนึ่งบล็อก ลดช่องว่างลง -1

ความน่าจะเป็นที่ผู้โจมตีจะไล่ตามทันจากช่องว่างที่กำหนด สามารถเปรียบเทียบด้วย Gambler’s Ruin problem โดยสมมติว่านักพนันที่มีเครดิตไม่จำกัด เริ่มต้นด้วยการขาดทุน และเล่นพนันไปเรื่อย ๆ เพื่อให้ถึงจุดคุ้มทุน เราสามารถคำนวณความน่าจะเป็นที่เขาจะกลับมาถึงจุดคุ้มทุนได้ หรือความน่าจะเป็นที่ผู้โจมตีจะไล่ทัน chain ที่สุจริตได้ ดังนี้ [8]:

p = ความน่าจะเป็นที่ node ที่ซื่อสัตย์จะพบบล็อกถัดไป
q = ความน่าจะเป็นที่ผู้โจมตีจะพบบล็อกถัดไป
qz = ความน่าจะเป็นที่ผู้โจมตีจะไล่ทัน จากที่ตามหลังอยู่ z บล็อก

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

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

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

ผู้รับจะรอจนกว่าธุรกรรมจะถูกเพิ่มลงในบล็อกและมีบล็อกที่ถูกเชื่อมต่อตามหลังมาอีกจำนวน z บล็อก โดยที่เขาไม่ทราบความคืบหน้าที่แน่นอนที่ผู้โจมตีได้กระทำลงไปแล้ว แต่สมมติว่าบล็อกที่ซื่อสัตย์ใช้เวลาเฉลี่ยต่อบล็อกตามที่คาดไว้ ความคืบหน้าที่อาจเกิดขึ้นได้ของผู้โจมตีจะเป็น “การแจกแจงแบบปัวซง” (Poisson distribution) ซึ่งมีค่าที่คาดหวังดังนี้ :

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

จัดเรียงใหม่เพื่อหลีกเลี่ยง infinite tail ของการแจกแจง

แปลงมันให้เป็น C code

				
					#include 
double AttackerSuccessProbability(double q, int z)
{
double p = 1.0 - q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}


				
			

เมื่อรันผลลัพธ์บางส่วน เราจะเห็นว่าความน่าจะเป็นลดลงแบบเอกซ์โพเนนเชียลเมื่อ z เพิ่มขึ้น

				
					q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006


				
			

การแก้หาค่า P ที่น้อยกว่า 0.1%…

				
					P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340



				
			

12. สรุป (Conclusion)

เราได้นำเสนอระบบธุรกรรมอิเล็กทรอนิกส์ที่ไม่ต้องพึ่งพาความเชื่อใจ เริ่มต้นจากกรอบแนวคิดของเหรียญที่สร้างจาก digital signature ซึ่งช่วยควบคุมความเป็นเจ้าของได้อย่างดีแต่ก็ยังไม่สมบูรณ์หากปราศจากวิธีการป้องกันการใช้จ่ายซ้ำซ้อน เพื่อแก้ปัญหานี้เราจึงเสนอเครือข่ายแบบ peer-to-peer ที่ใช้ PoW ในการบันทึกประวัติธุรกรรมสาธารณะ ซึ่งจะกลายเป็นเรื่องยากมากสำหรับผู้โจมตีที่จะเปลี่ยนแปลงมันหาก node ที่ซื่อสัตย์ยังควบคุมพลังประมวลผล CPU ส่วนใหญ่

เครือข่ายนี้มีความแข็งแกร่งในความเรียบง่ายที่ไม่มีโครงสร้างใด ๆ ที่ซับซ้อน node ต่าง ๆ ทำงานพร้อมกันโดยประสานงานกันเพียงเล็กน้อยแบบไม่จำเป็นต้องระบุตัวตน เนื่องจากข้อความไม่ได้ถูกส่งไปยังสถานที่ใดสถานที่หนึ่งโดยเฉพาะและเพียงต้องส่งให้ถึงมือผู้รับให้ได้อย่างดีที่สุด node ต่าง ๆ สามารถที่จะออกจากและเข้าร่วมเครือข่ายได้ตามต้องการ โดยยอมรับเชนที่มี PoW มากที่สุดว่าเป็นสิ่งที่เกิดขึ้นในขณะที่พวกเขาไม่ได้เชื่อมต่อกับเครือข่าย พวกเขาทำการโหวตด้วยกำลังประมวลผลของ CPU ทำการแสดงการยอมรับบล็อกที่ถูกต้องด้วยการทำงานเพื่อขยายบล็อกต่อไป และทำการปฏิเสธบล็อกที่ไม่ถูกต้องด้วยการปฏิเสธที่จะทำงานกับบล็อกเหล่านั้น กฎและแรงจูงใจใด ๆ ที่จำเป็นสามารถบังคับใช้ได้ด้วยกลไกฉันทามตินี้

เนื้อหาส่วนขยายเพิ่มเติม ไปอ่านต่อกันเองได้เลยเด้ออ

หนังสือ Inventing Bitcoin : ไขกลไกนวัตกรรมเงินเปลี่ยนโลก

[1] W. Dai, “b-money,” http://www.weidai.com/bmoney.txt , 1998.
[2] H. Massias, X.S. Avila, and J.-J. Quisquater, “Design of a secure timestamping service with minimal trust requirements,” In 20th Symposium on Information Theory in the Benelux, May 1999.
[3] S. Haber, W.S. Stornetta, “How to time-stamp a digital document,” In Journal of Cryptology, vol 3, no 2, pages 99-111, 1991.
[4] D. Bayer, S. Haber, W.S. Stornetta, “Improving the efficiency and reliability of digital time-stamping,”
In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.
[5] S. Haber, W.S. Stornetta, “Secure names for bit-strings,” In Proceedings of the 4th ACM Conference on Computer and Communications Security, pages 28-35, April 1997.
[6] A. Back, “Hashcash – a denial of service counter-measure,”
http://www.hashcash.org/papers/hashcash.pdf , 2002.
[7] R.C. Merkle, “Protocols for public key cryptosystems,” In Proc. 1980 Symposium on Security and
Privacy, IEEE Computer Society, pages 122-133, April 1980.
[8] W. Feller, “An introduction to probability theory and its applications,” 1957.

Krittanai P.

** ทุกบาทหรือทุกซาโตชิที่ donate จะถูกส่งเข้ากระเป๋าของผู้เขียนโดยตรงครับ :) **

Share this post

One comment

Leave a Reply

Connect with

Your email address will not be published. Required fields are marked *


Related Posts

BitcoinTalk

Why Bitcoin? (BitcoinTalk 100)

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

Read More »
Ownership
BitcoinTalk

Ownership (BitcoinTalk 117)

ความเป็นเจ้าของ ( Ownership ) คืออะไร? การที่เราเป็นเจ้าของเงินซึ่งฝากเอาไว้กับธนาคารต่างๆ แปลว่าเราเป็นเจ้าของเงินจำนวนนั้นจริงๆ หรือไม่? Ownership นั้นให้อะไรกับเราบ้าง และ มีความสำคัญกับเราขนาดไหน?

Read More »