ตามที่เสนอภาษาสัญญาอัจฉริยะภาษาแรก Solidity ได้เปิดประตูใหม่สำหรับสถานการณ์แอปพลิเคชันบล็อกเชน
ตามที่เสนอภาษาสัญญาอัจฉริยะภาษาแรก Solidity ได้เปิดประตูใหม่สำหรับสถานการณ์แอปพลิเคชันบล็อกเชน
-- ต้นทาง--
คำว่า Smart Contract ถูกเสนอครั้งแรกในปี 1994 โดย Nick Szabo นักวิชาการด้านกฎหมายแบบสหวิทยาการ คำจำกัดความของสัญญาอัจฉริยะของเขามีดังนี้:
"สัญญาอัจฉริยะคือชุดของข้อผูกพันที่กำหนดแบบดิจิทัล รวมถึงข้อตกลงที่คู่สัญญาสามารถบังคับใช้ข้อผูกพันเหล่านั้นได้"
โดยสรุป Nick Szabo มองว่าสัญญาที่ชาญฉลาดคือชุดของสัญญา ความมุ่งมั่นที่เรียกว่าหมายถึงสิทธิและหน้าที่ร่วมกันที่ตกลงร่วมกันโดยผู้เข้าร่วม ดังนั้นสาระสำคัญและวัตถุประสงค์ของสัญญาอัจฉริยะก็คือสัญญานั่นเอง ผู้ขายสัญญาว่าจะจัดหาและผู้ซื้อสัญญาว่าจะชำระเงิน สัญญา 2 อย่างนี้สามารถสร้างสัญญาอัจฉริยะได้ สังเกตคำหลักที่กล่าวถึงในคำจำกัดความของสัญญาอัจฉริยะของ Nick Szabo: รูปแบบดิจิทัลและข้อตกลง คำหลักสองคำนี้กำหนดว่าสัญญาอัจฉริยะแตกต่างจากข้อผูกมัดในความหมายดั้งเดิม และมีลักษณะเฉพาะในรูปแบบและหน้าที่
"สัญญาอัจฉริยะ" ถูกนำมาใช้ครั้งแรกใน blockchain โดย Ethereum ตามเอกสารไวท์เปเปอร์ของ Ethereum การแนะนำสัญญาอัจฉริยะนั้นส่วนใหญ่เพื่อแก้ปัญหาต่อไปนี้:
สำหรับภาษาสคริปต์ สคริปต์ยังไม่สมบูรณ์ (จะแนะนำในภายหลัง) และเป็นการยากที่จะนำฟังก์ชันที่ซับซ้อนไปใช้ เช่น อัลกอริทึมลายเซ็นเส้นโค้งวงรี
สคริปต์ไม่สามารถควบคุมจำนวนเงินที่สามารถถอนได้อย่างละเอียด
สคริปต์ขาดการเก็บรักษาสถานะและไม่สามารถใช้สัญญาแบบมีสถานะที่ซับซ้อนกว่านี้ได้
ข้อมูลที่ได้รับระหว่างการดำเนินการมีไม่เพียงพอ เช่น การได้มาของตัวเลขสุ่ม การประทับเวลา และแฮชบล็อกก่อนหน้า
กล่าวโดยย่อ ภาษาสคริปต์ไม่สามารถตอบสนองการทำงานของแอปพลิเคชันที่สมบูรณ์กว่านี้ได้ ดังนั้น Ethereum จึงออกแบบ Solidity ภาษาสัญญาอัจฉริยะที่ไม่เหมือนใคร และในขณะเดียวกัน EVM เอ็นจิ้นการดำเนินการสัญญาอัจฉริยะก็ถือกำเนิดขึ้นเช่นกัน
ตั้งแต่นั้นมา สถานการณ์การประยุกต์ใช้เทคโนโลยีบล็อกเชนได้ขยายจากธุรกรรมสกุลเงินดิจิทัลที่ใช้ UTXO รายการเดียวไปยังฟิลด์การประมวลผลทั่วไปที่สมบูรณ์ของทัวริง ผู้ใช้ไม่ได้จำกัดอยู่เฉพาะตรรกะง่ายๆ ที่สนับสนุนโดย Bitcoin Script อีกต่อไป แต่สามารถออกแบบตรรกะสัญญาที่ซับซ้อนตามอำเภอใจได้ด้วยตัวเอง
--ภาพรวม--
สัญญาสมาร์ทการออกแบบ Ethereum มีคุณสมบัติการออกแบบดังต่อไปนี้:
▲ ความแน่นอนในการดำเนินการ
ความมุ่งมั่นหมายความว่าโปรแกรมมีเอาต์พุตเดียวกันสำหรับอินพุตที่กำหนด ไม่ว่าจะดำเนินการเมื่อใดและที่ไหน ไม่ว่าจะดำเนินการกี่ครั้งก็ตาม เนื่องจากบล็อกเชนมีบัญชีแยกประเภทเดียวกัน จึงเข้าใจความแน่นอนของการดำเนินการตามสัญญาอัจฉริยะได้ เนื่องจากโหนดต่างๆ ที่ดำเนินการตามสัญญาเดียวกันจะต้องมีผลลัพธ์เดียวกัน
ภาษาสัญญาอัจฉริยะของ Ethereum ได้รับการออกแบบให้เรียบง่ายเพียงพอ เพื่อให้มั่นใจถึงการดำเนินการที่แน่นอน มันจะไม่ใช้ฟังก์ชัน เช่น ตัวเลขสุ่มและการเรียก (ระบบ) ที่ไม่แน่นอน ในขณะเดียวกัน การดำเนินการของสัญญาอัจฉริยะก็อยู่ใน เครื่องเสมือนที่มีสภาพแวดล้อมจำกัด ด้วยวิธีนี้ สามารถรับประกันความแน่นอนของผลลัพธ์ได้ที่ชั้นล่างสุด
▲ ความสมบูรณ์ของทัวริง
ภาษาที่สมบูรณ์ของทัวริง คำอธิบายอย่างเป็นทางการคือภาษาที่ "สามารถคำนวณปัญหาทั้งหมดที่สามารถคำนวณได้โดยอัลกอริทึม" รวมทั้งการวนซ้ำไม่สิ้นสุด จุดประสงค์ของการแนะนำสัญญาอัจฉริยะใน Ethereum คือเพื่อให้บรรลุความสมบูรณ์ของทัวริงเพื่อรองรับแบบฟอร์มใบสมัครที่สมบูรณ์ยิ่งขึ้น
ปัญหาหนึ่งที่ต้องแก้ไขหลังจากการแนะนำความสมบูรณ์ของทัวริงคือปัญหาการหยุด: โดยทั่วไปไม่มีทางที่จะบอกได้ว่าโปรแกรมที่กำหนดจะหยุดทำงานหรือไม่
เพื่อหลีกเลี่ยงปัญหาการหยุดทำงานที่เกิดจากความสมบูรณ์ของ Turing Ethereum ได้แนะนำกลไก Gas เพื่อทำการคำนวณต้นทุนในกระบวนการดำเนินการที่เกี่ยวข้อง โดยการคำนวณต้นทุนของการดำเนินการต่างๆ ในหน่วยของก๊าซ (การดำเนินการแต่ละครั้งจะสอดคล้องกับปริมาณการใช้ก๊าซเฉพาะ นั่นคือ มีตารางปริมาณการใช้ก๊าซที่สอดคล้องกัน) และตั้งค่าขีดจำกัดสูงสุดของการใช้ก๊าซสำหรับการดำเนินการแต่ละครั้ง นั่นคือ gasLimit การดำเนินการสะสมของการดำเนินการตามสัญญา หลังจากขีดจำกัดบนของ gasLimit การดำเนินการถูกบังคับให้หยุด เพื่อให้บรรลุผลของการปิดระบบ การเปิดตัวกลไก Gas ทำให้ความซับซ้อนของผู้ใช้ในการใช้แอปพลิเคชันขึ้นอยู่กับราคาที่เขายินดีจ่ายแทนที่จะเป็นข้อจำกัดทางกายภาพของแพลตฟอร์ม
แน่นอน การแนะนำกลไกแก๊สยังมีประโยชน์อื่นๆ ซึ่งจะไม่แนะนำในที่นี้
▲ ความปลอดภัย
ในฐานะที่เป็นหลักฐานการออกแบบของ Ethereum การรักษาความปลอดภัยเป็นสิ่งที่สัญญาอัจฉริยะจำเป็นต้องรับประกัน ความปลอดภัยของสัญญาอัจฉริยะของ Ethereum นั้นสะท้อนให้เห็นในสองด้านเป็นหลักในการออกแบบ:
1) ภาษาสัญญาอัจฉริยะที่ค่อนข้างง่าย
เมื่อเปรียบเทียบกับภาษา Turing-complete กระแสหลัก ภาษา Solidity จะเน้นที่สถานการณ์บล็อกเชน ดังนั้นจึงไม่จำเป็นต้องใช้คุณสมบัติภาษามากมาย เช่น การเรียกแบบหลายเธรดและการเรียกระบบ ซึ่งทำให้การออกแบบเรียบง่ายที่สุดเท่าที่จะเป็นไปได้ อย่างไรก็ตาม นี่ก็เป็นสาเหตุหนึ่งที่ทำให้ใช้งานยากในช่วงแรกๆ แม้ว่าภาษาจะพัฒนาไปทีละน้อย แต่ฟังก์ชันต่างๆ ของภาษาก็เพิ่มพูนและพัฒนาอย่างต่อเนื่อง
2) สภาพแวดล้อมการดำเนินการของสัญญาอัจฉริยะนั้นแยกออกจากกันเพียงพอ
สัญญาอัจฉริยะของ Ethereum ทำงานใน Ethereum Virtual Machine (EVM) การดำเนินการใน EVM นั้นไม่ได้เป็นเพียงแซนด์บ็อกซ์เท่านั้น แต่จริง ๆ แล้วแยกออกจากกันอย่างสมบูรณ์ ซึ่งหมายความว่า โค้ดที่ทำงานใน EVM ไม่สามารถเข้าถึงเครือข่าย ระบบไฟล์ หรือกระบวนการอื่น ๆ ได้ แม้แต่สัญญาอัจฉริยะก็มีข้อจำกัดในการเข้าถึงสัญญาอัจฉริยะอื่นๆ ความปลอดภัยที่ควบคุมได้รับประกันได้ในระดับมากผ่านการแยกส่วนการทำงาน
—— คำอธิบายโดยละเอียด ——
ต่อไป มาดูเครื่องมือดำเนินการของสัญญา Solidity—EVM
ข้อความ
EVM ถูกกำหนดเป็นเครื่องเสมือนสแต็กที่ใช้หนึ่งไบต์เป็นคำสั่ง ลักษณะเฉพาะของเครื่องเสมือนแบบสแต็กคืออาศัยการโต้ตอบกับสแต็กตัวถูกดำเนินการ (สแต็กตัวถูกดำเนินการ) เมื่อดำเนินการ
ซอร์สโค้ดของสัญญา Solidity ถูกคอมไพล์เพื่อใช้ bytecode แบบสแต็กระดับต่ำ ดังนั้นสิ่งที่เราปรับใช้จริงบน Ethereum และดำเนินการใน EVM จริง ๆ แล้วเป็นสตริงของ bytecode รหัสประกอบด้วยชุดของไบต์ โดยที่แต่ละไบต์แสดงถึงการดำเนินการ เมื่อ bytecode ถูกเรียกใช้งาน มันจะถูกดำเนินการตามลำดับจาก bytecode แรกตามความหมายการทำงานของ bytecode จนกว่าจะถึงจุดสิ้นสุดของรหัสหรือเกิดข้อผิดพลาด (เช่น พบ opcodes REVERT, STOP หรือ RETURN) การดำเนินการเหล่านี้สามารถเข้าถึงพื้นที่สามประเภทเพื่อจัดเก็บข้อมูล:
Stack: คอนเทนเนอร์ LIFO ที่สามารถผลักและดึงค่าได้
หน่วยความจำ: อาร์เรย์ไบต์ที่ขยายได้ไม่สิ้นสุด
ที่เก็บข้อมูล: ที่เก็บข้อมูลระยะยาวของสัญญา ซึ่งจัดเก็บเป็นคู่คีย์/ค่า ซึ่งแตกต่างจากสแต็กและหน่วยความจำที่รีเซ็ตหลังการคำนวณ ที่เก็บข้อมูลจะคงอยู่เป็นเวลานาน และส่วนนี้ยังเป็นส่วนหนึ่งของ "สถานะโลก" ที่มักเรียกกันว่า
กระบวนการดำเนินการของสัญญาอัจฉริยะคือกระบวนการดำเนินการของพื้นที่เก็บข้อมูลสามประเภทตามลักษณะการทำงานที่กำหนดโดย opcode เราจะแสดงโดยย่อด้วยตัวอย่างต่อไปนี้:
รูปต่อไปนี้แสดงส่วนของสัญญา: ด้านซ้ายคือรหัสไบต์ของสัญญา และด้านขวาคือความหมายการดำเนินการที่แสดงโดยรหัสไบต์
ความหมายง่ายๆ ของแต่ละ opcode มีดังนี้
PUSH1: เลขฐานสิบหกของไบต์คือ 60 ความหมายของการดำเนินการคือการผลักไบต์ถัดไปไปยังสแต็ก
เพิ่ม: Bytecode เลขฐานสิบหกคือ 01 ความหมายของการดำเนินการคือป๊อปและเพิ่มสององค์ประกอบในสแต็ก แล้วใส่ผลลัพธ์กลับในสแต็ก
MSTORE: เลขฐานสิบหกของรหัสไบต์คือ 52 ความหมายของการดำเนินการคือเก็บค่าที่สองที่โผล่ออกมาจากสแต็กลงในหน่วยความจำ และค่าดัชนีที่เก็บไว้คือองค์ประกอบแรกที่โผล่ขึ้นมาจากสแต็ก
RET: เลขฐานสิบหกของไบต์คือ f3 ความหมายของการดำเนินการคือการสิ้นสุดการดำเนินการ ส่งกลับผลลัพธ์ ผลลัพธ์อยู่ในหน่วยความจำ ดัชนีเริ่มต้นคือค่าแรกที่ดึงมาจากสแต็ก และความยาวคือค่าที่สองที่ดึงมาจาก ซ้อนกัน
ใส่รหัสไบต์นี้ลงใน EVM เพื่อดำเนินการ และกระบวนการดำเนินการจะเป็นดังนี้:
ในหมู่พวกเขา PC แสดงถึงตำแหน่งของรหัสการดำเนินการดำเนินการปัจจุบัน ณ จุดสิ้นสุดของการดำเนินการส่วนย่อยของสัญญา (เช่น: รหัสการดำเนินการ RET) ข้อมูล 5 ไบต์จะถูกนำออกจากจุดเริ่มต้นของ 60 ในหน่วยความจำ ดังนั้น การดำเนินการในส่วนของสัญญาเสร็จสิ้น ผลสุดท้าย จะถูกส่งกลับไปยังผู้โทร!
นักเรียนที่ระมัดระวังจะพบว่าคำแนะนำที่เกี่ยวข้องในรูปไม่มีการดำเนินการที่เกี่ยวข้องกับ Storage อันที่จริง เป็นเพราะคำสั่งที่เกี่ยวข้อง เช่น SStore ไม่ได้ถูกเลือกในโค้ดตัวอย่างเพื่อความง่ายและหลักการดำเนินการคล้ายกับนิพจน์ข้างต้น .
"เหตุใด EVM จึงได้รับการออกแบบเช่นนี้ เหตุใดจึงสามารถแก้ปัญหาการคำนวณและดำเนินการจัดหาและแก้ไขสถานะสัญญาให้เสร็จสมบูรณ์ผ่านการเข้าและออกจากสแต็กเหล่านี้ การคัดลอกหน่วยความจำ และการทำงานของ ที่เก็บ?"
สิ่งนี้เกี่ยวข้องกับการออกแบบภาษาโปรแกรม ในทางทฤษฎี ในระบบทางทฤษฎีของการคำนวณ สถาปัตยกรรมชุดคำสั่งเป็นแบบจำลองเชิงนามธรรมของคอมพิวเตอร์ และความหลากหลายของประเภทคำสั่งที่มีอยู่ในชุดคำสั่งจะส่งผลโดยตรงต่อความสมบูรณ์ของการแสดงออกของโปรแกรม ตัวอย่างเช่น ชุดคำสั่งสามารถรวมคำสั่งการดำเนินการทางคณิตศาสตร์และตรรกะ เช่น การบวก การลบ การคูณและการหาร คำสั่งควบคุม เช่น การกระโดด และคำสั่งการประมวลผลข้อมูล เช่น การอ่านหน่วยความจำ ในฐานะเครื่องเสมือน คุณสามารถเลือกหรือเพิ่มคำสั่งได้ตามต้องการเพื่อสร้างชุดคำสั่งเพื่อแสดงฟังก์ชันที่คุณต้องการ ตัวอย่างเช่น EVM ไม่เพิ่มคำแนะนำเกี่ยวกับพื้นที่เก็บข้อมูลสำหรับการดำเนินการที่เกี่ยวข้องกับเลขทศนิยม ดังนั้นสิ่งนี้จะอธิบายจากระดับคำสั่งว่าภาษา Solidity ไม่สนับสนุนการดำเนินการเกี่ยวกับเลขทศนิยม หลังจากกำหนดคำสั่งแล้ว ด้วยความช่วยเหลือของเครื่องมือบางอย่างของการเขียนโปรแกรมสมัยใหม่ จะสามารถออกแบบภาษาเฉพาะได้ ดังนั้น ในระดับหนึ่ง เราสามารถใช้ภาษาของเราเองและเครื่องมือดำเนินการที่เกี่ยวข้องได้หากจำเป็น
-- พัฒนา--
สาระสำคัญของ EVM คือการดำเนินการ "สถานะโลก" ผ่านภาษาที่ตั้งโปรแกรมได้ซึ่งเราเรียกว่าบัญชีแยกประเภทของบล็อกเชน ดังนั้น วิธีการทำงานที่ดีขึ้นและเร็วขึ้นจึงเป็นการแสวงหาเครื่องเสมือนสัญญาอัจฉริยะที่สำคัญ
ด้วยการพัฒนาอย่างต่อเนื่อง ทำให้มีเครื่องมือดำเนินการตามสัญญาอัจฉริยะมากมายในอุตสาหกรรม และการสำรวจใหม่ๆ ก็ไม่ขาดแคลน
EVM: เข้ากันได้กับ Ethereum EVM และปรับให้เหมาะสมสำหรับประสิทธิภาพและฟังก์ชั่นมากมาย
HVM: FunChain เป็นผู้บุกเบิกเอ็นจิ้นการดำเนินการตามสัญญาอัจฉริยะที่มีประสิทธิภาพ ใช้งานง่าย และสมบูรณ์ ซึ่งรองรับการเขียนสัญญาอัจฉริยะในภาษา Java
FVM: เครื่องมือการดำเนินการตามสัญญาอัจฉริยะที่ปลอดภัย หลากหลายและมีประสิทธิภาพ ซึ่งรองรับการเขียนสัญญาอัจฉริยะใน Rust และภาษาอื่นๆ
บทความนี้เป็นจุดเริ่มต้นของคอลัมน์ [Virtual Machine] ซึ่งแนะนำที่มาของสัญญาอัจฉริยะและสัญญาอัจฉริยะ Ethereum บทความชุดต่อไปจะแนะนำเครื่องมือการดำเนินการอื่นๆ อย่างละเอียด ดังนั้นโปรดติดตาม!
เกี่ยวกับผู้เขียน
เกี่ยวกับผู้เขียน
ข้อความ
อ้างอิง
อ้างอิง
[1] สารานุกรม Baidu สัญญาอัจฉริยะ
[2] กระดาษเหลือง Ethereum
