รวบรวมพลังของวิธีการที่เป็นทางการในเส้นทางการเขียนโค้ดของฉัน: ฉันจะเป็นผู้เผยแพร่ศาสนา Dafny ได้อย่างไร

บล็อก 1NewsDevelopersEnterpriseBlockchain ExplainedEvents and ConferencesPressจดหมายข่าว

สมัครรับจดหมายข่าวของเรา.

ที่อยู่อีเมล

เราเคารพความเป็นส่วนตัวของคุณ

หน้าแรก

รวบรวมพลังของวิธีการที่เป็นทางการในเส้นทางการเขียนโค้ดของฉัน: ฉันจะเป็นผู้เผยแพร่ศาสนา Dafny ได้อย่างไร

by ConsenSys ธันวาคม 22, 2020 โพสต์เมื่อธันวาคม 22, 2020

Screen Shot 2020 12 15 เวลา 6 46 32 น. 1

โดย Joanne Fuller

ฉันต้องการเริ่มต้นด้วยการบอกว่าฉันกำลังเขียนโพสต์บล็อกนี้โดยหวังว่าคนอื่นจะได้สัมผัสกับช่วงเวลาอันศักดิ์สิทธิ์ที่ฉันมีในขณะที่เรียนรู้ Dafny เป็นส่วนหนึ่งของการสำรวจของฉันใน วิธีการที่เป็นทางการ. นอกจากนี้ฉันหวังว่าโพสต์นี้จะเป็นตัวกระตุ้นให้ผู้อื่นพิจารณาวิธีการที่เป็นทางการเป็นทักษะที่สำคัญและจำเป็นในคลังแสงของทุกคนที่เขียนโค้ด เป็นส่วนหนึ่งของ ทีมตรวจสอบอัตโนมัติภายใน R&D ที่ ConsenSys, ฉันใช้ Dafny ในการตรวจสอบอย่างเป็นทางการของข้อมูลจำเพาะ Ethereum 2 Phase 0 และฉันต้องการแบ่งปันว่าเหตุใดฉันจึงพบว่ามีประโยชน์.

ภูมิหลังของฉัน

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

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

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

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

ตัวอย่างแรกของ Dafny

ดังตัวอย่างง่ายๆให้พิจารณาการหารจำนวนเต็มของเงินปันผลที่ไม่เป็นลบ n ด้วยตัวหารบวก d; 


n / d

แสดงด้านล่าง:

แม้ว่าในภาษาโปรแกรมแบบพิมพ์เราสามารถ จำกัด พารามิเตอร์อินพุตได้บ้าง แต่ก็ไม่เพียงพอเสมอไป ในตัวอย่างนี้ข้อกำหนดของ n และ d เป็นจำนวนธรรมชาติหมายความว่าอินพุตทั้งสองต้องเป็นจำนวนเต็มที่ไม่เป็นลบ แต่ไม่ได้ระบุข้อ จำกัด ของ d ให้เป็นจำนวนเต็มบวก การใช้เงื่อนไขล่วงหน้าโดยใช้คำสั่งที่กำหนดให้มีข้อ จำกัด ดังกล่าวและหมายความว่าวิธีนี้สามารถเรียกใช้ได้ก็ต่อเมื่อ d > 0. ดังนั้นหากส่วนอื่น ๆ ของโปรแกรมจะทำให้ div ถูกเรียกโดยที่เงื่อนไขก่อนไม่เป็นที่พอใจโปรแกรมจะไม่ตรวจสอบ จากนั้นคำสั่ง sure จะจัดเตรียมเงื่อนไขการโพสต์และให้ข้อกำหนดอย่างเป็นทางการของสิ่งที่ผลลัพธ์ของวิธีการต้องเป็นไปตาม.

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

ช่วงเวลาศักดิ์สิทธิ์ของฉัน

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

ช่วงเวลาของฉันเกิดขึ้นขณะดูหนึ่งในไฟล์ วิดีโอมุมยืนยัน

ในบทช่วยสอนนี้ Rustan Leino ใช้วิธี SumMax ที่ใช้จำนวนเต็มสองจำนวน x และ y และส่งกลับผลรวมและ max, s และ m ตามลำดับ ตัวอย่างนี้ค่อนข้างตรงไปตรงมาและโค้ด Dafny แสดงไว้ด้านล่าง.

อินพุต x และ y ถูกระบุเป็นจำนวนเต็มผ่านการพิมพ์และไม่จำเป็นต้องมีเงื่อนไขเบื้องต้นอื่น ๆ เงื่อนไขการโพสต์สามเงื่อนไขให้การตรวจสอบว่าเอาต์พุตเป็นไปตามข้อกำหนดจริง ๆ กล่าวคือ s เท่ากับ x + y และ m เท่ากับ x หรือ y และ m ไม่เกิน x และ y จากนั้นวิธี SumMaxBackwards จะถูกนำเสนอเป็นแบบฝึกหัดและนี่คือจุดที่น่าสนใจยิ่งขึ้น ข้อกำหนดคือการย้อนกลับของ SumMax นั่นคือให้ผลรวมและผลตอบแทนสูงสุดเป็นจำนวนเต็ม x และ y ตกลงดังนั้นความพยายามครั้งแรกอาจเกิดขึ้นในภายหลังเงื่อนไขเดียวกัน เนื่องจากความสัมพันธ์ระหว่างอินพุตและเอาต์พุตยังคงมีอยู่ ถ้าเราปล่อยให้ x เป็นค่าสูงสุดพีชคณิตแบบย่อจะบอกเราว่า y ควรเท่ากับผลรวมลบค่าสูงสุด การใส่สิ่งนี้ลงในเครื่องมือแก้ไขออนไลน์จะให้สิ่งต่อไปนี้.

สกรีนช็อต 2020 12 15 เวลา 6 38 37 น 1 Screen Shot 2020 12 16 เวลา 5 35 22 น

ไม่ยืนยัน แล้วเกิดอะไรขึ้น? เราได้รับแจ้งว่า Postcondition ไม่ได้ยึดไว้และโดยเฉพาะอย่างยิ่ง postcondition ในบรรทัดที่ 3 (ต้องแน่ใจว่า x<= ม && ย <= m) ไม่สามารถถือได้ เมื่อมองอย่างใกล้ชิดมากขึ้นเราจะเห็นว่าเงื่อนไขโพสต์นี้ระบุว่า x <= m และ y <= ม. เรารู้ว่า x น้อยกว่าหรือเท่ากับ m เมื่อเรากำหนด x เท่ากับ m นั่นหมายความว่า y <= m ส่วนไม่ได้รับการยืนยัน สิ่งนี้เกิดขึ้นได้อย่างไร? พีชคณิตของเราบอกเราว่า y: = s – m สมมติว่า s คือ 5 และ m คือ 3 แล้ว y = 5 – 3 = 2 ซึ่งทำให้แน่ใจว่า y <= ม. แต่สมมติว่าเราเรียกเมธอดนี้ด้วย s เท่ากับ 5 และ m เท่ากับ 1 ไม่มีอะไรจะหยุดเราไม่ให้เรียกเมธอดด้วยพารามิเตอร์อินพุตเหล่านี้ แต่การทำเช่นนั้นจะทำให้เกิดปัญหาเป็น y = 5 – 1 = 4 แล้ว y > ม. โดยพื้นฐานแล้วสิ่งที่เราเห็นคือแม้ว่าพารามิเตอร์อินพุตจะหมายถึงจำนวนเต็มสูงสุดสองจำนวนที่สร้างผลรวม s แต่ก็ไม่มีอะไรที่จะหยุดเราที่พยายามเรียกเมธอดด้วยอินพุตที่ไม่ถูกต้อง เว้นแต่จะมีการรวมเงื่อนไขเบื้องต้นเพื่อ จำกัด อินพุตของ s และ m เป็นจำนวนเต็มที่ถูกต้องซึ่งจะส่งผลให้เอาต์พุต x และ y ตรงตามข้อกำหนดวิธีการของเราอาจให้ผลลัพธ์ที่ไม่ถูกต้อง เราต้องการความสัมพันธ์อะไรระหว่าง s และ m เพื่อให้อินพุตที่ถูกต้อง? พีชคณิตอีกเล็กน้อยแสดงให้เราเห็นว่า s <= m * 2 เพื่อให้มีการแก้ปัญหาที่ถูกต้องของ x และ y หากเราเพิ่มสิ่งนี้เป็นเงื่อนไขเบื้องต้น Dafny สามารถตรวจสอบรหัสได้ตามที่แสดงด้านล่าง. 

Screen Shot 2020 12 15 เวลา 6 46 32 น. 1 สกรีนช็อต 2020 12 16 เวลา 5 37 39 น

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

สิ่งที่ฉันกำลังทำอยู่ตอนนี้

นั่นนำฉันไปสู่จุดสิ้นสุดของโพสต์ของฉัน หากคุณต้องการดูว่าฉันกำลังทำอะไรกับ Dafny อยู่ลองดูสิ่งนี้ GitHub repo. ฉันเป็นส่วนหนึ่งของทีมตรวจสอบอัตโนมัติภายใน R&D ที่ ConsenSys และเรากำลังใช้ Dafny ในการตรวจสอบข้อกำหนด Ethereum 2 Phase 0 อย่างเป็นทางการ การใช้วิธีการที่เป็นทางการในพื้นที่บล็อกเชนเป็นพื้นที่การวิจัยใหม่ที่น่าตื่นเต้นซึ่งได้รับการยอมรับจาก ConsenSys และฉันขอแนะนำให้ทุกคนที่สนใจเรียนรู้เพิ่มเติมเกี่ยวกับ Eth 2.0 เพื่อดูแหล่งข้อมูลที่มีอยู่ในโครงการ repo ของเรา.

สมัครรับจดหมายข่าวของเราเพื่อรับข่าวสารล่าสุดของ Ethereum โซลูชันระดับองค์กรทรัพยากรสำหรับนักพัฒนาและอื่น ๆ ที่อยู่อีเมล

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map