تفكيك عقد الذكية: ما هو محدد وظيفة؟

مرحبا، أنا أرحب التفكيكية ذكي الاستمرار في العقد. هذا المقال هو الجزء الثالث من هذه السلسلة، قبل إذا كنت لم أقرأ المقال، يرجى النظر في:

نحن التفكيكية بسيطة من EVM بايت كود عقود المخابرات الصلابة.

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

وهذا قد يبدو مخيفا بعض الشيء، لأن طول متاحة لإنشاء التعليمات البرمجية التي أربعة أشواط مرات على الأقل حجم! ولكن لا تقلق، نحن في المادة السابقة لفهم EVM تنمية المهارات التعليمات البرمجية، بالإضافة إلى أننا استخدام على الاطلاق موثوق "فرق تسد" استراتيجية، سيجعل هذا التحدي حتى أكثر انتظاما، وربما أسهل. هذا هو مجرد بداية، وسوف نستمر في التعرف على بنية مستقلة، تستمر حتى تقسيمها إلى انقسام حل مشكلة حتى الآن.

أولا، دعونا نعود ريميكس الانترنت محرر، رمز بايت وبدء جلسة التصحيح باستخدام وقت التشغيل. كيف لنا أن نفعل؟ آخر مرة، قمنا بنشر ذكية الشؤون العقد ونشر التصحيح. هذه المرة، سوف نستخدم عقد الذكية مع واحدة من وظائف نشر واجهة تفاعلية، وتصحيح المعاملة.

أولا وقبل كل شيء، علينا أن نتذكر مع عقد الذكية:

نحن نمكن الأمثل مترجم جافا سكريبت VM، v0.4.24 الإفراج عنهم، و 10000 باسم العرض الأولي. بعد نشر عقد الذكية، يجب أن نرى ذلك في ريميكس القسم المدرجة "تشغيل" لوحة "العقود المنتشرة". اضغط عليها لترى واجهة يمكن توسيع عقود الاستخبارات.

ما هذه الواجهة هي؟ ومن قائمة بجميع العقود العامة ذكي أو طرق الخارجية - وهذا هو، أي عقد أو حساب الذكية إيثرنت ساحة يمكن أن تتفاعل معها. لا تظهر أساليب خاصة والداخلية هنا، وكيفية التفاعل مع جزء معين من التعليمات البرمجية العقود الاستخبارات وقت التشغيل، وسوف يكون التركيز في هذه المادة التفكيكية.

يمكننا أن نحاول، انقر فوق ريمكس لل"تشغيل" لوحة زر totalSupply. يجب أن تشاهد دون استجابة زر فورا، وهذا هو ما نتوقعه، لأننا سوف تكون ذكية عقد توريد رمزية كما النشر الأولي. الآن، في لوحة التحكم، انقر فوق الزر تصحيح لاستخدام هذا معاملة معينة تبدأ جلسة التصحيح. يرجى ملاحظة أن في لوحة التصحيح وحدة التحكم لديها عدد وافر من الأزرار؛ تأكد من أنك تستخدم أحدث إصدار.

في هذه الحالة، ليس لدينا لتصحيح شؤون عنوان 0x0، كما رأينا في المقالة السابقة التي خلقت عقود الذكية. بدلا من ذلك، نحن التصحيح شؤون عقد الذكية نفسها - وهذا هو، رمز وقت التشغيل.

إذا المنبثقة "تعليمات" لوحة، ويجب أن تكون قادرة على التحقق من قيادة ريميكس والتفكيكية المدرجة في نفس الرقم BasicToken.evm (وقت التشغيل) من التعليمات. إذا كانت لا تطابق، تحدث المشكلة. محاولة البدء من جديد وتأكد من استخدام الإعدادات الصحيحة أعلاه.

قد تلاحظ أن أول شيء يضع المصحح لك في أمر في 246 والمنزلق المعاملة تقع بايت كود حوالي 60. لماذا؟ لأن ريميكس هو برنامج سخية جدا أن يأخذك مباشرة إلى EVM جزء totalSupply ظيفة الجسم على وشك أن يعدم. ومع ذلك، وقبل هذا حدث الكثير من الأشياء، وهذه هي ما نحن هنا لالمذكرة. في الواقع، ونحن لن حتى دراسة تنفيذ الجسم وظيفة في هذه المقالة . همنا الوحيد هو كيف الصلابة إنشاء التعليمات البرمجية EVM لتوجيه المعاملات الواردة، والتي كنا بأنها "وظيفة محدد" عقد العمل سوف يكون مفهوما.

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

أول ظهور الهيكل الذي رأيناه من قبل (في الواقع، سوف نرى الكثير):

1. FIG مؤشر الذاكرة

هذا ليس دائما يتم تنفيذها الصلابة EVM الشفرة التي تم إنشاؤها قبل استدعاء: لحفظ نقطة في الذاكرة لاستخدامها لاحقا.

دعونا نرى ما سيحدث بعد ذلك:

FIG 2. Calldata طول التحقق.

إذا قمت بفتح لوحة التبويب تصحيح ريميكس المكدس وتخطي تعليمات 5-7، سترى كومة يحتوي الآن رقمين. إذا كنت تواجه مشكلة في قراءة هذه الأرقام طويلة، يرجى الملاحظة التي ضبط عرض ريميكس لوحة التصحيح تناسب بشكل جيد لسطر واحد الرقمي. أول من دفع التقليدية، ولكن الثاني هو ناتج تنفيذ رموز العملية، حيث أن الكتاب الأصفر، أية معلمات وإرجاع حجم "إدخال البيانات في البيئة الحالية"، أو أننا غالبا ما يشار calldata: 4CALLDATASIZE

ما هو calldata؟ كما أوضحت الصلابة ABI ثيقة المواصفات، calldata هو كتلة أرقام رمز عشري، الذي يحتوي على معلومات حول العقد الذكية علينا أن استدعاء الدالة، ومعالمها أو البيانات. لفترة وجيزة، وتتكون من تكوين "وظيفة معرف"، التي يتم الحصول عليها عن طريق توقيع ظيفة تجزئة (اقتطاع إلى وحدات البايت الأربع الأولى) من المعلمة ضغط البيانات ثم يتم إنشاؤها. إذا رغبت، يمكنك تصل إلى دراسة مفصلة لهذه الوثيقة، ولكن لا داعي للقلق حول كيفية هذه الحزمة العمل على أدق التفاصيل. وأوضح أنه في الوثيقة، ولكن من الصعب قليلا لفهم. مع أمثلة عملية لفهم أنه سيكون من الأسهل بكثير.

دعونا نرى لماذا هذا calldata نعم. فتح "بيانات الدعوة" لوحة ريميكس المصحح، عرض: 0x18160ddd. هذا هو التخفيض الخوارزمية على سلسلة توقيع ظيفة keccak256 تنتج بالضبط أربعة بايت "totalSupply" وتنفيذها. وبما أن هذه وظيفة معينة بدون معلمات، لذلك هو فقط ما يلي: وظيفة معرف أربعة بايت. عندما يتم استدعاء CALLDATASIZE، ما هي الا ثاني دفعت إلى المكدس 4.

ثم، تعليمات للتحقق من calldata 8 حجم LT أقل من 4. إذا كان الأمر كذلك، فإن التعليمات التالية اثنين من التعليمات المنفذة JUMPI 86 (0x0056). هذا هو أقل من أربعة بايت، لذلك ليس هناك قفزة في هذه الحالة، سوف يستمر التنفيذ لتنفيذ تعليمات 13. ولكن قبل أن تفعل، دعونا نفترض أن نستخدم calldata فارغة استدعاء عقود ذكية لدينا - أيضا وهذا هو، 0x0 بدلا من 0x18160ddd. ريميكس راجع للشغل لا يمكنك أن تفعل مع هذا، ولكن يمكنك بناء المعاملات يدويا.

في هذه الحالة، نحن في نهاية المطاف في التعليم 86، والتي هي كبيرة في عدد من الأصفار إلى المكدس ويوفر لهم REVERT شفرة التشغيل. لماذا؟ حسنا، لأن العقد غير ذكية وظيفة النسخ الاحتياطي. إذا لم بايت كود التعرف على البيانات الواردة، وسوف تتدفق إلى وظيفة التراجع، وإذا كان الهيكل هو ليس "الاستيلاء" على المكالمة، وهذا الهيكل استعادة إنهاء على الإطلاق أي تراجع. إذا كان هناك أي شيء للعودة إليه، ثم هناك هو أن تفعل شيئا، ودعوة تجديده بالكامل.

الآن، دعونا نفعل بعض الأشياء أكثر إثارة للاهتمام. التعديل عودة علامة التبويب تشغيل، نسخ عنوان حساب واستخدامه كمعلمة للاتصال balanceOf التصحيح بدلا totalSupply المعاملة. هذا هو جلسة تصحيح جديدة، دعونا ننسى ذلك totalSupply. انتقل إلى تعليمات 8، CALLDATASIZE الآن 36 (0x24) دفعت إلى المكدس. اذا نظرتم calldata، هو الآن 0x70a08231000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c.

هذا calldata جديدة في الواقع من السهل جدا لكسر: أول أربعة بايت التجزئة 70a08231 التوقيع، تليها "balanceOf (عنوان)" من 32 بايت تحتوي على عنوان مررنا كمعلمة. لماذا 32 بايت، إذا كان عنوان Ethernet ساحة هو فقط 20 بايت، وقارئ غريبة قد يسأل؟ يستخدم ABI دائما 32 بايت "عبارة" أو "فتحات" لحفظ المعايير المستخدمة في استدعاء دالة.

نواصل balanceOf بيئة الدعوة، لذلك تركنا المكان غادرنا في التدريس 13، عندما مكدس فارغ. 0xffffffff تعليم 13 ثم دفع إلى المكدس، وسوف تعليمات المقبل سيكون 29 بايت الرقمية 0x000000001000 ... 000 إلى المكدس. وسوف نرى قريبا لماذا. الآن، وتضم أربعة بايت فقط ملاحظة، والآخر يحتوي على أربعة بايت 0 في.

التالي CALLDATALOAD يأخذ معلمة (في 48 أن المعلمات تعليمات إلى المكدس) وقراءة 32 كتل بايت من موقع calldata، في هذه الحالة، هو في يول:

calldataload (0)

أساسا بلدي calldata كلها دفعت إلى المكدس. الآن يأتي الجزء الممتع. DIV تستهلك معلمتين من المكدس، والحصول على calldata 0x000000001000 ... 000 مقسوما على الأرقام الفردية، على نحو فعال تصفية كل شيء ما عدا calldata ظيفة التوقيع في وترك الأمر في كومة: 0x000 ... 000070a08231. التعليمة التالية باستخدام AND، فإنه يستهلك عنصرين كومة: الهوية ولدينا وظيفة و مع عدد أربعة بايت. هذا هو التأكد من أن تجزئة وقع هو بالضبط ثمانية بايت، إذا كان هناك أي شيء آخر، شيء درع آخر. أعتقد أن الأمن يقيس استخدام الصلابة.

لفترة وجيزة، ونحن تحقق إذا calldata فقط قصيرة جدا، وإذا كان الأمر كذلك، لاستعادة، ثم تعديل طفيف، حتى يكون لدينا لدينا وظيفة في المكدس،

وبالإضافة إلى ذلك، نحن على وشك الانتهاء. والجزء التالي يكون من السهل جدا أن نفهم:

وظيفة محدد 3. FIG.

في تعليمة 53، 18160ddd مدونة (وظيفة معرف totalSuppy) إلى المكدس، ثم استخدام DUP2 لتكرار الواردة قيمة calldata 70a08231 حاليا في المكدس في المركز الثاني. لماذا يجب علينا نسخ؟ منذ EQ شفرة تشغيل التعليمات سوف تستهلك 59 قيمتين على المكدس، ونحن نريد للحفاظ على 70a08231 قيمة لأننا شهدت استخراج صعوبة ذلك من calldata.

رمز الآن محاولات لcalldata وظيفة معرف تتناسب مع واحد من وظيفة هوية معروفة. منذ دخول 70a08231، وانها لا تتطابق مع 18160ddd، JUMPIat تخطي التعليمة التالية 63. ومع ذلك، فإنه سوف تحقق المباراة والقفز إلى تعليم 74 JUMPI.

دعونا نتوقف لحظة للنظر في هذه الجمهور أو يساوي إلى التحقق من كل وظيفة من العقود الاستخبارات الخارجية. هذا هو جوهر وظيفة محدد: ليكون بمثابة نوع من بيان التبديل، توجيه ببساطة إلى الجزء الصحيح من تنفيذ التعليمات البرمجية. هذا هو موقفنا "مركز".

لذلك، لأن الحالة الأخيرة هي مباراة، فإن عملية التنفيذ موقف الولايات المتحدة إلى JUMPDESTat 130، كما سنرى في الجزء التالي من هذه السلسلة كما، ABI balanceOf وظيفة "المجمع". كما سنرى، فإن هذه الحزمة ستكون مسؤولة عن تفريغ المعاملات البيانات للاستهلاك الجسم وظيفة.

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

نظرة على خريطة التفكيكية، وهذا هو ما لدينا التفكيكية عادل:

تشغيل 4. FIG ظيفة ذكي محدد والعقود عندما الرئيسية رموز نقطة الدخول.

الكل في الكل، والرجال، وكنت غير مدركة كود الألفة مع صلابة الأساسية من معظم الناس، والعصا إلى ذلك، سوف تكون قادرة على فتحه بشكل كامل.

* هذه المقالة ظهرت للمرة الأولى في الوسط اليخاندرو سانتاندر، وترجم من قبل أمن سلسلة كتلة الفهد والتشطيب *

كانت السيارة على وشك الكسندر المحلي والتنظيمي تاجر سيارات الضغوط الامريكية

بابيت البداية

100000 $ لإنشاء هذا سينوبيك BAT إلى العمل، والعودة إلى A-حصة بوينر أيضا عمالقة، الاخ الاكبر الحب فعل الأفلام

CCTD | أصدر المجلس الوطني للطاقة 1--10 فبراير الإحصاءات صناعة الطاقة الوطنية

ضوء الغرب والشرق لا يلمع فيات بطل الرواية افساح الطريق لسيارة جيب

CCTD | حقائق مدينة الفحم يوميا السريع (11.26)

بسعر 49900 -7390000 جديدة رينا فتح مختلف اللهجات أي ضغط

جبل العبادة ofo نقص الأموال واختلاس 6 مليارات مستخدم لديه وديعة؟ ! فاستجابت

سوف تكون مثيرة للاهتمام للعب، LITE من بيع 86800 يوان، وهو أعلى مستوى التمتع 10 الوزن الرعاية

CCTD | أسعار الفحم حول التحديد (11.26)

إبرة صغيرة في الواقع جعل سوق السيارات بأكمله قطع ثلاثة ملايين؟

عمود بابيت