สัญญาอัจฉริยะและการระเบิดของ DAO

โหนดต้นทาง: 1575999

การผสมผสานที่น่าเศร้าของข้อบกพร่องที่หลีกเลี่ยงไม่ได้และรหัสที่ไม่เปลี่ยนรูป

สัปดาห์ที่แล้วเห็นเหตุการณ์ภัยพิบัติในระบบนิเวศ Ethereum เมื่อ DAOซึ่งเป็นสัญญาอัจฉริยะที่มีอายุน้อยกว่าสองเดือน เริ่มรั่วไหลอย่างรวดเร็วไปยังฝ่ายที่ไม่รู้จัก มองไปที่ ชุดปัจจุบัน ของสัญญา Ethereum ที่เต็มไปด้วยคาสิโนและแผนการ Ponzi ที่ประกาศตัวเอง อาจดูเหมือนไม่ใช่เรื่องใหญ่ นั่นคือ จนกว่าคุณจะรู้ว่าอีเธอร์มากกว่า 12 ล้านหน่วย สกุลเงินดิจิทัล Ethereum ถูกลงทุนใน DAO โดยเกือบ 20,000 คน นั่นคือประมาณ 15% ของอีเธอร์ทั้งหมดที่มีอยู่ ซึ่งมีมูลค่ามากกว่า 250 ล้านดอลลาร์ในวันที่ 17 มิถุนายน

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

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

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

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

ระบาย DAO

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

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

สมมติว่าสัญญาอัจฉริยะถือเงินในนามของผู้ใช้จำนวนหนึ่ง และอนุญาตให้ผู้ใช้เหล่านั้นถอนเงินตามคำขอได้ ตรรกะสำหรับกระบวนการอาจมีลักษณะดังนี้:

  1. รอผู้ใช้เพื่อขอถอนเงิน
  2. ตรวจสอบว่ายอดเงินคงเหลือของผู้ใช้เพียงพอหรือไม่
  3. ถ้าใช่ ให้ส่งปริมาณที่ร้องขอไปยังที่อยู่ของผู้ใช้
  4. ตรวจสอบว่าการชำระเงินสำเร็จ
  5. ถ้าใช่ ให้หักปริมาณออกจากยอดเงินคงเหลือของผู้ใช้

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

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

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

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

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

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

ปัญหาเกี่ยวกับรหัส

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

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

เพื่อความชัดเจน ฉันไม่ได้พูดถึงเรื่องโง่ๆ ที่มีชื่อเช่น "off-by-one", "uninitialized variable" และ "operator precedence" สิ่งเหล่านี้มักทำให้เกิดความล้มเหลวที่มองเห็นได้ในครั้งแรกที่รันโปรแกรม และสามารถตรวจพบได้ง่ายโดยการตรวจสอบชิ้นส่วนของโค้ดในเครื่องที่โปรแกรมนั้นอาศัยอยู่ และฉันไม่ได้พูดถึงช่องโหว่ด้านความปลอดภัยเช่น "อินพุตที่ไม่ผ่านการตรวจสอบ", "การฉีด SQL" และ "บัฟเฟอร์โอเวอร์โฟลว์" ซึ่งอาจไม่ปรากฏในการใช้งานปกติของโปรแกรม แต่ควรคำนึงถึงนักพัฒนาที่มีประสบการณ์ทุกคน

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

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

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

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

การพัฒนาซอฟต์แวร์ในปัจจุบันมีข้อยกเว้นบางประการ เนื่องจากเป็นวิธีที่มีประสิทธิภาพที่สุดในการสร้างผลิตภัณฑ์ที่โดดเด่น แน่นอน ทีมซอฟต์แวร์ที่ดีจะพัฒนาชุดทดสอบภายในที่ครอบคลุม เพื่อตรวจจับข้อผิดพลาดให้ได้มากที่สุดก่อนที่จะถึงผู้ใช้ และทำให้แน่ใจว่าเวอร์ชันใหม่จะไม่ทำลายสิ่งที่เคยทำงานมาก่อน แต่พวกเราส่วนใหญ่ยังต้องพึ่งพาฐานผู้ใช้ของเรา เพราะไม่มีทางที่เราจะสามารถจินตนาการและทดสอบทุกวิถีทางที่เป็นไปได้ในการใช้ผลิตภัณฑ์ของเรา และถ้าคุณคิดว่าสิ่งนี้ใช้ไม่ได้กับคนตัวใหญ่ คุณก็ไม่ผิดหรอก มีการดาวน์โหลด “การอัปเดตอัตโนมัติ” ไปยังระบบ Windows, Mac หรือ Linux ของคุณกี่ครั้งในปีที่ผ่านมา และหากคุณใช้ Chrome หรือ Firefox ตอนนี้เว็บเบราว์เซอร์ของคุณจะอัปเดตตัวเองโดยอัตโนมัติและเงียบ โดยเฉลี่ยเดือนละครั้ง

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

บนรหัสที่ไม่เปลี่ยนรูป

ดังนั้น เราจึงมาถึงปัญหาพื้นฐานของสัญญาอัจฉริยะดังที่แสดงไว้อย่างชัดเจนโดย DAO:

ตามการออกแบบ สัญญาอัจฉริยะจะฝังอยู่ในบล็อกเชนอย่างไม่เปลี่ยนแปลง ดังนั้นจึงไม่สามารถอัปเดตได้ สิ่งนี้จะป้องกันไม่ให้ครบกำหนด

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

สำหรับนักพัฒนาซอฟต์แวร์ยุคใหม่ โค้ดที่แก้ไขไม่ได้คือฝันร้ายที่ไม่เคยเกิดขึ้นมาก่อน ซึ่งทำให้แถบนั้นสูงกว่าที่คนส่วนใหญ่จะเข้าถึงได้ แต่เราพบโค้ดประเภทนี้ในบางสถานการณ์ เช่น การออกแบบไมโครโปรเซสเซอร์ซึ่งเป็นหัวใจสำคัญของคอมพิวเตอร์และสมาร์ทโฟนทุกเครื่อง รหัสนี้เขียนในภาษาเช่น Verilog และ วีเอชดีแอลกำหนดโครงร่างทางกายภาพของชิปซิลิกอนซึ่งไม่สามารถเปลี่ยนแปลงได้เมื่อผลิตแล้ว ในสถานการณ์เช่นนี้ เรามักจะเห็นลักษณะเด่นหลายประการ: (ก) รหัสถูกเขียนด้วยภาษาที่ออกแบบมาโดยคำนึงถึงความปลอดภัย (ข) ผู้คนจำนวนมากทำงานเป็นเวลาหลายปี (ค) เป็นหัวข้อ ไปจนถึงการทดสอบอัตโนมัติอย่างครอบคลุมและการตรวจสอบอย่างเป็นทางการ และ (d) หากผลิตภัณฑ์ขั้นสุดท้ายถูกส่งโดยมีข้อบกพร่อง ค่าใช้จ่ายในการเรียกคืนจะตกอยู่ที่ไหล่ของฝ่ายที่รับผิดชอบ (ดูตัวอย่างที่น่าอับอาย เพนเทียมบั๊ก).

มันไปโดยไม่บอกว่าสิ่งนี้ไม่มีผลบังคับใช้กับผู้สร้าง The DAO หรือสัญญาอัจฉริยะอื่น ๆ แต่การไม่เปลี่ยนรหัสไม่ได้เป็นเพียงความท้าทายสำหรับนักพัฒนาสัญญาอัจฉริยะเท่านั้น มีปัจจัยอื่นๆ อีกหลายประการที่ทำให้ Ethereum เป็นอันตรายมากกว่าสภาพแวดล้อมคอมพิวเตอร์ส่วนใหญ่:

  • ตามที่กล่าวไว้ก่อนหน้านี้ สัญญาส่วนใหญ่เปิดเผยซอร์สโค้ดเพื่อให้ได้รับความไว้วางใจจากผู้ใช้ที่มีศักยภาพ ทำให้สามารถค้นหาและใช้ประโยชน์จากจุดบกพร่องได้ง่าย แม้ว่ารหัสปกติจะสามารถแก้ไขได้เมื่อพบปัญหา แต่ด้วยรหัสที่ไม่เปลี่ยนรูปแบบมีแต่ผู้โจมตีเท่านั้นที่จะได้รับประโยชน์
  • ในภาษาการเขียนโปรแกรมส่วนใหญ่ "ฟังก์ชัน" (ชิ้นส่วนของโค้ด) หนึ่งตัวในบล็อกเชนสามารถ "เรียก" (เรียก) อีกฟังก์ชันหนึ่งเพื่อสร้างเอฟเฟกต์แบบเรียงซ้อน อย่างไรก็ตาม Ethereum นั้นผิดปกติในการเปิดใช้งานการเรียกใช้ฟังก์ชันโดยตรงระหว่างโค้ดที่เขียนโดยบุคคลที่ไม่รู้จักกันและอาจมีผลประโยชน์ขัดแย้งกัน นี่เป็นสูตรที่สมบูรณ์แบบสำหรับพฤติกรรมที่เป็นปฏิปักษ์และไม่คาดคิด
  • ดังที่ได้กล่าวไว้ก่อนหน้านี้ หากสัญญา Ethereum หนึ่งส่งเงินไปยังอีกสัญญาหนึ่ง สัญญาหลังมีโอกาสที่จะรันโค้ดบางส่วนเพื่อตอบกลับ รหัสนี้สามารถออกแบบโดยเจตนาเพื่อทำให้การดำเนินการส่งล้มเหลว ที่อาจก่อให้เกิด ความหายนะต่อไปทุกประเภท
  • เมื่อฟังก์ชันหนึ่งเรียกใช้ฟังก์ชันอื่น และฟังก์ชันที่สองเรียกใช้ฟังก์ชันที่สาม ระบบจะสร้าง "สแต็ก" ของการโทรและการโทรย่อย การติดตามสแต็กนี้มีค่าใช้จ่ายในการคำนวณ ดังนั้น Ethereum จึงมี “ขีดจำกัดสแต็กการโทร” ซึ่งจำกัดความลึกที่สามารถไปได้ นี้เป็นธรรมเพียงพอ แต่ถ้าถึงขีดจำกัดโดยการเรียกใช้ฟังก์ชันเฉพาะ สภาพแวดล้อม Ethereum เงียบ ข้ามการโทรนั้น แทนที่จะยุติธุรกรรมทั้งหมดอย่างปลอดภัยและคลายผลกระทบ กล่าวอีกนัยหนึ่งคือบางรหัสในสัญญาที่ชาญฉลาด อาจจะไม่ถูกประหารชีวิตและการไม่ดำเนินการนี้อาจเกิดจากการจงใจเรียกใช้สัญญานั้นจากสแต็กที่ลึกเพียงพอ สิ่งนี้ทำให้ฉันรู้สึกว่าเป็นตัวเลือกการออกแบบที่น่ารังเกียจอย่างแท้จริง ทำลายรูปแบบทางจิตที่นักพัฒนาซอฟต์แวร์ทุกคนคุ้นเคย ใครที่ตัดสินใจแบบนี้คงจะ น่า ถูกลากไปเหนือถ่านแม้ว่าขณะนี้มี a แนะนำให้เปลี่ยน.
  • Ethereum ยังมี “ขีดจำกัดก๊าซ” ซึ่งป้องกันการละเมิดในบล็อคเชนสาธารณะโดยทำธุรกรรมจ่ายสำหรับทรัพยากรการคำนวณที่พวกเขาใช้ ผู้ส่งธุรกรรมเป็นผู้ตัดสินใจว่ายินดีจ่ายน้ำมันเป็นจำนวนเท่าใด และหากสิ่งนี้หมดก่อนที่ธุรกรรมจะเสร็จสิ้น ก็จะถูกยกเลิกอย่างปลอดภัย แม้ว่านี่อาจเป็นทางออกที่ดีที่สุดสำหรับปัญหาที่ยาก แต่ก็สามารถส่งผลที่ไม่พึงประสงค์ได้ สัญญาบางฉบับต้องการน้ำมันมากกว่าที่คาดการณ์ไว้ ในขณะที่สัญญาอื่นๆ ไม่สามารถวิ่งได้เลย.
  • การเข้ารหัสลับของเครือข่าย Ethereum สาธารณะช่วยให้ข้อบกพร่องในสัญญาอัจฉริยะส่งเงินจริงไปยังที่ที่ไม่ถูกต้อง โดยไม่มีวิธีการกู้คืนที่ง่าย ในขณะที่ผู้ขุด Ethereum ดูเหมือนจะเป็น โหวตให้ ของ "soft fork" เพื่อหยุดเงินทุนที่ระบายออกจาก DAO นี่ไม่ใช่วิธีแก้ปัญหาที่ยั่งยืน

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

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

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

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

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

ทางข้างหน้าของ Ethereum

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

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

  • ส่งข้อความที่ชัดเจนว่า อย่างน้อยในอีกสองปีข้างหน้า ไม่มีใครควรส่งเงินใดๆ ให้กับสัญญาที่ชาญฉลาด เว้นแต่ว่าพวกเขายินดีที่จะสูญเสียพวกเขาไปในนามของการศึกษาด้วยตนเอง
  • แก้ไขปัญหาที่เห็นได้ชัดบางอย่างกับ Ethereum Virtual Machine (“EVM”) กล่าวคือ: (a) ลบ call stack limit (b) ให้วิธีการส่ง ether โดยไม่เรียกใช้โค้ด และ (c) อนุญาตให้มีการทำเครื่องหมายสัญญาเป็น “ non-reentrant” หมายความว่าไม่สามารถเรียกหน้าที่ของตนได้ในขณะที่อยู่ตรงกลางของบางสิ่ง
  • พัฒนาภาษาการเขียนโปรแกรมใหม่สำหรับสัญญาอัจฉริยะซึ่งใช้วิธีการที่เข้มงวดมากขึ้นในการแสดงการคำนวณที่คล้อยตาม หลักฐานอย่างเป็นทางการของความถูกต้อง. ทศวรรษของการวิจัยได้รับการลงทุนในด้านนี้แล้ว ดังนั้นจึงมีงานที่มีอยู่อีกมากที่จะยกระดับ (ซึ่งไม่จำเป็นต้องเปลี่ยนแปลง EVM เอง เนื่องจากภาษาที่เลือกยังคงสามารถคอมไพล์เป็น “bytecode” ปกติได้)
  • สร้างชุดสัญญาอัจฉริยะที่ปลอดภัยและฟังก์ชันอย่างเป็นทางการ ซึ่งได้รับการตรวจสอบโดยผู้เชี่ยวชาญจนถึงขั้นเสียชีวิต และพิสูจน์แล้วว่าเชื่อถือได้ในสถานการณ์ต่างๆ มากมาย นี้คล้ายกับ ห้องสมุดมาตรฐาน ที่มีให้สำหรับภาษาโปรแกรมสำหรับผู้ใหญ่จำนวนมาก (แม้ว่า ณ จุดนี้จะน่าดึงดูดใจที่จะถาม: ทำไมไม่เพียงแค่ฮาร์ดโค้ดการทำงานของไลบรารีเหล่านี้ลงใน EVM และได้ประสิทธิภาพที่ดีขึ้นมาก คำตอบ: เนื่องจาก Ethereum ได้รับการออกแบบมาโดยเฉพาะเพื่อย้ายออกจากบล็อคเชนที่มีฮาร์ดโค้ด ชุดคุณลักษณะ แต่ก็ยังทำให้คุณสงสัย)

ตัวเลือกปัจจุบันของการแทรกแซงด้วยตนเองเพื่อตอบสนองต่อความล้มเหลวของสัญญาอัจฉริยะบางรายการจะไม่สามารถใช้งานได้ในวงกว้างหาก Ethereum จะต้องรักษาเอกลักษณ์ของตนในฐานะแพลตฟอร์มการประมวลผลที่ไม่น่าเชื่อถือและกระจายอำนาจ อันที่จริง มีบางกรณีที่น่าเชื่อถือว่าการกำกับดูแลตามวิจารณญาณเดียวนี้ได้เกิดขึ้นแล้ว ทำลายชื่อเสียงของ Ethereum. และเราควรสังเกตว่า The DAO's ข้อกำหนดและเงื่อนไข ระบุอย่างชัดเจนว่าไม่มีสิ่งใด "อาจแก้ไขหรือเพิ่มภาระผูกพันหรือการรับประกันเพิ่มเติมนอกเหนือจากที่กำหนดไว้ในรหัสของ DAO" กล่าวอีกนัยหนึ่งใครก็ตามที่ทำให้ DAO ระบายออกได้ปฏิบัติตามข้อกำหนดที่เผยแพร่และดังนั้นจึงน่าจะอยู่ทางด้านขวาของกฎหมาย

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

ในระหว่างนี้ สำหรับผู้ใช้บล็อคเชนส่วนตัว ฉันสามารถพูดซ้ำได้เฉพาะสิ่งที่ฉันพูดก่อนหน้านี้:

หากแอปพลิเคชันของคุณไม่ต้องการสัญญาอัจฉริยะ ให้ใช้สถาปัตยกรรมบล็อกเชนที่ง่ายกว่า

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

กรุณาโพสต์ความคิดเห็นใด ๆ ใน LinkedIn.

ประทับเวลา:

เพิ่มเติมจาก มัลติเชน