دليل إضافة لغة برمجة جديدة على Arbitrum Stylus

Arbitrum Stylus هي تقنية جديدة تم تطويرها لسلاسل Arbitrum والتي تمنح مطوري العقود الذكية قوى خارقة. باستخدام Stylus، يمكن للمطورين كتابة عقود ذكية متوافقة مع EVM بالعديد من لغات البرمجة المختلفة، وجني مكاسب هائلة في الأداء. يخفض Stylus الرسوم، مع مكاسب في الأداء تتراوح من 10 إلى 70 ضعف، ومكاسب في كفاءة الذاكرة تصل إلى 100-500 ضعف.

وهذا ممكن بفضل تقنية WebAssembly، التي تترجم إليها جميع برامج Stylus. تعيش عقود Stylus الذكية تحت نفس تجربة حالة Ethereum في عقد Arbitrum، ويمكنها التفاعل بشكل كامل مع العقود الذكية Solidity أو Vyper EVM. باستخدام Stylus، يمكن للمطورين كتابة عقود ذكية في Rust تتحدث إلى Solidity والعكس دون أي قيود.

يأتي Stylus أيضًا مزودًا بمجموعتي SDK مدعومتين رسميًا للمطورين لكتابة العقود بلغات البرمجة Rust أو C.

ومع ذلك، يمكن لأي شخص إضافة دعم للغات الجديدة في Stylus. طالما يمكن ترجمة لغة البرمجة إلى WebAssembly، فسوف يتيح لك Stylus استخدامها لكتابة عقود ذكية متوافقة مع EVM. لاحظ أنه لكي يتم نشره على السلسلة، يجب أن يتناسب برنامجك المترجم مع الحد الأقصى لضغط brotli وهو 24 كيلو بايت، ويجب أن يلبي متطلبات قياس غاز Stylus.

في هذا الدليل، نستعرض كيف أضفنا دعمًا للغة البرمجة Zig الصاعدة، والتي من المفترض أن تكون خليفة للغة C التي تأتي مع أداء رائع وأمان للذاكرة في غضون 20 سطرًا من التعليمات البرمجية.

المتطلبات:
قم بتنزيل وتثبيت Zig 0.11.0
قم بتثبيت Rust، التى سنحتاجها لأداة Stylus CLI لنشر برنامجنا على Stylus testnet
سنستخدم أيضًا Rust لتشغيل نموذج نصي يمكنه استدعاء عقد Zig الخاص بنا على Stylus testnet باستخدام مكتبة ethers-rs الشهيرة.

بمجرد تثبيت Rust، قم أيضًا بتثبيت أداة Stylus CLI باستخدام

RUSTFLAGS="-C link-args=-rdynamic" cargo install --force cargo-stylus
استخدام Zig مع Stylus
أولاً، لنقم باستنساخ المستودع:

git clone https://github.com/offchainlabs/zig-on-stylus && cd zig-on-stylus

ثم احذف كل شيء داخل main.zig. سنقوم بملئها بأنفسنا في هذا الدليل التعليمي.

لدعم Stylus، تحتاج برامج Zig الخاصة بك إلى تحديد وظيفة نقطة دخول خاصة، والتي تأخذ طول وسيطات الإدخال الخاصة بها، وlen، وترجع رمز الحالة i32، والذي يكون إما 0 أو 1. لن نحتاج إلى مكتبة Zig القياسية لهذا.

هناك شيء آخر يحتاجه الأمر وهو استخدام وظيفة خاصة تسمى Memory_grow والتي يمكنها تخصيص الذاكرة لبرنامجك. يتم إدراج هذه الوظيفة في جميع عقود Stylus كاستيراد خارجي. داخليًا، نسميها vm_hooks، ونشير إليها أيضًا باسم host-io، لأنها تتيح لك الوصول إلى المضيف، بيئة EVM.

تابع واستبدل كل شيء في وظيفة main.zig الخاصة بك بما يلي:

pub extern “vm_hooks” fn memory_grow(len: u32) void;

export fn mark_unused() void {
memory_grow(0);
@panic(“”);
}

// The main entrypoint to use for execution of the Stylus WASM program.
export fn user_entrypoint(len: usize) i32 {
_ = len;
return 0;
}

في الأعلى نعلن عن وظيفة Memory_grow الخارجية للاستخدام.

بعد ذلك، يمكننا إنشاء مكتبة Zig الخاصة بنا إلى ملف WASM مستقل لنشرنا على السلسلة:

zig build-lib ./src/main.zig -target wasm32-freestanding -dynamic --export=user_entrypoint -OReleaseSmall --export=mark_unused

وهذا يكفي بالنسبة لنا للنشر على Stylus testnet! سنستخدم أداة Stylus CLI، التي قمنا بتثبيتها مسبقًا باستخدام Cargo install:

cargo stylus deploy --private-key=<YOUR_TESTNET_PRIVKEY> --wasm-file-path=main.wasm

سترسل الأداة معاملتين: واحدة لنشر رمز عقد Zig الخاص بك على السلسلة، والأخرى لتنشيطه للاستخدام.

حجم WASM غير مضغوط: 112 B
حجم WASM المضغوط الذي سيتم نشره على السلسلة: 103 B

يمكنك أن ترى أن برنامج Zig الخاص بنا صغير جدًا عند تجميعه إلى WASM. بعد ذلك، يمكننا الاتصال بعقدنا للتأكد من أنه يعمل باستخدام أي من أدوات Ethereum المفضلة لديك. في هذا المثال أدناه، نستخدم أداة CLI المقدمة من Foundry. تم نشر العقد أعلاه على Stylus testnet على العنوان 0xe0CD04EA8c148C9a5A58Fee1C895bc2cf6896799.

export ADDR=0xe0CD04EA8c148C9a5A58Fee1C895bc2cf6896799
cast call --rpc-url 'https://stylus-testnet.arbitrum.io/rpc' $ADDR '0x'

إن استدعاء العقد عبر RPC يجب أن يعيد القيمة 0 كما برمجناها عليها.

0x

لمزيد من المعلومات: https://docs.arbitrum.io/stylus/how-tos/adding-support-for-new-languages#using-zig-with-stylus