مرحبا. أنا مايك غولدين. أنا مطور برامج في ConsenSys وكتبت عقود إطلاق AdToken.
من المجهد جدًا القيام بإطلاق الرمز المميز! يتم دفع ملايين الدولارات عند طلبك في فترة زمنية قصيرة جدًا، ويجب التعامل مع كل Wei أو رفضه بشكل صحيح. على البلوكشين، لا يمكنك ببساطة «إعادة تشغيل الخادم» إذا حدث خطأ ما؛ إذا خسرت أموال شخص ما فسوف تختفي إلى الأبد ولن يكون سعيدًا معك.
إطلاق AdToken بسيط للغاية. نحن نبيع عددًا محدودًا من الرموز بسعر ثابت. تهدف MetaX إلى تحقيق إيرادات قدرها 10 ملايين دولار من البيع، والرقم البالغ 10 ملايين دولار هو سقف ثابت. سنقوم بتسعير الرموز قبل يوم واحد من الإطلاق بالنسبة لسعر الصرف في ذلك الوقت بحيث إذا تم بيع جميع الرموز البالغ عددها 500 مليون رمز، فسوف تحقق MetaX إيرادات بقيمة 10 ملايين دولار بسعر الصرف هذا.
لا توجد أسعار ديناميكية أو آلية مزاد غريبة. إطلاق AdToken هو عملية بيع بسعر ثابت وإمدادات محدودة. لا شيء فاخر يحدث هنا. ستحقق MetaX إيرادات قريبة جدًا من 10 ملايين دولار اعتمادًا على التقلبات في سعر إيثر في اليوم بين تحديد سعر البيع ومجموعة بدء البيع.
دعونا نلقي نظرة على العقود!
هنا عقد البيع المنشور على الشبكة الرئيسية، و هنا شفرة المصدر. ألقِ نظرة أولاً على متغيرات التخزين المسماة StartBlock و FreezeBlock. يتم استخدام StartBlock في معدل SaleStarted لرفض عمليات الشراء التي تمت تجربتها قبل بدء البيع. يتم استخدام FreezeBlock في معدل isFrozen لمنع مالك العقد (أنا!) من إجراء تغييرات على السعر وستارتبلوك أقل من كتل ستارتبلوك - فريز بلوك قبل ستارتبلوك. إذا نظرت إلى Etherscan، يمكنك أن ترى أن كتلة البداية الخاصة بنا تم تعيينها حاليًا على 3939181، وهو رقم أولي وبالتالي فهو كتلة جيدة جدًا يمكن من خلالها إطلاق رمز مميز. يجب أن يأتي المبنى 3939181 ظهرًا بتوقيت شرق الولايات المتحدة يوم 26 يونيو. تم ضبط FreezeBlock الخاص بنا على 3937741، والذي يجب أن يأتي قبل حوالي ست ساعات من بدء الحظر.
نحن نخطط لتحديد سعر البيع النهائي قبل يوم تقريبًا وربما لن نقوم بتعديله في اللحظة الأخيرة ما لم يكن هناك تأرجح جنوني في سعر إيثر. ولكن بالنسبة لك، كمشتري، يمكنك أن تطمئن إلى أننا غير قادر قم بتغيير السعر قبل أقل من ست ساعات من بدء البيع، حتى تعرف السعر الذي تدفعه.
إذا قررنا تغيير StartBlock، فلاحظ في وظيفة ChangeStartBlock أن FreezeBlock سوف يقوم تلقائيًا بتظليل StartBlock الجديد. لذلك إذا قمنا بتغيير StartBlock، فلا يزال بإمكانك الاطمئنان إلى أنه قبل ست ساعات من البيع، سيتم تأمين المعلمات النهائية ولن نتمكن حتى من تغييرها.
إحدى الوظائف المهمة للمالك فقط والتي لم يتم تعديلها بواسطة معدل isFrozen هي EmergenyToggle. إذا كان في أي نقطة نكتشف بعض المشاكل في عقود الإطلاق، يمكننا تفعيل EmergencyToggle لمنع عملية البيع من المتابعة.
يبلغ طول عقد البيع 242 سطرًا، ولكن هناك 31 سطرًا (16 ناقصًا التعليقات والمسافة البيضاء) والتي تقع حقًا في المسار الحرج. هذه هي وظيفة PurchaseTokens. لاحظ أولاً أن هذه هي الوظيفة الوحيدة في العقد المحددة على أنها مستحقة الدفع، مما يعني أن عمليات الإرسال الأولية إلى العقد ستعود. في الواقع، ستعود الرسائل التي تتضمن رصيد إيثر المرسل إلى أي وظيفة بخلاف PurchaseTokens. بصرف النظر عن المُعدِّل المستحق الدفع، تتطلب مُعدِّلات وظيفة PurchaseTokens أن يكون البيع قد بدأ، وأن علامة الطوارئ لا يتم تبديلها، وأن يكون إعداد العقد قد اكتمل (الإعداد) هو أكمل، ابحث عن نفسك على Etherscan!).
حسنًا، تبدو المعدلات بسيطة جدًا. ماذا يحدث في وظيفة PurchaseTokens؟
في الخطوط 178-180 سنحدد ما إذا كان المرسل قد أرسل أي فائض من إيثر. إذا كان سعر AdToken هو 2 Wei وأرسل لنا المستخدم 3 Wei، فلا يمكننا للأسف منح المستخدم نصف AdToken. علينا أن نعيد لهم بعض أموالهم! هذا ما نقوم به في هذه السطور: تحديد ما إذا كان قد تم إرسال أي فائض من إيثر حتى نتمكن من إرساله مرة أخرى إليهم.
بمجرد القيام بذلك، نعرف بالضبط عدد AdToken الذي يمكن للمرسل شراؤه بالنظر إلى كمية Ether التي أرسلها إلينا. في السطر 183، نتأكد من أن هناك بالفعل عددًا كافيًا من AdToken لا يزال متاحًا للبيع ونعيد المعاملة إذا لم يكن الأمر كذلك. إذا كان هناك يكونوا يتوفر ما يكفي من AdToken للمشتري لشراء المبلغ الذي حدده، ثم نرسل في السطر 187 أي فائض من إيثر أرسله إلينا مرة أخرى قبل المتابعة.
حسنا، نحن على وشك الانتهاء! على الخط 191، نقوم بنقل الإيثر الذي أرسله المرسل إلينا إلى محفظتنا. بعد ذلك مباشرة نقوم بنقل الرموز التي اشتراها المرسل للتو إلى الحساب الذي أرسله.
لاحظ أننا نستخدم النقل بدلاً من الإرسال على الخط 191. لن يؤدي كل من النقل والإرسال إلا إلى إعادة توجيه 2300 غاز إلى عنوان الاستقبال مما يمنع إعادة الدخول التي أدت أمثالها إلى إسقاط DAO، ولكن النقل سيعيد فعليًا المعاملة بأكملها في حالة حدوث خطأ نفاد الغاز في وظيفة الرجوع إلى جهاز الاستقبال.
على الخط 194، نختتم تحويل الرمز المميز الخاص بنا (يختلف عن تحويل إيثر!) في بيان تأكيد. تعود عقود رمز ERC-20 التي نستخدمها بشكل خاطئ عند الفشل، وسنرغب في إعادة المعاملة بأكملها إذا فشل نقل الرمز المميز لأي سبب من الأسباب.
أخيرًا، على الخط 196، نصدر حدثًا لإعلام العالم بأن عملية الشراء كانت ناجحة!
أشياء يجب ملاحظتها: بمجرد بيع البيع، يجب أن تتم جميع المعاملات الخاصة بـ PurchaseTokens بسبب الشيك في السطر 183. هذا يعني أنه لا ينبغي أن تكون هناك طريقة لمنح عقد البيع إيثر بمجرد انتهاء البيع. هذا المنطق نفسه يعني أيضًا أنه حتى قبل بيع البيع بالكامل، ستفشل عمليات الشراء للحصول على رموز أكثر مما هو متاح - قد تمنحك عمليات الشراء الصغيرة فرصة أفضل للحصول على الرموز قبل بيعها! من الممكن أيضًا كتابة عقد مجمّع من شأنه شراء الكمية المناسبة تمامًا من الرموز وإغلاق عملية البيع مع إعادة أي رصيد زائد إلى المرسل، لكننا نترك ذلك كتمرين للقارئ (تأكد من كتابة وظيفة للسماح لنفسك بسحب الرموز! تُنسب الرموز إلى msg.sender، والذي سيكون عقدك! ما لم تحدد وظيفة السحب، فسوف تقوم بقفل الرموز الخاصة بك عند القيام بذلك!).
سألني أحد المتدربين مؤخرًا عن كيفية اختبار مثل هذه الشفرة الهامة. الجواب: بعناية فائقة! لدينا 950 سطرًا من اختبارات الوحدات (جميعها ناجحة!) وأجروا ثلاثة اختبارات حية على Rinkeby و Kovan، بالإضافة إلى اختبار رابع قيد التنفيذ حاليًا مع معايير النشر النهائية. إن كتابة هذه العقود والعيش تحت ضغط معرفة أنني قد أكون مسؤولاً عن حرق الكثير من أموال الناس قد جعلني متحمسًا جدًا لإعادة النظر في اللغات الوظيفية لكل من برمجة EVM وسقالة النشر. سيكون من الجيد معرفة أن فئات كاملة من الأخطاء قد تم التخلص منها بواسطة المترجم. لكن ذلك سيكون في المرة القادمة. في الوقت الحالي، لدينا جافا سكريبت جيدة (مكتوبة ديناميكيًا) وصلابة (ضرورية).
الخطوة الأخيرة في جعلني أشعر بالرضا عن سلامة إطلاق الرمز المميز هذا هي... مكافأة الأخطاء العامة!
تم نشر عقودنا جون كوفان بالإضافة إلى الشبكة الرئيسية، ونحن نقدم مكافآت كبيرة (500 ألف ADToken!) للأخطاء التي يمكنها:
سنقدم مكافآت أصغر للأخطاء التي تنتج سلوكيات غير متوقعة لا ترتقي إلى مستوى سرقة الأصول. إذا كنت بحاجة إلى Kovan ETH أو ترغب في التواصل مع صائدي الجوائز الآخرين، انضم إلى منصة AdChain!
يرجى إرسال جميع الأخطاء إلى bugs@metax.io