فهم Vyper: لغة Ethereum الجديدة الرائعة

دليل شامل عن Vyper ، لغة Ethereum الجديدة الرائعة

Vyper هي لغة برمجة تجريبية للأغراض العامة يتم تجميعها وصولاً إلى كود ثنائي EVM (آلة افتراضية Ethereum) ، كما تفعل Solidity. ومع ذلك ، تم تصميم Vyper لتبسيط العملية بشكل كبير من أجل إنشاء عقود ذكية يسهل فهمها وتكون أكثر شفافية لجميع الأطراف المعنية ، ولديها نقاط دخول أقل للهجوم.

يجب أن يكون أي رمز يستهدف جهاز EVM عالي الكفاءة لتقليل الغاز اللازم لتنفيذ العقود الذكية ، حيث إن العقد الذي يحتوي على رمز غير فعال يكلف فعليًا مزيدًا من الأثير في التنفيذ ، ويمكن أن يصبح سريعًا باهظ التكلفة ، خاصة في حالات الاستخدام مثل المعاملات. والنتيجة النهائية هي أن Vyper يبدو مشابهًا منطقيًا لـ Solidity ، ومتشابهًا من الناحية التركيبية مع Python ، ولكن بدون العديد من نماذج البرمجة الشيئية – ربما تتطلب تعريف نموذج جديد لبرمجة المعاملات.

سيساعدك تعلم هذه الاختلافات المنطقية والنحوية الآن على أن تصبح مطور Vyper على مستوى عالمي لأن Vyper لا يزال في الإصدار 0.1.0-beta.1 اعتبارًا من يونيو 2018!

فهم Vyper

0. مقارنة بايثون وفايبر وسوليديتي

هنا ، نغطي “سبب” المستوى العالي لـ Vyper – مما يوفر لنا نقطة انطلاق لتحليل وكتابة كود Vyper ، بما في ذلك العقود الذكية.

مفتاح التحسين 1: البساطة

لا يحتوي Vyper على العديد من التركيبات المألوفة لمعظم المبرمجين: وراثة الفئة ، التحميل الزائد للوظيفة ، التحميل الزائد على المشغل ، والتكرار. لا يعد أي من هذه العناصر ضروريًا من الناحية الفنية للغة Turing-Complete ، وهي تمثل مخاطر أمنية من خلال زيادة التعقيد. نظرًا لهذا التعقيد ، فإن هذه التركيبات ستجعل من الصعب جدًا فهم العقود الذكية ومراجعتها من قبل شخص عادي ، كما هو موضح في عقود Solidity.

التركيبات الأقل شيوعًا التي لم يتم تضمينها أيضًا هي المعدلات (هذه تجعل من السهل جدًا كتابة رمز مضلل) ، والتجميع المضمّن (هذا الفواصل Ctrl + F) ، والنقطة الثابتة الثنائية (غالبًا ما تكون التقديرات مطلوبة بنقطة ثابتة ثنائية).

تحسين المفتاح 2: الأمان

على حد تعبير مطوري Vyper أنفسهم ، Vyper

“سيمنع الأشياء عمدًا أو يجعل الأمور أكثر صعوبة إذا رأت أنه من المناسب القيام بذلك بهدف زيادة الأمن”.

لذلك ، فإن Vyper ليست بديلاً نهائيًا عن Solidity ، ولكنها لغة رائعة لاستخدامها في أي مكان يكون فيه الأمان بالغ الأهمية ، مثل العقود الذكية التي تتعامل مع البيانات الوصفية لصحة المريض أو التدرجات النموذجية للذكاء الاصطناعي اللامركزي ؛ pp0

كود Vyper والاختلافات النحوية

تم تصميم Vyper ليكون مشابهًا لـ Python قدر الإمكان أثناء السعي لتحقيق أهداف الأمان والبساطة ، وبالتالي فإن الشعور العام للغات هو نفسه ، على الرغم من وجود العديد من الاختلافات التي يجب ملاحظتها.

تنفيذ ملف

بينما يتم تنفيذ نص بايثون كملف

بيثون file_name.py

, يتم تجميع برنامج نصي باستخدام

vyper file_name.vy.

متغيرات حالة

متغيرات الحالة هي قيم مخزنة بشكل دائم في مخزن العقد ويمكن أن تكون من أي نوع ، مثل:

exampleStateVariable: int256.

رسم الخرائط

أول شيء يحتويه عقد Vyper هو حقول تخزين العقد ، مثل تعيين رصيد الرمز المميز:

الرصيد: عام (wei_value [العنوان])

وهو متغير حالة يحدد المفاتيح والقيم المقابلة.

تعيينات Vyper هي في الأساس جداول تجزئة تمت تهيئتها ، كما هو موضح أعلاه ، لذلك

“كل مفتاح محتمل موجود ويتم تعيينه إلى قيمة يكون تمثيل البايت فيها عبارة عن أصفار: القيمة الافتراضية للنوع”.

لا يتم تخزين البيانات الرئيسية في التعيين ، ولكن فقط تجزئة keccak256 للبحث عن قيمتها.

في تحديد التوازن, يتم إعطاء النوع public (), متبوعًا ببنية التعيين: حيث يكون نوع القيمة wei_value أولا ، يليه key (العنوان) بين قوسين معقوفين – على غرار تعامل Python مع المصفوفات.

تعريفات

ستلاحظ أن Vyper يستخدم النقطتين في تحديد الأسماء (مثل الرصيد) على عكس علامات التساوي في Python ، على الرغم من أن Python 3.6 يتضمن نفس بناء الجملة للتعليق التوضيحي المتغير:

سياق = {} # سياق قاموس فارغ ["أ"]: 2 # متغير قاموس توضيحي

حيث يكون بناء جملة النقطتين للتعليق التوضيحي المتغير ، ويتم استخدام النقطتين كعامل تعيين يقوم بتعيين تعليق توضيحي من النوع فقط. يستخدم Vyper بناء الجملة هذا لتعيين القيمة الحقيقية.

أنواع عدد صحيح

يحتوي Vyper على نوعين صحيحين فقط: uint256 (للأعداد الصحيحة غير السالبة) و int128 (للأعداد الصحيحة الموقعة) – على عكس Solidity من uint8 إلى uint256 في الخطوات 8 ، ونفس الشيء بالنسبة لـ int8 إلى int256 (هذا يعني 64 كلمة رئيسية مختلفة لأنواع int).

العوامل المنطقية والمعاملات والمقارنات والوظائف

يحتوي Vyper على بناء جملة متطابق تقريبًا مع Python لمعظم المشغلين ، بما في ذلك:

منطقية صحيحة وكاذبة ؛ لا ، و ، أو ، == ، و! = عوامل ؛ <, <= ، == ،! =, >= و و > مقارنات و + و – و * و / و ** و٪ عوامل حسابية (فقط لـ int128)

بالإضافة إلى بعض الوظائف المضمنة المماثلة:

len (x) لإرجاع طول int ؛ Floor (x) لتقريب العلامة العشرية إلى أقرب عدد صحيح ؛ و ceil (x) لتقريب عدد عشري لأقرب عدد صحيح

وبعض الجديد:

sha3 (x) لإرجاع تجزئة sha3 كـ 32 بايت ؛ concat (x ، …) لسلسلة مدخلات متعددة ؛ slice (x، start = _start، len = _len) لإرجاع شريحة _len بدءًا من _start

القوائم

يتم التصريح عن القوائم في Vyper باستخدام التنسيق _name: _ValueType [_Integer] ، أثناء تعيين القيم وبيانات الإرجاع لها نفس بناء الجملة مثل Py = thon.

على سبيل المثال:

lst: int128 [3] # تحديد قائمة lst = [1، 2، 3] # تعيين القيم lst [2] = 5 # تعيين قيمة بواسطة مؤشر إرجاع lst [0] # إرجاع 1

الهياكل

الهياكل هي الأنواع التي تحددها ، وتجمع المتغيرات ، ويتم الوصول إليها باستخدام Struct.argname ، على هذا النحو (تشبه إلى حد ما قواميس Python):

البنية: {# تعريف البنية

arg1: int128 ، arg2: عشري

} Struct.arg1 = 1 #access arg1 في البنية

تحديد الطرق

يتم تعريف الطرق (طرق العقد في Vyper) بنفس الطريقة في Python و Vyper:

طريقة def ():

قم بعمل ما()

بالإضافة إلى ما توفره Python ، يتضمن Vyper أدوات تزيين خاصة بـ Ethereum مثل @ payable وasserر – يستخدم الأول لجعل العقد قادرًا على إجراء المعاملات والآخر يأخذ تعبيرًا منطقيًا:

لاحظ ال def function_name (arg1، arg2، …, أرجكس) -> الإخراج: بناء الجملة لتحديد وظيفة. على عكس Python ، يحدد Vyper بوضوح نوع الإخراج في السطر def بعد ->.

وظائف المنشئ

تعمل وظائف المُنشئ بنفس اصطلاح Python وتقوم بإنشاء مثيل لعقد ومعلمات معينة على blockchain. يقوم الحرف الأول بتهيئة البرنامج ويتم تنفيذه مرة واحدة فقط. على سبيل المثال:

public def __init __ (_ name: bytes32، _decimals: uint256، _initialSupply: uint256):

self.name = _name self.decimals = _decimals self.totalSupply = uint256_mul (_initialSupply، uint256_exp (تحويل (5، ‘uint256’)، _decimals))

كما هو الحال في Python ، يتم استخدام self لتأكيد متغيرات الحالة. الوظيفة المذكورة أعلاه مزينة بامتداد public decorator لمنحها رؤية عامة والسماح للكيانات الخارجية بالاتصال بها (على عكس الافتراضي – أو إهمال المصمم – وهو خاص).

المصمم @مستمر يستخدم لتزيين الأساليب التي تقرأ الحالة فقط ، بينما @ الدفع يجعل أي طريقة يمكن استدعاؤها بالدفع.

الأحداث

يمكنك تسجيل الأحداث باستخدام __سجل__ في الهياكل المفهرسة ، على النحو التالي:

الدفع: __log __ ({amount: uint256، param2: indexed (address)}) tot_payment: uint256public def pay ():

self.tot_payment + = msg.value log.payment (msg.value، msg.sender)

كتابة عقود Vyper

الآن ، دعنا نكتب بعض العقود الذكية البسيطة. يسمح مقتطف الشفرة التالي للعقد باستلام NFT (رمز مميز غير قابل للاستبدال) والقدرة على الإرسال مقابل هذا الرمز المميز.

public def safeTransferFrom (_from: address، _to: address، _tokenId: uint256):

self._validateTransferFrom (_from، _to، _tokenId، msg.sender) self._doTransfer (_from، _to، _tokenId) if (_to.codesize > 0):

returnValue: بايت [4] = raw_call (_to، ‘xf0xb9xe5xba’، outsize = 4، gas = msg.gas)

تأكيد returnValue == ‘xf0xb9xe5xba’

يوضح ما يلي public decorator, تحديد وظيفة بمعامل واحد يتم منحه صراحة نوعًا ، ونصًا برمجيًا بسيطًا باستخدام عبارات التأكيد للتحقق مما إذا كان للمستخدم الحق في التصويت كجزء من برنامج “التصويت مع التفويض”:

# أعط الناخب الحق في التصويت على هذا الاقتراع # لا يجوز استدعاء هذا إلا من قبل الرئيسpublic def give_right_to_vote (voter: address):

تأكيد msg.sender == self. الوزن ليس 0

المصوتون الذاتيون [الناخب]. الوزن = 1 self.voter_count + = 1

بعد مناقشة المميزات النحوية والمنطقية ، فإن الشفرة ليست مخيفة للغاية. يقدم موقع vyper.online شفرة المصدر الكاملة لبرنامج “التصويت بالتفويض” ، باستخدام هياكل للناخبين والمقترحات والوظائف التالية المسماة على نحو مناسب:

تفويض def (العنوان: العنوان) -> منطقي def مباشرة_تصويت (العنوان: العنوان) -> bool def __init __ (_ projectNames: bytes32 [2]) def give_right_to_vote (voter: address) def forward_weight (التفويض_with_weight_to_forward: address) def المفوض (to: address) def التصويت (الاقتراح: int128) def الفائز_proposal () -> int128 def الفائز_name () -> بايت 32

كما هو الحال مع أي لغة برمجة ، فإن التخطيط للتركيبات الرئيسية (في هذه الحالة ، عقود الوظائف) يجعل البرمجة أسهل بكثير. الاختلاف الرئيسي في Vyper الذي يجب أخذه في الاعتبار هو عدم وجود نماذج OOP. في المرحلة الحالية من التطوير ، لا يمكنك إجراء مكالمات تعليمات برمجية خارجية.

يمكن رؤية اعتبارات السماح باستدعاءات التعليمات البرمجية الخارجية في اقتراح التطوير التالي:

# عقد خارجي أ:

def foo (): ثابت def bar (): تعديل # هذا العقد B: a: A def baz (): a.foo () a.bar ()

حيث يستدعي العقد B العقد A ، بما في ذلك الطرق داخل A ، في أبسط مثال ممكن.

تشغيل Vyper

لمتابعة كتابة التعليمات البرمجية ، انتقل إلى vyper.online ، واكتب أمثلة التعليمات البرمجية ضمن علامة التبويب “Source Code” وانقر فوق “Compile” عندما تكون جاهزًا. العميل الأكثر استخدامًا (على الرغم من أنه في مرحلة ما قبل ألفا) لتطبيق Vyper وتنفيذ الاختبار هو Py-EVM ، الذي تم تطويره في البداية بواسطة Vitalik نفسه ، والذي يسمح للمستخدم بإضافة أكواد التشغيل أو تعديل الرموز الحالية دون تغيير المكتبة الأساسية ، مما يتيح نمطية أكبر بكثير وقابلية التوسع مقارنةً بعميل نموذجي.

للحصول على Py-EVM ، ما عليك سوى استخدام pip install py-evm == 0.2.0a16.

3 أ. نشر عقود Vyper

بينما يكون Py-EVM حاليًا في مرحلة ما قبل ألفا وقد يكون من الصعب إعداده وتشغيله ، إلا أن هناك بديلين أبسط لنشر عقود Vyper على شبكات الاختبار العامة (ومكافأة):

1) الصق الرمز الثانوي الذي تم إنشاؤه من vyper.online في Mist أو geth

2) استخدم قائمة عقد myetherwallet للنشر في المتصفح الحالي 3) (قادم)

في المستقبل ، سوف يتكامل Vyper مع populus ، مما يتيح لك نشر عقود Vyper بسهولة

من أجل التبسيط ، سننشر العقود باستخدام الخيار (1) و Mist (واجهة مستخدم جديدة أعلى geth بدلاً من geth القائم على المحطة الطرفية). نظرًا لأن Vyper يجمع إلى نفس رمز Bytecode مثل Solidity ، فإننا لا نحتاج إلى أي عملاء خاصين بـ Vyper ، ويمكننا اتباع هذه الخطوات الملتوية نوعًا ما:

  1. انتقل إلى vyper.online وانقر على “تجميع” على التصويت المملوء مسبقًا “شفرة المصدر”
  2. انسخ كل شيء ضمن علامة التبويب “Bytecode”
  3. قم بتثبيت Mist لنظام التشغيل الخاص بك ، إذا لم تكن قد قمت بذلك بالفعل
  4. السماح للعقدة بالتنزيل والمزامنة (يحدث هذا تلقائيًا)
  5. حدد “استخدام شبكة الاختبار” في إعداد الضباب
  6. أنشئ كلمة مرور (وتذكرها …)
  7. أدخل العقد
  8. حدد “العقود” في واجهة الضباب
  9. حدد “نشر عقد جديد”
  10. انتقل إلى علامة التبويب “كود بايت العقد”
  11. الصق في Bytecode الذي نسخته من vyper.online

انشر العقد

  1. حدد “نشر” وأدخل كلمة المرور من قبل
  2. تأكد من نشر عقد Vyper
  3. انتقل إلى علامة التبويب “محافظ” في الضباب
  4. مرر لأسفل إلى “أحدث المعاملات”
  5. يجب أن ترى العقد الذي نشرناه للتو!

*على الرغم من أنه في حالة “عقد الإنشاء” حيث لا يتم تعدينه والتحقق من صحته

استنتاج

يوفر هذا الدليل مقدمة منطقية ونحوية إلى Vyper ، مما يسمح لنا ببدء برمجة ونشر العقود. من خلال المعرفة من هذا الدليل ، يجب أن تكون قادرًا على المساهمة في تطوير Vyper ووثائقه ومواصلة التعلم عن طريق الترميز على vyper.online.

مرة أخرى ، لا يُقصد من Vyper أن تحل محل Solidity ، ولكن كما وجدت إحدى الدراسات أكثر من 34000 عقد ضعيف ، فإن الحاجة إلى أمان أقوى في هذا الفضاء أكبر من أي وقت مضى ، مما يمنح Vyper مستقبلًا مهمًا في Ethereum

مزيد من القراءة وخريطة الطريق

نظرًا لأن Vyper لا يزال قيد التطوير التجريبي ، فإن الوثائق الرسمية و GitHub هي أكثر الموارد شمولاً ، مع توفير القيمة التالية أيضًا:

01.مجتمع Vyper’s Gitter

02.أدوات وموارد Vyper

03. “صفحات Ethereum Book “على Vyper

04.دراسة: “اكتشاف العقود الجشعة والضال والانتحارية على نطاق واسع”

05.“دليل تفصيلي: بدء استخدام محفظة Ethereum Mist”

07.اختبار ونشر عقود Vyper

08. “قم ببناء أول عقد ذكي مع Ethereum مع Solidity – البرنامج التعليمي “ [يعد تعميم الخطوات لملاءمة Vyper أمرًا بسيطًا إلى حد ما]

تركز خطوات تطوير Vyper للإصدار 1.0 على الواجهات (بالإضافة إلى التحسينات في المكالمات الداخلية والخارجية ، من بين أمور أخرى) ، والتي تحدد القيود حتى تتمكن من التواصل مع أي كائن يقوم بتنفيذ تلك الواجهة. تتيح الواجهات حلولاً بديلة لترقية العقود الذكية ، لذا فهي ليست ضرورية للوظائف الأساسية ، ويمكنك بدء الترميز في Vyper على الرغم من أن اللغة غير مكتملة.

خارطة طريق التطوير للإصدار 1.0 ، تم استردادها وتحريرها من Vyper’s gitter:

01 نوعان من الملفات: واجهات (واجهة واحدة لكل ملف) وعقود (عقد واحد

لكل ملف).

02. يمكنك تحديد واجهة مثل ERC721Metadata في ملف واجهة وأيضًا بتنسيق

ملف العقد.

03. ملف الواجهة متوافق تمامًا مع Ethereum ABI.

04. كتابة مترجم من Solidity إلى واجهات Vyper.

05. إنشاء مكتبة لجميع واجهات ERC النهائية ، حتى لو كان عليك القيام بذلك يدويًا

هم.

06. استيراد واجهات من ملفات الواجهة إلى العقود.

07. الواجهة هي نوع يزين العنوان.

08. يمكن أن ترث الواجهات واجهات أخرى.

09. ادرس بعناية معرفات الواجهة من ERC-165 وأعد إنتاج الأمثلة الواردة في

ERC-721 يتعلق هذا بكيفية توريث الواجهات واجهات أخرى.

10. قد يكون للواجهات وظائف اختيارية. (كسر من الصلابة).

11. يمكن تنفيذ العقود البينية.

12. عقد ينفذ واجهة ولكنه لا ينفذ المطلوب

الوظيفة هي خطأ.

13. عقد ينفذ واجهة ولكنه لا ينفذ اختياريًا

الوظيفة ليست خطأ ولا تحذير.

14. أعد تسميةpublic إلىexternal لمطابقة Solidity.

15. أدخل وظيفة جديدة للديكورinternal تسمح باستدعاء وظيفة

داخليا.

16. أعد تقديم صيغة استدعاء الوظيفة المستخدمة حاليًا للمكالمات الخارجية (تمت إزالتها بتنسيق

الخطوة 14) ولكن اجعلها تنطبق على المكالمات الداخلية.

17- نفذ دعوات خارجية مثل هذا: جدول استدعاء القفز الخارجي -> بيانات المكالمات

أفرغ -> إضافة معلمات دالة للتكديس -> استدعاء الوظيفة الداخلية -> تفعل وظيفة

أشياء.

18. تنفيذ الاستدعاءات الداخلية مثل هذا: إضافة معلمات الوظيفة إلى المكدس -> الاتصال الداخلي

وظيفة -> قم بالأشياء الوظيفية.

كما ترون من الكود الذي كتبناه ، فإن Vyper تخطو خطوات كبيرة في تطويرها ، ولديها فقط بعض التحديثات الرئيسية (مقسمة إلى الخطوات الأصغر أعلاه) حتى إصدار 1.0!

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