ใครเป็นผู้ควบคุม Bitcoin ใช่คุณหรือเปล่า? หรือกระเป๋าสตางค์? การวิเคราะห์ที่อยู่ BTC และหลักการท
ข้อความ
หมายเหตุบรรณาธิการ: บทความนี้มาจาก Ambi Lab ผู้เขียน: Ambi Lab และเผยแพร่โดยได้รับอนุญาต
ที่อยู่ Bitcoin มีที่อยู่ที่ขึ้นต้นด้วย 1 และที่อยู่ที่ขึ้นต้นด้วย 3 มีความแตกต่างระหว่างทั้งสองหรือไม่?
bitcoins ในที่อยู่จะถูกล็อคภายใต้สถานการณ์ใด
ใครกันแน่ที่เป็นผู้ควบคุม Bitcoin คุณล่ะ? หรือกระเป๋าสตางค์ของคุณ?
หากคุณใช้กระเป๋าเงิน Bitcoin และไม่สามารถตอบคำถามสามข้อข้างต้นได้ บทความนี้เหมาะสำหรับคุณ
เมื่อห้องปฏิบัติการ SECBIT ตรวจสอบซอร์สโค้ดของกระเป๋าเงินดิจิทัล พบว่าไลบรารีโอเพ่นซอร์สกระเป๋าเงิน bitcoin ที่เรียกว่า pywallet มีข้อบกพร่องร้ายแรง หากคุณโอนไปยังที่อยู่รับ OmniLayer ที่สร้างโดย pywallet ทรัพย์สินจะหายไปอย่างถาวร
จากข้อมูลของ zer0to0ne ผู้เชี่ยวชาญด้านเทคโนโลยีบล็อกเชนที่ห้องปฏิบัติการ SECBIT โปรโตคอล OmniLayer ช่วยให้สามารถออกสินทรัพย์แบบกำหนดเอง (เช่น USDT) บนบล็อกเชน Bitcoin ได้ สาระสำคัญของการทำธุรกรรมสินทรัพย์ OmniLayer คือการทำธุรกรรม bitcoin มีฐานรหัสมากมายสำหรับการทำธุรกรรม bitcoin และ pywallet เป็นหนึ่งในนั้น สามารถสร้างธุรกรรม Bitcoin ที่สอดคล้องกับรูปแบบ OmniLayer ได้อย่างสะดวก ในปัจจุบัน pywallet ถูกนำไปใช้ในซอฟต์แวร์กระเป๋าเงินดิจิตอลบางตัว
อย่างไรก็ตาม เมื่อ pywallet ของไลบรารีโอเพ่นซอร์สสร้างที่อยู่กระเป๋าเงิน OmniLayer มันกลับคำนำหน้าที่อยู่โดยไม่ได้ตั้งใจ และทรัพย์สินหลายอย่างถูกล็อกด้วยที่อยู่ไม่ถูกต้อง!

ต่อไปนี้เป็นภาพหน้าจอของรหัสข้อผิดพลาดที่เกี่ยวข้องกับ pywallet:https://github.com/ranaroussi/pywallet/commit/eb784ea4dd62fe2a50e1352e7d24438fc66a4ac0#diff-ca3a8be6f2ab4be3bfd69a49f5f4122a
ที่อยู่ไฟล์:
เข้าคิวและทำให้วิทยาศาสตร์เป็นที่นิยม: มีที่อยู่ทั่วไปสามประเภทในเครือข่าย Bitcoin: ที่อยู่คีย์สาธารณะทั่วไป (ที่อยู่ 1 ที่อยู่), ที่อยู่แฮชสคริปต์ (ที่อยู่ 3 แห่ง) และที่อยู่พยานแยก (ที่อยู่ bc1) คำนำหน้าเป็น แยกแยะ. ในหมู่พวกเขา คำนำหน้าของที่อยู่ 1 รายการคือ 0x00 และคำนำหน้าของที่อยู่ 3 รายการคือ 0x05
• 1-Address: นี่คือที่อยู่ Bitcoin ที่พบมากที่สุด ซึ่งโดยปกติจะใช้สำหรับการโอนและการชำระเงินทั่วไป 1- ที่อยู่คือการเข้ารหัสของแฮชคีย์สาธารณะ หลังจากตรวจสอบลายเซ็นของ 1-address แล้ว จะสามารถปลดล็อกการชำระเงินได้
• 3-Address: ที่อยู่นี้เป็นที่อยู่แฮชของสคริปต์ ที่อยู่ประเภทนี้สอดคล้องกับรหัสของแฮชสคริปต์ Bitcoin
• ที่อยู่ bc1: ที่อยู่เข้ารหัส bech32 ใช้สำหรับการทำธุรกรรมของพยานที่แยกจากกัน
pywallet ของไลบรารีโอเพ่นซอร์สย้อนกลับคำนำหน้าที่อยู่ การตั้งค่า 1 ที่อยู่เป็น 3 ที่อยู่ไม่ถูกต้อง ดังนั้น ทรัพย์สินที่เดิมทีตั้งใจจะโอนไปยังที่อยู่ 1 จะถูกโอนไปยังที่อยู่ 3 อย่างผิดพลาด เมื่อเจ้าของบัญชีใช้วิธีการยืนยัน 1 ที่อยู่ นั่นคือลายเซ็นคีย์ส่วนตัวเพื่อถอนสินทรัพย์ เครือข่ายบล็อกเชนจะใช้สคริปต์การดำเนินการ 3 ที่อยู่เพื่อทำการตรวจสอบ ส่งผลให้ผู้ใช้ไม่สามารถถอนสินทรัพย์ได้ตามปกติ!
โปรดใช้ไลบรารีโอเพ่นซอร์ส pywallet ด้วยความระมัดระวัง! !
ข้อเท็จจริง: Bitcoin ไม่เคยใช้ฟังก์ชันการโอนเงินจริงๆ
สิ่งนี้เหนือความคาดหมายของหลาย ๆ คน เนื่องจากการใช้งาน Bitcoin นั้นขึ้นอยู่กับรูปแบบ UTXO ซึ่งแตกต่างจากรูปแบบบัญชีที่เราเข้าใจโดยสัญชาตญาณ zer0to0ne อธิบายว่า จริง ๆ แล้ว Bitcoin ไม่เคยใช้ฟังก์ชั่นการถ่ายโอนจริง ๆ ในแง่ปกติ Satoshi Nakamoto ออกแบบเฉพาะชุดตัวดำเนินการสคริปต์ Bitcoin และตัวดำเนินการสคริปต์ Bitcoin สำหรับ Bitcoin และกระบวนการถ่ายโอนที่เรียกว่าจริง ๆ แล้วจำลองโดยกระบวนการล็อคและปลดล็อคสคริปต์ Bitcoin สิ่งนี้แตกต่างจากแนวคิดบัญชีแยกประเภท (หรือรูปแบบบัญชี) ในชีวิตประจำวัน
เพื่อความเข้าใจง่าย เราสามารถเปรียบเทียบการทำธุรกรรมสินทรัพย์บนบล็อคเชน Bitcoin กับการล็อคสินทรัพย์ในตู้นิรภัย และเฉพาะผู้ที่ถือกุญแจตู้เซฟ (นั่นคือผู้รับเงิน) เท่านั้นที่สามารถนำสินทรัพย์ออกจากตู้นิรภัยสำหรับการทำธุรกรรมได้ ตัวอย่างเช่น หากอลิซต้องการจ่ายเงินให้กับบ๊อบ อลิซจะล็อกทรัพย์สินไว้ในตู้เซฟ และมีเพียงบ็อบเท่านั้นที่มีกุญแจไขตู้เซฟ นั่นคือมีเพียงบ๊อบเท่านั้นที่สามารถนำทรัพย์สินออกมาได้ หาก Bob ต้องการนำทรัพย์สินออก Bob ต้องใช้ทรัพย์สินในเวลาเดียวกัน (นั่นคือ ล็อกไว้ในตู้เซฟอื่น) ก่อนที่ Bob จะนำทรัพย์สินออกไป ทรัพย์สินนั้นไม่ได้เป็นของ Bob จริงๆ ลองนึกภาพว่าถ้า Bob ทำกุญแจหาย ก็จะไม่สามารถถอนทรัพย์สินได้อีกต่อไป กล่าวอีกนัยหนึ่ง เมื่อทรัพย์สินยังคงอยู่ในตู้นิรภัย ทรัพย์สินนั้นไม่ได้เป็นของอลิซหรือของบ็อบโดยสิ้นเชิง แน่นอน อลิซยังสามารถใส่สินทรัพย์ในตู้นิรภัยที่ทุกคนสามารถเปิดได้ ซึ่งเรียกอีกอย่างว่าธุรกรรมที่ใครๆ ก็ใช้จ่ายได้
เนื่องจากที่อยู่ที่รับต่างกันบนบล็อกเชน Bitcoin จึงมีตู้เซฟประเภทต่างๆ ตู้เซฟประเภทต่าง ๆ ต้องใช้กุญแจประเภทต่าง ๆ ในการเปิด ผู้จ่ายเงินปรับแต่งตู้เซฟสำหรับผู้รับเงิน ใส่ทรัพย์สินในตู้เซฟและล็อค จากนั้นจึงโยนตู้เซฟในที่สาธารณะ มีสองวิธีในการเปิดตู้เซฟ:
• หากผู้รับเงินเป็น 1 ที่อยู่ เราจะเรียกตู้เซฟว่า ตู้เซฟ 1 ประเภท คีย์ที่เกี่ยวข้องจะต้องเป็นคีย์ส่วนตัวที่ตรงกับที่อยู่ผู้รับที่กำหนดไว้ ขั้นตอนการปลดล็อกตู้เซฟคือการตรวจสอบรหัสสาธารณะ 1 ที่อยู่และลายเซ็นดิจิทัลที่ตรงกับรหัสสาธารณะ นอกจากนี้ นี่เป็นกระบวนการตรวจสอบที่เรามักเข้าใจกันสำหรับการโอนเงินไปยังที่อยู่บัญชีธรรมดา
• หากผู้รับเงินมีที่อยู่ 3 แบบ เราเรียกว่าตู้เซฟ 3 แบบ รหัสปลดล็อคต้องเป็นสคริปต์ Bitcoin ที่เรียกใช้งานได้ ขั้นตอนการปลดล็อกตู้เซฟคือ: ค่าแฮชของสคริปต์ Bitcoin ตรงกับที่อยู่ 3 รายการ และตัวเรียกใช้สคริปต์ Bitcoin ส่งคืนสำเร็จหลังจากเรียกใช้สคริปต์ กล่าวคือ เฉพาะผู้ที่มีสคริปต์ต้นฉบับและสามารถดำเนินการได้สำเร็จเท่านั้นที่จะสามารถแยกสินทรัพย์ในตู้นิรภัยนี้ได้
กลับไปที่คำถามในส่วนนี้: เหตุใดจึงกล่าวว่า Bitcoin ไม่เคยตระหนักถึงฟังก์ชันการถ่ายโอนในความหมายที่แท้จริง คำตอบนั้นง่าย เนื่องจากแนวคิดของบัญชีไม่มีอยู่ในระบบ Bitcoin และการโอนระหว่างบัญชีก็หมดปัญหา ยังไม่ทราบจำนวนตู้เซฟที่สามารถเปิดได้ในอนาคต
จากคำอธิบายข้างต้น เราจะเห็นว่าเมื่อไลบรารีโอเพ่นซอร์สของ pywallet เข้าใจผิดว่า 1-address เป็น 3-address มันเหมือนกับการเปลี่ยนเซฟ 1-type เดิมเป็น 3-type safe และเจ้าของบัญชียังคงถือครองอยู่ 1 - เพื่อไขกุญแจตู้เซฟ จะไม่สามารถเปิดตู้เซฟได้ สินทรัพย์ดิจิทัลของ OmniLayer ที่ถูกล็อกโดย zer0to0ne โดยไม่ตั้งใจจะสามารถกู้คืนได้หรือไม่
มีความเป็นไปได้ที่จะใช้รหัสที่อยู่ 1 เพื่อเปิดตู้เซฟ 3 ตู้หรือไม่?
จากนั้น zer0to0ne ได้อธิบายให้เราเข้าใจถึงแนวคิดที่สำคัญสองประการ ได้แก่ P2PKH (Pay to Public Key Hash) และ P2SH (Pay to Script Hash) คำนามทั้งสองนี้แสดงถึงธุรกรรม Bitcoin สองประเภทที่แตกต่างกัน
ต่อไปนี้คือการวิเคราะห์รายละเอียดทางเทคนิคที่ยอดเยี่ยมของ zer0to0ne
P2PKH - สิ่งประดิษฐ์ที่ยิ่งใหญ่ของ Satoshi Nakamoto
Base58(0x00 +
Pay to Public Key Hash ตามชื่อคือใส่ Bitcoin ลงในตู้เซฟ และรูกุญแจคือแฮชคีย์สาธารณะ (Public Key Hash) ที่อยู่ 1 ที่พบมากที่สุดที่เราเห็นคือการเข้ารหัสแฮชคีย์สาธารณะเป็นหลัก 1- กระบวนการสร้างที่อยู่นั้นง่ายมาก คีย์สาธารณะคำนวณผ่าน Hash160 เพื่อรับแฮชคีย์สาธารณะ คำนำหน้า 0x00 จะถูกเพิ่มที่ส่วนหัวของแฮชคีย์สาธารณะ เช็คซัมจะถูกเพิ่มที่ส่วนท้ายของแฮช และ Bitcoin ที่จุดเริ่มต้นของ 1 ได้มาจากที่อยู่ Base58
มาดูขั้นตอนการก่อสร้างที่ปลอดภัยของธุรกรรมประเภท P2PKH กันดีกว่า Alice ส่ง Bitcoin ให้ Bob เป็นตัวอย่าง:
OP_DUP
OP_HASH160
Payer Alice ต้องตั้งค่าสคริปต์การล็อกเมื่อสร้างตู้นิรภัย:
OP_EQUALVERIFY
OP_CHECKSIG
(แฮชคีย์สาธารณะอยู่ในที่อยู่ผู้รับของ Bob)
หมายเหตุ: เราสามารถเข้าใจขั้นตอนนี้ได้เมื่ออลิซปรับแต่งตู้เซฟสำหรับบ็อบ ใส่บิตคอยน์ในตู้เซฟและล็อคด้วยคีย์สาธารณะ PubKey Hash ของบ็อบ ตอนนี้ไม่มีใครสามารถเปิดล็อคนี้ได้ยกเว้น Bob ผู้ถือกุญแจส่วนตัว
เมื่อ Bob ต้องการใช้จ่าย bitcoins ที่ Alice ให้เขา เขาจำเป็นต้องระบุพารามิเตอร์ที่จำเป็น: ลายเซ็นธุรกรรม + กุญแจสาธารณะ (ศัพท์แสงทางเทคนิค: scriptSig) เพื่อเปิดตู้เซฟ เพื่อให้สคริปต์การล็อกคืนค่า True หลังจากดำเนินการ ขั้นตอนนี้มักจะเป็น ทำโดยอัตโนมัติโดยกระเป๋าเงิน

มาดูกันว่าโหนด Bitcoin ตรวจสอบความถูกต้องของ scriptSig ได้อย่างไร
(ภาพจาก Mastering Bitcoin)
ตัวดำเนินการสคริปต์ Bitcoin เริ่มต้นจากข้อมูล PUSH การดำเนินการ PUSH จะอ่านไบต์แรกเพื่อรับข้อมูลความยาวของข้อมูลที่จะถูกผลักเข้าไปในสแต็ก จากนั้น ดำเนินการต่อสคริปต์ Bitcoin จนกว่าการดำเนินการจะเสร็จสิ้นเพื่อตรวจสอบ ผลการดำเนินการ
การดำเนินการ CHECKSIG จะตรวจสอบความถูกต้องของลายเซ็นดิจิทัล เพื่อให้แน่ใจว่าผู้ลงนามมีคีย์ส่วนตัวที่ตรงกับที่อยู่
ไม่มีใครสามารถปลอมแปลงลายเซ็นดิจิทัลได้ยกเว้นผู้ที่ถือรหัสส่วนตัว จนถึงตอนนี้ การทำธุรกรรม Bitcoin P2PKH ได้เสร็จสิ้นลงอย่างปลอดภัยแล้ว
อธิบายอีกครั้ง: เมื่อ Bob ต้องการใช้บิตคอยน์ที่อลิซมอบให้ Bob สามารถเปิดตู้เซฟที่อลิซทิ้งไว้ด้วยรหัสที่ถูกต้องเท่านั้น และนำเงินไปใส่ในตู้นิรภัยที่สร้างขึ้นใหม่สำหรับ Bob
ในเวลานี้ ผู้อ่านที่ฉลาดบางคนจะสังเกตเห็นรายละเอียด: ถ้า Bob หยิบกุญแจออกมา คนขุดแร่คนใดก็ตามบนบล็อกเชนสามารถเห็นรูปร่างของกุญแจก่อนที่จะเปิดตู้เซฟ และในทางทฤษฎีแล้ว พวกเขาสามารถคัดลอกมันได้ทันที กุญแจสำหรับเปิดและใช้ของอลิซ ปลอดภัยต่อ Bob (รู้จักกันทั่วไปว่าเป็นการโจมตีแบบ Front-running) มันสามารถทำได้จริงหรือ? เห็นได้ชัดว่า Satoshi Nakamoto ได้พิจารณาเรื่องนี้แล้ว ลายเซ็นธุรกรรมในคีย์นี้เป็นลายเซ็นที่สมบูรณ์ของธุรกรรมที่เริ่มต้นโดย Bob สมมติว่า Bob ต้องการใส่ bitcoins ในตู้นิรภัยที่ Alice สร้างไว้ในตู้นิรภัยใหม่ (สำหรับ Charlie) ในเวลานี้ กุญแจที่ Bob นำเสนอมี Hash กุญแจสาธารณะของ Charlie แม้ว่าคนขุดแร่จะสามารถคัดลอกกุญแจของ Bob ได้ แต่กุญแจดังกล่าวก็คือกุญแจ ข้อมูลของตู้เซฟใหม่ถัดไปถูกซ่อนไว้ ดังนั้นนักขุดจึงไม่สามารถใช้คีย์ซ้ำนี้เพื่อดำเนินการอื่นๆ ให้เสร็จสิ้นได้ (ลายเซ็นดิจิทัลไม่สามารถยักยอกได้)
P2SH - นวัตกรรมที่สำคัญในยุคหลัง Satoshi
Satoshi Nakamoto ออกแบบระบบสคริปต์ที่ทรงพลังเช่นนี้ ดูเหมือนว่าจะสิ้นเปลืองเกินไปที่จะใช้เพื่อสร้างธุรกรรมการโอนเท่านั้น ให้เราลองสร้างสคริปต์การล็อกแบบพิเศษด้วยคำแนะนำอื่นๆ และใช้วิธีการอื่นๆ เพื่อปลดล็อก
OP_HASH160
OP_EQUAL
ตัวอย่างเช่น เราสามารถสร้างสคริปต์ที่ใช้รูปภาพล่วงหน้าแฮชเพื่อปลดล็อกธุรกรรม:
เมื่อตรงตามเงื่อนไขนี้ สคริปต์จะสามารถปลดล็อกได้สำเร็จ
เราต่อด้วยตัวอย่างตู้เซฟและให้ชื่อตู้เซฟประเภทนี้ว่าตู้เซฟ 3 ประเภท ตอนนี้ bitcoin ของ Alice ถึง Bob ถูกล็อคในที่ปลอดภัยซึ่งป้องกันโดย Hash160 ข้างต้น ขอเรียกมันว่าแฮชล็อค
ล็อคนี้ยังคงต้องใช้รูปร่างที่ถูกต้องในการเปิด แต่การรักษาความปลอดภัยอ่อนแอกว่ามาก การขาดกลไกลายเซ็นดิจิทัลทำให้ข้อมูลสำคัญที่ซ่อนอยู่ในกุญแจไม่เปลี่ยนแปลงกับตู้นิรภัยใหม่ของ Bob นักขุดคนใดก็ตามสามารถคัดลอกคีย์เดียวกันได้ทันทีที่ Bob แสดงคีย์ รีบเปิดตู้เซฟ (วิ่งนำหน้า) ที่ Alice ทิ้งไว้ให้ Bob และโอนเหรียญไปยังบุคคลอื่น Eve ดังนั้นเหรียญที่เป็น Bitcoins ของ Bob เดิม จะถูกปล้น
แม้ว่าสคริปต์นี้จะไม่ปลอดภัยมาก แต่ก็มีสองหน้าที่มหัศจรรย์มาก:
1. เอาต์พุตของโครงสร้างธุรกรรมสั้นพอ ซึ่งหมายความว่าพื้นที่ที่ถูกครอบครองโดยแคช UTXO ที่ดูแลโดยโหนด Bitcoin จะลดลงอย่างมาก
2. ภาพล่วงหน้าจะถูกอ้างอิงเป็นอินพุตเสมอเมื่อมีการใช้จ่ายในการทำธุรกรรมและจะไม่ปรากฏที่ด้านเอาต์พุตของการทำธุรกรรม UTXO ยังคงคล่องตัวและสามารถส่งต่อภาระค่าธรรมเนียมการจัดการไปยังผู้รับได้
เนื่องจากสคริปต์เอาต์พุตที่อธิบายมีประโยชน์มากมาย มีวิธีที่เราจะทำให้ธุรกรรมนี้ปลอดภัยหรือไม่ สิ่งนี้จำเป็นต้องพูดถึงว่า P2SH คืออะไร
Gavin Adresen ผู้พัฒนา Bitcoin Core เสนอเทคนิคที่เรียกว่า Pay to Script Hash (P2SH)