จะเขียนสัญญาอัจฉริยะ WebAssembly บนเครือข่าย Ontology ได้อย่างไร ตอนที่ 1: สนิม

จะเขียนสัญญาอัจฉริยะ WebAssembly บนเครือข่าย Ontology ได้อย่างไร ตอนที่ 1: สนิม

เทคโนโลยี Ontology Wasm ช่วยลดค่าใช้จ่ายในการโอนย้ายสัญญาอัจฉริยะของ dApp ที่มีตรรกะทางธุรกิจที่ซับซ้อนไปยังบล็อกเชน จึงช่วยเพิ่มความสมบูรณ์ให้กับระบบนิเวศของ dApp ได้อย่างมาก

ขณะนี้ อภิปรัชญา Wasm รองรับการพัฒนาทั้ง Rust และ C++ พร้อมกัน ภาษา Rust รองรับ Wasm ได้ดีกว่า และ bytecode ที่สร้างขึ้นนั้นง่ายกว่า ซึ่งสามารถลดค่าใช้จ่ายในการเรียกสัญญาได้อีก ดังนั้น, จะใช้ Rust เพื่อพัฒนาสัญญาบนเครือข่าย Ontology ได้อย่างไร?

การพัฒนาสัญญา WASM กับ Rust

สร้างสัญญา

สินค้า เป็นเครื่องมือสร้างโครงการและจัดการแพ็คเกจที่ดีสำหรับการพัฒนา Rust ซึ่งช่วยให้นักพัฒนาจัดระเบียบการโต้ตอบของโค้ดและไลบรารีของบุคคลที่สามได้ดียิ่งขึ้น หากต้องการสร้างสัญญา Ontology Wasm ใหม่ ให้รันคำสั่งต่อไปนี้:

จะเขียนสัญญาอัจฉริยะ WebAssembly บนเครือข่าย Ontology ได้อย่างไร ตอนที่ 1: สนิม

โครงสร้างโครงการที่สร้างขึ้น:

จะเขียนสัญญาอัจฉริยะ WebAssembly บนเครือข่าย Ontology ได้อย่างไร ตอนที่ 1: สนิม

ไฟล์ Cargo.toml ใช้เพื่อตั้งค่าข้อมูลโครงการพื้นฐานและข้อมูลไลบรารีที่ต้องพึ่งพา ต้องตั้งค่าส่วน [lib] ของไฟล์เป็น crate-type = ["cdylib"] ไฟล์ lib.rs ใช้เพื่อเขียนโค้ดตรรกะของสัญญา นอกจากนี้ คุณต้องเพิ่มพารามิเตอร์การพึ่งพาลงในส่วน [การพึ่งพา] ของไฟล์การกำหนดค่า Cargo.toml:

จะเขียนสัญญาอัจฉริยะ WebAssembly บนเครือข่าย Ontology ได้อย่างไร ตอนที่ 1: สนิม

ด้วยการพึ่งพานี้ นักพัฒนาสามารถเรียกอินเทอร์เฟซที่โต้ตอบกับ Ontology blockchain และเครื่องมือต่างๆ เช่น พารามิเตอร์การทำให้เป็นอนุกรม

ฟังก์ชันการป้อนสัญญา

ทุกโปรแกรมมีฟังก์ชั่นอินพุตเหมือนฟังก์ชั่นหลักที่เรามักจะเห็น แต่สัญญาไม่มีฟังก์ชั่นหลัก เมื่อสัญญา Wasm ได้รับการพัฒนาโดยใช้ Rust ฟังก์ชันเรียกใช้เริ่มต้นจะถูกใช้เป็นฟังก์ชันอินพุตเพื่อใช้สัญญา ชื่อของฟังก์ชันใน Rust จะไม่ชัดเจนเมื่อคอมไพล์ซอร์สโค้ดของ Rust เป็น bytecode ที่เครื่องเสมือนสามารถดำเนินการได้ เพื่อป้องกันไม่ให้คอมไพลเลอร์สร้างโค้ดซ้ำซ้อนและลดขนาดของสัญญา ฟังก์ชันเรียกใช้จะเพิ่มคำอธิบายประกอบ #[no_mangle]

ฟังก์ชันเรียกใช้รับพารามิเตอร์เพื่อดำเนินการธุรกรรมอย่างไร

ไลบรารี ontio_std จัดเตรียมฟังก์ชัน runtime::input() เพื่อรับพารามิเตอร์เพื่อดำเนินการธุรกรรม นักพัฒนาสามารถใช้ ZeroCopySource เพื่อยกเลิกการซีเรียลไลซ์อาร์เรย์ไบต์ที่เป็นผลลัพธ์ โดยที่อาร์เรย์แรกของไบต์ที่อ่านคือชื่อของเมธอดที่เรียกใช้ ตามด้วยพารามิเตอร์เมธอด

ผลการดำเนินการตามสัญญาเป็นอย่างไร

ฟังก์ชัน runtime::ret ที่จัดทำโดยไลบรารี ontio_std ส่งคืนผลลัพธ์ของการดำเนินการเมธอด

ฟังก์ชันการเรียกใช้เสร็จสมบูรณ์มีลักษณะดังนี้:

จะเขียนสัญญาอัจฉริยะ WebAssembly บนเครือข่าย Ontology ได้อย่างไร ตอนที่ 1: สนิม

การทำข้อมูลสัญญาให้เป็นอนุกรมและดีซีเรียลไลซ์

ในกระบวนการพัฒนาสัญญา นักพัฒนามักจะประสบปัญหาเกี่ยวกับการซีเรียลไลเซชันและการดีซีเรียลไลเซชัน โดยเฉพาะอย่างยิ่งกับวิธีจัดเก็บประเภทข้อมูลโครงสร้างในฐานข้อมูล และวิธีแยกซีเรียลไลซ์อาร์เรย์ไบต์ที่อ่านจากฐานข้อมูลเพื่อรับประเภทข้อมูลโครงสร้าง

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

สำหรับข้อมูลที่มีความยาวคงที่ (เช่น: ไบต์, u16, u32, u64 เป็นต้น) ข้อมูลจะถูกแปลงเป็นอาร์เรย์ไบต์โดยตรงแล้วจัดเก็บในบัฟ สำหรับข้อมูลที่มีความยาวไม่คงที่ จะต้องทำให้เป็นอนุกรมความยาวก่อน จากนั้นตามด้วย Ddata (เช่น จำนวนเต็มที่ไม่มีเครื่องหมายซึ่งไม่ทราบขนาด รวมถึง u16, u32 หรือ u64 เป็นต้น)

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

เข้าถึงและอัปเดตข้อมูลในห่วงโซ่

ontology-wasm-cdt-สนิม - สรุปวิธีการปฏิบัติงานสำหรับการทำงานกับข้อมูลในเชน ซึ่งสะดวกสำหรับนักพัฒนาในการดำเนินการ เช่น การเพิ่ม ลบ เปลี่ยนแปลง และสอบถามข้อมูลในเชน ดังนี้

  • ฐานข้อมูล :: รับ (คีย์) - ใช้เพื่อขอข้อมูลจากเชนและคีย์ร้องขอการใช้งานอินเทอร์เฟซ AsRef
  • ฐานข้อมูล :: ใส่ (คีย์, ค่า) - ใช้ในการเก็บข้อมูลบนเครือข่าย คีย์ร้องขอการใช้งานอินเทอร์เฟซ AsRef และค่าร้องขอการใช้งานอินเทอร์เฟซตัวเข้ารหัส
  • ฐานข้อมูล :: ลบ (คีย์) - ใช้เพื่อลบข้อมูลออกจากเชน และคีย์ขอให้ใช้งานอินเทอร์เฟซ AsRef

การทดสอบสัญญา

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

การดีบักสัญญา

คอนโซล::debug(msg) แสดงข้อมูลการแก้ไขข้อบกพร่องในขณะที่ทำการดีบักสัญญา ข้อมูล msg จะถูกเพิ่มไปยังไฟล์บันทึกของโหนด ข้อกำหนดเบื้องต้นคือการตั้งค่าระดับล็อกไฟล์เป็นโหมดดีบักเมื่อโหนดทดสอบ Ontology โลคัลกำลังทำงาน

runtime::notify(msg) แสดงผลข้อมูลการดีบักที่เหมาะสมในขณะที่สัญญากำลังถูกดีบั๊ก เมธอดนี้จะเก็บข้อมูลที่ป้อนในเชนและสามารถสืบค้นจากเชนโดยใช้เมธอด getSmartCodeEvent

บทความนี้แปลโดยบรรณาธิการของ Hashrate&Shares สำหรับ OntologyRussia โดยเฉพาะ คลิก

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

อภิปรัชญา

ที่มา: will.com

เพิ่มความคิดเห็น