เขียนโดย: BitMEX Research
มีชุดธุรกรรมที่เหมือนกันสองชุดในบล็อคเชน Bitcoin โดยชุดธุรกรรมชุดหนึ่งจะ "ประกบ" กับอีกชุดหนึ่ง และทั้งสองชุดเกิดขึ้นในช่วงกลางเดือนพฤศจิกายน 2010 ธุรกรรมที่ซ้ำกันอาจทำให้เกิดความสับสน และนักพัฒนา Bitcoin ได้ต่อสู้กับปัญหานี้ด้วยวิธีต่างๆ ตลอดหลายปีที่ผ่านมา ปัญหาดังกล่าวยังไม่ได้รับการแก้ไข 100% และธุรกรรมซ้ำที่อาจเกิดขึ้นครั้งต่อไปอาจเกิดขึ้นในปี 2046 แม้ว่าความเสี่ยงที่เกี่ยวข้องกับธุรกรรมซ้ำจะลดน้อยลงแล้วก็ตาม แต่ก็ถือเป็นปัญหาที่น่าสนใจที่ควรคำนึงถึง

ภาพรวม
ธุรกรรม Bitcoin ปกติจะใช้เอาต์พุตอย่างน้อยหนึ่งรายการจากธุรกรรมก่อนหน้าโดยอ้างอิง ID ธุรกรรม (TXID) ของธุรกรรมก่อนหน้า เอาท์พุตที่ไม่ได้ใช้เหล่านี้สามารถใช้จ่ายได้เพียงครั้งเดียวเท่านั้น หากใช้จ่ายได้สองครั้ง คุณจะใช้ Bitcoin ซ้ำสองครั้ง ส่งผลให้ไม่มีค่าใดๆ อย่างไรก็ตาม จริงๆ แล้วมีชุดธุรกรรมที่เหมือนกันสองชุดใน Bitcoin สิ่งนี้เป็นไปได้เพราะธุรกรรม Coinbase ไม่มีอินพุตธุรกรรมใดๆ แต่มีเหรียญที่สร้างใหม่ ดังนั้นจึงเป็นไปได้ที่ธุรกรรม coinbase สองรายการที่แตกต่างกันจะส่งจำนวนเงินเท่ากันไปยังที่อยู่เดียวกันและสร้างในลักษณะที่เหมือนกันทุกประการซึ่งทำให้ทั้งสองธุรกรรมเหมือนกัน เนื่องจากธุรกรรมเหล่านี้เหมือนกัน TXID จึงตรงกันด้วย เนื่องจาก TXID เป็นการไดเจสต์แบบแฮชของข้อมูลธุรกรรม วิธีอื่นเพียงวิธีเดียวที่สามารถทำซ้ำ TXID ได้คือการชนกันของแฮช ซึ่งถือว่าไม่น่าจะเป็นไปได้และไม่สามารถทำได้สำหรับฟังก์ชันแฮชที่ปลอดภัยด้วยการเข้ารหัส การชนกันของแฮชแบบ SHA256 ไม่เคยเกิดขึ้นใน Bitcoin หรือที่อื่นใด
ธุรกรรมที่ซ้ำกันทั้งสองชุดเกิดขึ้นในช่วงเวลาที่คล้ายกัน คือ ระหว่างเวลา 08:37 UTC ของวันที่ 14 พฤศจิกายน พ.ศ. 2553 ถึงเวลา 00:38 UTC ของวันที่ 15 พฤศจิกายน พ.ศ. 2553 ซึ่งเป็นระยะเวลาประมาณ 16 ชั่วโมง ธุรกรรมที่ซ้ำกันชุดแรกจะถูกคั่นอยู่ระหว่างชุดที่สอง เราจัดประเภท d5d2….8599 ให้เป็นธุรกรรมซ้ำครั้งแรก เนื่องจากเป็นธุรกรรมแรกที่ซ้ำกัน แม้ว่าจะเป็นเรื่องแปลกที่ธุรกรรมนี้ปรากฏบนบล็อกเชนเป็นครั้งแรกหลังจากธุรกรรมซ้ำอีกครั้งหนึ่ง นั่นคือ e3bf….b468
ทำซ้ำรายละเอียดการทำธุรกรรม
ในภาพด้านล่างนี้ คุณจะเห็นภาพหน้าจอสองภาพจากตัวสำรวจบล็อก mempool.space ซึ่งแสดงให้เห็นธุรกรรมซ้ำครั้งแรกที่เกิดขึ้นซ้ำในสองบล็อกที่แตกต่างกัน


สิ่งที่น่าสนใจคือ เมื่อพิมพ์ URL ที่เกี่ยวข้องลงในเว็บเบราว์เซอร์ ตัวสำรวจบล็อก mempool.space จะแสดงบล็อกก่อนหน้าในกรณีของ d5d2….8599 ตามค่าเริ่มต้น และแสดงบล็อกหลังในกรณีของ e3bf….b468 Blockstream.info และ Btcscan.org มีพฤติกรรมเดียวกันกับ mempool.space ในทางกลับกัน จากการทดสอบขั้นพื้นฐานของเรา Blockchain.com และ Blockchair.com มีพฤติกรรมที่แตกต่างกัน และจะแสดงเวอร์ชันล่าสุดของธุรกรรมซ้ำเสมอเมื่อป้อน URL ในเบราว์เซอร์
ในจำนวน 4 บล็อกที่เป็นปัญหา มีเพียงบล็อกเดียว (บล็อก 91,812) ที่มีธุรกรรมเพิ่มเติม ธุรกรรมนี้จะรวมเอาท์พุต 1 BTC และ 19 BTC เป็นเอาท์พุต 20 BTC เดียว
เอาเอาท์พุตพวกนี้ไปใช้ได้มั้ย?
สิ่งนี้สร้างปัญหาการอ้างอิงสำหรับธุรกรรมที่ตามมาเนื่องจากมี TXID เดียวกันสองชุด ธุรกรรมที่เกิดขึ้นซ้ำแต่ละครั้งมีมูลค่า 50 BTC ดังนั้น การทำธุรกรรมซ้ำๆ เหล่านี้จะมีทั้งหมด 4 x 50 BTC = 200 BTC หรือ ขึ้นอยู่กับว่าคุณเข้าใจอย่างไรก็คือ 2 x 50 BTC = 100 BTC ในระดับหนึ่งมี BTC จำนวน 100 เหรียญที่ไม่มีอยู่จริง
ณ วันนี้ มี BTC จำนวน 200 BTC ที่ยังไม่ได้ถูกใช้ เท่าที่เรารู้ (และเราอาจจะเข้าใจผิดก็ได้) หากใครก็ตามมีคีย์ส่วนตัวที่เชื่อมโยงกับเอาท์พุตเหล่านี้ พวกเขาสามารถใช้บิตคอยน์เหล่านั้นได้ อย่างไรก็ตาม เมื่อใช้จ่ายแล้ว UTXO จะถูกลบออกจากฐานข้อมูล และ 50 BTC ที่ซ้ำกันจะไม่สามารถใช้และสูญหายได้ ดังนั้นจึงสามารถกู้คืนได้เพียง 100 BTC เท่านั้น สำหรับเหรียญเหล่านั้นจะมาจากบล็อกไหนหากถูกใช้ไป ตั้งแต่สมัยก่อนหรือปัจจุบัน อาจไม่สามารถระบุได้ชัดเจนหรือไม่สามารถระบุได้
บุคคลนี้สามารถใช้ Bitcoins ทั้งหมดได้ก่อนที่จะสร้างธุรกรรมซ้ำ ซึ่งจะสร้างผลลัพธ์ซ้ำ สร้างรายการใหม่ในฐานข้อมูลของผลลัพธ์ที่ไม่ได้ใช้ นี้จะหมายความไม่เพียงแต่ธุรกรรมซ้ำเท่านั้น แต่ยังรวมถึงธุรกรรมซ้ำที่อาจมีเอาต์พุตที่ใช้ไปซ้ำกันอีกด้วย หากเกิดเหตุการณ์นี้ขึ้น เมื่อเอาท์พุตเหล่านี้ถูกใช้ไป อาจเกิดธุรกรรมซ้ำซ้อนมากขึ้น จนกลายเป็นห่วงโซ่ซ้ำซ้อน จะต้องระมัดระวังกับลำดับเหตุการณ์และใช้จ่ายเสมอ ก่อนที่จะสร้างสำเนา มิฉะนั้น บิตคอยน์อาจสูญหายไปตลอดกาล ธุรกรรมซ้ำใหม่เหล่านี้จะไม่ใช่ธุรกรรม Coinbase แต่เป็นธุรกรรม "ปกติ" โชคดีที่สิ่งนี้ไม่เคยเกิดขึ้น
ปัญหาการทำธุรกรรมซ้ำซ้อน
การทำธุรกรรมซ้ำซ้อนเป็นเรื่องไม่ดีอย่างเห็นได้ชัด พวกเขาสร้างความสับสนให้กับกระเป๋าเงินและตัวสำรวจบล็อก และยังทำให้ไม่ชัดเจนถึงแหล่งที่มาของบิตคอยน์อีกด้วย นอกจากนี้ยังเปิดโอกาสให้มีการโจมตีและช่องโหว่ต่างๆ มากมาย ตัวอย่างเช่น คุณสามารถจ่ายเงินให้ใครบางคนสองครั้งด้วยธุรกรรมที่ซ้ำกันสองรายการ จากนั้นเมื่อฝ่ายที่ทำการซื้อขายตัดสินใจที่จะพยายามเข้าถึงเงิน พวกเขาอาจพบว่ามีเงินเพียงครึ่งเดียวเท่านั้นที่สามารถกู้คืนได้ นี่อาจเป็นได้ เช่น การโจมตีแพลตฟอร์มการซื้อขายเพื่อพยายามทำให้ล้มละลาย โดยที่ผู้โจมตีไม่ต้องสูญเสียอะไรเลย เนื่องจากสามารถถอนเงินออกได้ทันทีหลังจากฝากเงิน
ห้ามทำธุรกรรมที่มี TXID ซ้ำกัน
เพื่อบรรเทาปัญหาธุรกรรมซ้ำซ้อน ในเดือนกุมภาพันธ์ 2012 นักพัฒนา Bitcoin Pieter Wuille ได้เสนอโซลูชัน BIP30 soft fork ซึ่งห้ามใช้ TXID ซ้ำกันสำหรับธุรกรรม เว้นแต่ว่า TXID ก่อนหน้านี้จะถูกใช้ไปแล้ว ซอฟต์ฟอร์กนี้ใช้กับบล็อคทั้งหมดหลังจากวันที่ 15 มีนาคม 2012
ในเดือนกันยายน 2012 นักพัฒนา Bitcoin Greg Maxwell ได้แก้ไขกฎนี้เพื่อให้การตรวจสอบ BIP30 มีผลกับบล็อกทั้งหมด ไม่ใช่แค่เฉพาะบล็อกหลังจากวันที่ 15 มีนาคม 2012 เท่านั้น ข้อยกเว้นคือธุรกรรมซ้ำสองรายการที่กล่าวถึงก่อนหน้านี้ในบทความนี้ นี่จะแก้ไขข้อบกพร่อง DOS บางส่วน ในทางเทคนิคแล้ว นี่ถือเป็นซอฟต์ฟอร์กอีกอันหนึ่ง แม้ว่าการเปลี่ยนแปลงกฎจะใช้ได้กับบล็อคที่มีอายุมากกว่า 6 เดือนเท่านั้น ดังนั้นจึงไม่มีความเสี่ยงใดๆ ที่เกี่ยวข้องกับการเปลี่ยนแปลงกฎโปรโตคอลปกติ
การตรวจสอบ BIP30 นี้ต้องใช้การคำนวณที่มีค่าใช้จ่ายสูง โหนดจำเป็นต้องตรวจสอบเอาท์พุตของธุรกรรมทั้งหมดในบล็อกใหม่และตรวจสอบว่าจุดสิ้นสุดเอาท์พุตเหล่านี้มีอยู่ใน UTXO แล้วหรือไม่ นี่อาจเป็นสาเหตุว่าทำไม Wuille จึงตรวจสอบเฉพาะเอาท์พุตที่ไม่ได้ใช้เท่านั้น การตรวจสอบเอาต์พุตทั้งหมดจะมีต้นทุนทางการคำนวณสูงกว่าและไม่สามารถตัดแต่งได้
BIP34
ในเดือนกรกฎาคม 2012 นักพัฒนา Bitcoin Gavin Andresen ได้เสนอโซลูชัน BIP34 soft fork ซึ่งเปิดใช้งานในเดือนมีนาคม 2013 การเปลี่ยนแปลงโปรโตคอลนี้ต้องการให้ธุรกรรม coinbase รวมถึงความสูงของบล็อกด้วย ซึ่งจะทำให้สามารถกำหนดเวอร์ชันบล็อกได้ด้วย ความสูงของบล็อกจะถูกเพิ่มเป็นรายการแรกของสคริปต์ธุรกรรม coinbase Sig ไบต์แรกในสคริปต์ coinbase Sig คือจำนวนไบต์ที่ใช้โดยหมายเลขความสูงบล็อก และไบต์ที่ตามมาคือหมายเลขความสูงบล็อกนั้นเอง สำหรับ c160 ปีแรก (223 / (144 บล็อกต่อวัน * 365 วันต่อปี)) ไบต์แรกควรเป็น 0x03 นั่นเป็นเหตุผลว่าทำไม ScriptSig (HEX) ของ Coinbase ในปัจจุบันจึงเริ่มต้นด้วย 03 เสมอ ซอฟต์ฟอร์กนี้ดูเหมือนจะสามารถแก้ปัญหาธุรกรรมซ้ำซ้อนได้อย่างสมบูรณ์ และตอนนี้ธุรกรรมทั้งหมดควรจะไม่ซ้ำกัน
เนื่องจาก BIP34 ได้รับการนำมาใช้แล้ว ในเดือนพฤศจิกายน 2558 นักพัฒนา Bitcoin ชื่อ Alex Morcos ได้เพิ่มคำขอการดึงข้อมูลลงในที่เก็บซอฟต์แวร์ Bitcoin Core ซึ่งการเปลี่ยนแปลงนี้หมายความว่าโหนดต่างๆ จะหยุดทำการตรวจสอบ BIP30 เมื่อ BIP34 แก้ไขปัญหานี้แล้ว การตรวจสอบราคาแพงนี้ก็ไม่จำเป็นอีกต่อไป แม้ว่าจะยังไม่เป็นที่ทราบแน่ชัดในเวลานั้น แต่ในทางเทคนิคแล้ว นี่ถือเป็นการฮาร์ดฟอร์กสำหรับบล็อกในอนาคตอันหายากมาก ขณะนี้ การฮาร์ดฟอร์กที่อาจเกิดขึ้นดูเหมือนจะไม่มีความสำคัญ เนื่องจากแทบไม่มีใครใช้ซอฟต์แวร์โหนดที่สร้างก่อนเดือนพฤศจิกายน 2558 ที่ forkmonitor.info เรากำลังใช้ Bitcoin Core 0.10.3 ซึ่งเปิดตัวในเดือนตุลาคม 2558 ดังนั้น นี่จึงเป็นกฎก่อนการฮาร์ดฟอร์ก และไคลเอนต์ยังคงใช้การตรวจสอบ BIP30 ซึ่งมีราคาแพงอยู่
บล็อค 983,702 คำถาม
ปรากฏว่ามีการทำธุรกรรม coinbase ในบล็อกก่อนที่ BIP34 จะถูกเปิดใช้งาน โดยที่ไบต์แรกของสคริปต์ที่ Sigs ใช้นั้นบังเอิญตรงกับความสูงของบล็อกที่ถูกต้องในอนาคต แม้ว่า BIP34 จะแก้ไขปัญหานี้ได้ในเกือบทุกกรณี แต่ก็ไม่ใช่การแก้ไขที่สมบูรณ์ 100% ในปี 2018 นักพัฒนา Bitcoin ชื่อ John Newbery ได้พิมพ์รายการทั้งหมดของสิ่งที่อาจซ้ำกันได้ดังที่แสดงไว้ในตารางด้านล่าง


* หมายเหตุ: บล็อคเหล่านี้สร้างธุรกรรม Coinbase ในปี 2012 และ 2017 และไม่ซ้ำกัน 209,921 บล็อก (เหลือเพียง 79 บล็อกจากการแบ่งครึ่งแรก) ไม่สามารถซ้ำกันได้เนื่องจาก BIP30 ได้ถูกนำไปใช้ในระหว่างนี้
ที่มา: https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
จำนวนธุรกรรม Coinbase ที่อาจเกิดซ้ำกันในแต่ละปี

ที่มา: https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
ดังนั้น บล็อกถัดไปที่อาจเกิดธุรกรรมซ้ำซ้อนได้คือ บล็อก 1,983,702 ซึ่งจะสร้างขึ้นในราวๆ มกราคม 2046 ธุรกรรม Coinbase ในบล็อก 164,384 ในเดือนมกราคม 2012 ส่ง 170 BTC ไปยังที่อยู่เอาต์พุตที่แตกต่างกันเจ็ดแห่ง ดังนั้น หากนักขุดในปี 2046 ต้องการโจมตีครั้งนี้ พวกเขาไม่เพียงแค่ต้องโชคดีพอที่จะพบบล็อกนี้เท่านั้น แต่ยังต้องเสียค่าธรรมเนียมน้อยกว่า 170 BTC ด้วย ซึ่งมีค่าใช้จ่ายทั้งหมดกว่า 170 BTC เล็กน้อย รวมถึงต้นทุนโอกาสของการอุดหนุนบล็อกจำนวน 0.09765625 BTC อีกด้วย
ด้วยราคา Bitcoin ในปัจจุบันที่ 88,500 ดอลลาร์ นั่นจะทำให้มีมูลค่ามากกว่า 15 ล้านดอลลาร์ สำหรับใครเป็นเจ้าของที่อยู่ทั้งเจ็ดแห่งของธุรกรรมห้องสมุดเหรียญในปี 2012 นั้น ยังคงไม่ทราบแน่ชัด และมีแนวโน้มว่ากุญแจอาจสูญหายไป ปัจจุบันมีการใช้ที่อยู่เอาท์พุตทั้งเจ็ดแห่งของธุรกรรม Coinbase ทั้งหมดแล้ว โดยสามแห่งนั้นใช้ในธุรกรรมเดียวกัน เราเชื่อว่ากองทุนเหล่านี้อาจเกี่ยวข้องกับโครงการ Ponzi Pirate40 แต่ทั้งหมดนี้เป็นเพียงการคาดเดาของเราเท่านั้น เป็นผลให้การโจมตีนั้นดูเหมือนจะไม่เพียงแต่มีค่าใช้จ่ายสูงเท่านั้น แต่ยังแทบไม่มีประโยชน์ต่อผู้โจมตีอีกด้วย จะเป็นค่าใช้จ่ายที่ค่อนข้างมากในการลบโหนดเดือนพฤศจิกายน 2558 ออกจากเครือข่ายเมื่อ 31 ปีก่อนด้วยวิธีฮาร์ดฟอร์ก
บล็อกที่เสี่ยงต่อการถูกคัดลอกถัดไปคือ 169985 ในเดือนมีนาคม 2012 Coinbase นี้มีราคาเพียง 50 BTC กว่าเล็กน้อย น้อยกว่า 170 BTC มาก แน่นอนว่า 50 BTC คือเงินอุดหนุนในขณะนั้น และเมื่อธุรกรรม Coinbase นี้ทำซ้ำได้อย่างง่ายดายในปี 2078 เงินอุดหนุนจะลดลงมาก ดังนั้นเพื่อใช้ประโยชน์จากสิ่งนี้ ผู้ขุดจะต้องเสียค่าธรรมเนียมไปประมาณ 50 BTC ซึ่งพวกเขาไม่สามารถเอากลับคืนมาได้เพราะจะต้องส่งไปยังแหล่งผลิตเดิมตั้งแต่ปี 2012 ไม่มีใครรู้ว่าราคาของ Bitcoin ในปี 2078 จะเป็นเท่าไร แต่ต้นทุนของการโจมตีดังกล่าวก็อาจสูงเกินไปเช่นกัน ดังนั้น ปัญหานี้อาจไม่ใช่ความเสี่ยงที่สำคัญสำหรับ Bitcoin แต่มันก็ยังคงเป็นข้อกังวลอยู่
นับตั้งแต่การอัปเกรด SegWit ในปี 2017 ธุรกรรมของ Coinbase ก็สามารถมีการมุ่งมั่นต่อธุรกรรมทั้งหมดในบล็อกได้เช่นกัน บล็อคก่อน BIP34 เหล่านี้ไม่มีคำมั่นสัญญาจากพยาน ดังนั้น เพื่อจะสร้างธุรกรรม coinbase ซ้ำ นักขุดจะต้องแยกธุรกรรมการแลกรับเอาท์พุต SegWit ใดๆ ออกจากบล็อก ทำให้ต้นทุนโอกาสของการโจมตีเพิ่มสูงขึ้น เนื่องจากบล็อกอาจไม่รวมธุรกรรมอื่นๆ อีกมากที่ต้องเสียค่าธรรมเนียม
สรุปแล้ว
เมื่อพิจารณาถึงความยากลำบากและต้นทุนในการคัดลอกการซื้อขาย รวมถึงโอกาสในการใช้ประโยชน์จากมันซึ่งมีอยู่น้อย ดังนั้นช่องโหว่ในการคัดลอกการซื้อขายนี้จึงไม่ถือเป็นปัญหาความปลอดภัยที่สำคัญสำหรับ Bitcoin อย่างไรก็ตาม เป็นเรื่องที่น่าสนใจที่จะคิดถึงเรื่องนี้ เนื่องมาจากระยะเวลาที่เกี่ยวข้อง และความแปลกใหม่ของการทำธุรกรรมที่เกิดซ้ำ อย่างไรก็ตาม นักพัฒนาซอฟต์แวร์ได้ทุ่มเทเวลาอย่างมากกับปัญหานี้ตลอดหลายปีที่ผ่านมา และวันที่ 2046 อาจเป็นกำหนดเส้นตายสำหรับการแก้ไขปัญหานี้ในความคิดของนักพัฒนาซอฟต์แวร์บางคน มีหลายวิธีในการแก้ไขข้อบกพร่องนี้ และอาจจำเป็นต้องใช้ซอฟต์ฟอร์ก วิธีแก้ปัญหาที่เป็นไปได้วิธีหนึ่งคือการบังคับใช้การมุ่งมั่น SegWit
ความคิดเห็นทั้งหมด