كيفية تأمين البيانات الحساسة على عقد Ethereum الذكية؟

هل سبق لك أن كتبت عقدًا ذكيًا في Solidity ونشرت على شبكة Ethereum؟ أنها مثيرة للغاية أنه يمكنك البرنامج ووضع منطقك على blockchain الصحيح؟ على أي حال ، لا تزال Solidity قيد التطوير وهناك الكثير من العيوب التي نحتاج إلى حلها عند العمل مع Solidity والعقود الذكية. أحد العوائق هو تأمين بياناتنا الحساسة على العقد الذكي.

لذلك نحن اليوم نناقش حول كيفية تأمين بياناتك الحساسة على العقد الذكي الذي ستنشره. سنتعرف على بعض الطرق ونتحقق مما إذا كان بإمكاننا تأمين بياناتنا في عقد ذكي أم لا.

لكن انتظر! لماذا نحتاج إلى إخفاء بياناتنا؟

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

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

إنشاء مسابقة مع مكافأة على blockchain

إن العقد الذكي يفتح لنا عالمًا منفتحًا جدًا ويساعدنا على فعل أي شيء نريده ، ولهذا السبب في بعض النقاط ستواجه الموقف عندما تريد إخفاء شيء كما هو موضح أعلاه. وكيف يمكننا حقا إخفاء كلمتنا السرية في التحدي؟ دعنا نذهب بعض الأساليب.

متغير خاص؟

نعم ، بشكل برمجي ، يمكننا إعلان متغير خاص في عقدنا الذكي. بسيط مثل هذا:

سلسلة سرية خاصة

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

أكثر في مرحلة ما ، قد ترغب في نشر شفرة المصدر الخاصة بك ويمكن للأشخاص قراءة السر في عقدك الذكي بسهولة.

ضع البيانات الحساسة لاحقًا

فماذا لو لم نضع البيانات الحساسة في البداية في الكود المصدري ولكن نطبق وظيفة لوضع الرسالة في وقت لاحق؟ أدناه هو عقد ذكي بسيط

عقد SecretMessage {
    سلسلة سرية خاصة
    
    وظيفة SetSecret (سلسلة _secret) عامة {
        سر = _سكرت
    }
}

افترض أننا نشرنا بالفعل العقد الذكي ونستخدم وظيفة SetSecret لوضع الرسالة في (بالطبع في المنتج نحتاج إلى حماية هذه الوظيفة مع المُعدّل المملوك للتأكد من أننا فقط يمكننا استدعاء هذه الوظيفة.

إذن ماذا يحدث عندما نسمي الوظيفة بسرنا؟

دعونا نفتح محفظة ethereum ونحاول استدعاء الوظيفة ، ونضع الكلمة السرية "hello" وأرسلها:

عند النقر فوق الزر "إرسال" ، يمكننا استلام البيانات الأولية لإرسالها إلى العقد الذكي:

568656c6c6f000 ...

وإذا لاحظت ، فهذه هي السلسلة hello المكتوبة برمز hexa. وهو العام للجميع!

0x5 - طول السلسلة
0x68 - ساعة (رمز ASCII 104)
0x65 - ه
0x6c - ل
0x6c - ل
0x6f - س

هذه هي الطريقة التي يتم بها عرض السلسلة في Solidity.

يمكنك أن ترى أنه عندما نسميها الوظيفة ، تكون البيانات التي أرسلناها عامة على شبكة Ethereum ويمكن لأي شخص قراءتها. هذا الحل ليس أفضل من وضع السر مباشرة في العقد الذكي. هذا أيضًا هو نفسه نشر العقد الذكي مع السر في وسيطات دالة المنشئ.

تشفير أو ضرب الأسرار ؟!

يمكنك رؤية كل شيء نضعه على blockchain مرئيًا للجميع ، فكيف يمكننا تأمين بياناتنا الحساسة؟ طريقة بسيطة للقيام: تشفير أو تجزئة السر! ويبدو أن هذا هو أفضل حل حتى الآن بالنسبة لنا.

لدينا طريقتان:
1) يمكننا تشفير بياناتنا ووضع المفتاح السري في مكان ما خارج السلسلة. عندما نريد أن يحصل العقد الذكي على السر الحقيقي للقيام بالمنطق المطلوب ، نحتاج إلى إرسال مفتاح العقد الذكي. هذا له عيبان: سيتم نشر المفتاح الخاص للجميع في وقت إرساله إلى العقد الذكي ؛ وظيفة التشفير غير المتماثلة غير مدعومة بعد في Solidity (وتنفيذ funciton مباشرة في العقد الذكي يبدو مستحيلاً)

2) يمكننا ببساطة تجزئة المفتاح السري ووضع التجزئة على blockchain. ثم في كل مرة يجيب أحدهم ، نحتاج فقط إلى تجزئة إجابته ومقارنته بالمفتاح السري المجز. لدى Solidity بالفعل بعض وظائف التجزئة التي يمكننا استخدامها: Keccak256 (SHA-3 by Ethereum) ، SHA256 ، RIPEMD-160 (http://solidity.readthedocs.io/en/latest/units-and-global-variables.html# الرياضية، والتشفير وظائف)

دعنا نقدم عرضًا تجريبيًا لاختبارنا أعلاه مع حل التجزئة:

عقد WordguessQuiz {
    / / هذا هو تجزئة كلمة "مرحبًا" باستخدام SHA256
    bytes32 private hashedSecret = 0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824؛
    
    // تستخدم هذه الخريطة لتتبع إذا أجاب المستخدم بشكل صحيح
    تعيين (address => bool) public answereredCorrectly؛
    
    وظيفة الجواب (كلمة سلسلة) العامة {
        bytes32 hashedWord = sha256 (word) ؛
        إذا (hashedWord == hashedSecret) {
            answereredCorrectly [msg.sender] = true؛
            // تودو: إرسال مكافأة لهذا المستخدم
        }
    }
}

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

اطلب الوظيفة للرد على تخميننا بالكلمة تحقق مرة أخرى لترى أننا أجبنا بالفعل على الاختبار بشكل صحيح

خاتمة

لذا فإن أفضل حل في الوقت الحالي هو تشفير / تجزئة بياناتنا الحساسة على blockchain. بالطبع لا يزال Ethereum في طور التطوير وقد يكون لدينا حل أفضل في المستقبل عندما نحتاج فقط إلى وضع المتغير الخاص ولا يمكن لأحد قراءته ، وهذه في الواقع واحدة من المشكلة الموضحة في Ethereum Wiki (https: / /github.com/ethereum/wiki/wiki/Problems#4-code-obfuscation). حتى ذلك الحين ، نحتاج إلى حل تشفير / تجزئة على الرغم من أنه قد يجعل حلنا اللامركزي أكثر أو أقل مركزية.

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

Blockchain جديد وكل شيء لا يزال في حالته المبكرة. ما يمكننا القيام به هو تكييف هذه التكنولوجيا الجديدة وإيجاد المزيد من التطبيقات لها. هذا ما نحاول القيام به مع TALO - بروتوكول تحسين المواهب اللامركزي. تعال وانضم إلينا على https://talo.io إذا كنت تريد معرفة المزيد عنا!

بعض الموضوعات الأكثر إثارة للاهتمام:

منع تجاوز عدد صحيح في العقود الذكية Ethereum

قائمة عقود MultiSig Wallet Smart على Ethereum

رمزي العسل وعاء الغش على شبكة Ethereum - عندما القراصنة احتيال القراصنة