تألق والفقر الذري مقايضة

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

الدافع الرئيسي لأي محترف أمني هو الرغبة في تجنب المسؤولية.

لقد تركت العناية الإلهية كريمة ، لقد تركت ICO ، لا أنتظر أول معاملة لا رجعة فيها ، لكن سرعان ما وجدت نفسي وراء تطوير تبادل العملة المشفرة.

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

ليس مفاتيحك ، وليس مشاكلك


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

يمكنك أن تعمل كقاض في موقف مثير للجدل وإجراء المعاملات مع محافظ تتطلب اثنين من التوقيعات الثلاثة: المشتري والبائع والضمان.

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

التبادل الذري هو نظام تبادل حيث يعمل العقد الذكي كضامن ، والذي لا يسمح إلا بالسلوك الصادق.

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

فقط بدلاً من الحيوانات الشرسة ، يوفر الترتيب وظيفة تجزئة يكون من الصعب للغاية العثور على تصادم فيها لا يستحق البدء.

الخطوة الأولى: اللغز


لنفترض أن أليس تريد إعطاء Bitcoin لبوب حفنة من "اليوان المشفر" صباح أحد الأيام الجميلة.

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

الخطوة الثانية: الطعم


يدخل بوب اللعبة وينقل "cryptoeuro" إلى عقده ، والذي هو مكتوب بطريقة:

  • تستطيع أليس التقاط "عملات تشفير" من خلال تقديم رقم سري
  • في موعد لا يتجاوز الغداء ، يستطيع بوب ، إذا لم تظهر أليس ، إعادة الإيداع

الخطوة الثالثة: الحل في الطعم


تأتي أليس من أجل مالها وتأخذ الأموال من عقد بوب ، بينما تكشف سرها.

الخطوة الأخيرة: تم حل اللغز


يرى بوب الصفقة ، وبصره المائي يعزلها عن السر الذي قدمته أليس للعقد. يستخدم هذا السر لجمع عملات البيتكوين الخاصة به.

عندما يحدث خطأ ما


إذا تبين أن أليس فجأة كان مميتًا فجأة ، يأخذ بوب يوانه لتناول طعام الغداء.

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

إذا كنت تفضل صورة على نص ما ، فهناك على Habré شرحًا أكثر تفصيلًا ووضوحًا عن عمل المقايضات الذرية لك .

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

لا يمكن للمشاركين أن يخسروا أموالهم ، وسوف يضطر الحد الأقصى إلى الانتظار لاسترداد الأموال.

دعم Blockchain
هذا مخطط بسيط مثل الأحذية المحنطة ، والذي لا يتطلب شيئًا من العناصر المتفاعلة:

  • دعم العقود الذكية مع فرع واحد على الأقل
  • يجب أن يدعم كلا السلاسل الرئيسية خوارزميات التجزئة (لا تنس التحقق من طول السر)
  • Taymloki.


للوهلة الأولى ، يمكن للمرء بالفعل أن يقول للتبادل "وداعا ، كان اجتماعنا خطأ" ، لكنه لم يكن هناك.

رغم كل مزاياها ، فإن حلول التبادل الذري لا تصطدم بالسيولة. إلى حد كبير لأنه في زوج BTC-USD الأكثر شعبية ، لم يكن الجزء fiat رمزي بالكامل.
نتج عن نجاح USDT موجة من العملات المستقرة بتنسيق ERC20 لكل ذوق ، بدءًا من USDC الوصي إلى أكثر خوارزمية DAI.

لذلك ، من أجل البساطة ، نجادل أيضًا أن Alice تبيع Bobcoins إلى Bob لبعض الرموز ERC20 ، ونأمل في نجاح المثبتات ، نظرًا لأن لدينا العديد من المشكلات الفنية.

سرعة


Bitcoin و Ethereum وحدهما ليسا سريعين للغاية ، ولكن هنا يجب أن ننتظر أولاً إيداع واحد بكل التأكيدات ، ثم الثانية.

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

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

خصوصية


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

عندما يعلم التبادل بشؤونك - هذا أمر غير سارٍ للغاية ، وعندما يعرف الجميع عن ذلك - فهذا أمر غير سارة على نحو مضاعف.

الاستخدام


الحصان blockchain بشكل عام والأثير على وجه الخصوص. دعونا نرى ما هي حركات الجسم التي يتعين على البائع والمشتري القيام بها.

من وجهة نظر البائع ، كل شيء بسيط نسبيًا: تحتاج فقط إلى نقل Bitcoin إلى عنوان p2sh. مع الأثير كل شيء أصعب بكثير.

العقد
النظر في عقد مبادلة جيجابت المتوسط:

contract iERC20 { function totalSupply() public view returns (uint256); function transfer(address receiver, uint numTokens) public returns (bool); function balanceOf(address tokenOwner) public view returns (uint); function approve(address delegate, uint numTokens) public returns (bool); function allowance(address owner, address delegate) public view returns (uint); function transferFrom(address owner, address buyer, uint numTokens) public returns (bool); } contract Swapper { struct Swap { iERC20 token; bytes32 hash; uint amount; uint refundTime; bytes32 secret; } mapping (address => mapping(address => Swap)) swaps; function create(iERC20 token, bytes32 hash, address receiver, uint amount, uint refundTime) public { require(swaps[msg.sender][receiver].amount == 0); // check is swap with given hash already exists require(token.transferFrom(msg.sender, address(this), amount)); // transfer locked tokens to swap contract swaps[msg.sender][receiver] = Swap(token, hash, amount, refundTime, 0x00); //create swap } function hashOf(bytes32 secret) public pure returns(bytes32) { return sha256(abi.encodePacked(secret)); } function withdraw(address owner, bytes32 secret) public { Swap memory swap = swaps[owner][msg.sender]; require(swap.secret == bytes32(0)); require(swap.hash == sha256(abi.encodePacked(secret))); // swap exists swaps[owner][msg.sender].secret = secret; swap.token.transfer(msg.sender, swap.amount); } function refund(address receiver) public { Swap memory swap = swaps[msg.sender][receiver]; require(now > swap.refundTime); delete swaps[msg.sender][receiver]; swap.token.transfer(msg.sender, swap.amount); } } 

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

  • يجب على بوب استدعاء طريقة approve على عقد الرمز المميز ، مما يتيح لعقد المبادلة الوصول إلى الرموز المميزة له
  • يقوم بوب بإنشاء مقايضة وعقد باستخدام طريقة transferFrom يأخذ الرموز المرسل إلى عنوانه
  • أليس في withdraw يكشف عن سر ونقل العقد يدعو

لا تدعم معظم محافظ approve الرموز المميزة لسبب وجيه.

غالبًا ما يخطئ المستخدمون أنفسهم ويقومون ببساطة بنقل الرموز إلى العقد ، وبعد ذلك يتم فقد الرموز ببساطة. التعليقات على Etherscan مليئة البؤساء.

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

حامل الغاز


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

عقد ترقية
 contract Swapper { struct Swap { iERC20 token; address receiver; uint amount; address refundAddress; uint refundTime; } mapping (bytes32 => Swap) swaps; function create(iERC20 token, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime) public { require(swaps[hash].amount == 0); // use hash once require(token.transferFrom(msg.sender, address(this), amount)); swaps[hash] = Swap(token, receiver, amount, refundAddress, refundTime); } function withdraw(bytes memory secret) public { bytes32 hash = sha256(secret); Swap memory swap = swaps[hash]; require(swap.amount > 0); delete swaps[hash]; swap.token.transfer(swap.receiver, swap.amount); } function refund(bytes32 hash) public { Swap memory swap = swaps[hash]; require(now > swap.refundTime); delete swaps[hash]; swap.token.transfer(swap.refundAddress, swap.amount); } } 


ازدواج مفتاح العقد و EIP 712


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

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

الآن ، يمكن لأي شخص أن يرعى عمولة أحد الأعضاء ، ولكن الشخص الوحيد الذي يعرف المفتاح هو الذي يتخذ القرار.

عقد بوب
 library EIP712ProxyLibrary { function hashCommand(address sender, iERC20 token, Swapper swapper, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime) public view returns(bytes32); } contract ProxyBob { address owner; constructor(address _owner) public { owner = _owner; } function createSwap(Swapper swapper, iERC20 token, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime, uint8 v, bytes32 r, bytes32 s) public { require(owner == ecrecover(EIP712ProxyLibrary.hashCommand(address(this), token, swapper, hash, receiver, amount, refundAddress, refundTime), v, r, s)); token.approve(address(swapper), amount); swapper.create(token, hash, receiver, amount, refundAddress, refundTime); } } 


لدى Ethereum معيار EIP 712 للعمل مع توقيعات هياكل البيانات المعقدة ، ويمكنك قراءة المزيد عنها في مدونة محفظة Metamask.

فرق تسد


غالبًا ما يبدو سيناريو اختراق عقد Ethereum كما يلي:

  • يدفع المشارك الأموال للعقد
  • ثم يأخذ المال
  • هناك خطأ ما
  • مهاجم يأخذ المال مرارا وتكرارا

إذا عدنا إلى المثال الأول ، فسيحدث خطأ ما إذا كان اللغز عبارة عن مجموعة بايت فارغة.

كيف تسرق مليون
إنشاء مبادلة 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925
هذا هو sha256 من 0x0000000000000000000000000000000000000000000000000000000000000000
نعبر السر ونجمع الرموز الخاصة بنا
نمر بها مرة أخرى ونأخذ الغرباء ، كل ذلك بسبب 0 = 0

من خلال إنشاء عقد منفصل لكل معاملة ، يمكننا عزل العقود على مستوى EVM.

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

العقود المهجورة و create2


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

هل من الممكن كسب المال في الصباح وبايتات في المساء؟

في مفترق طرق القسطنطينية ، أضاف مطورو EIP 1014 عبارة create2 تنشئ عقدًا جديدًا في عنوان حتمية

 keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:] 

حيث

  • العنوان - عنوان عقد المصنع
  • الملح - بعض الأرقام ، ما الذي سنتعلمه في السلسلة التالية
  • init_code - معلمة الكود الثنائي والمعلِّم الخاص بالعقد.

المصنع
التعليمات لا تعمل إلا من خلال التجميع ، وبالتالي فإن المصنع يبدو مخيفًا بعض الشيء:

 contract Factory { event Deployed(address addr, uint256 salt); function create2(bytes memory code, uint256 salt) public { address addr; assembly { addr := create2(0, add(code, 0x20), mload(code), salt) } emit Deployed(addr, salt); } } 

يمكن الحصول على رمز العقد الخاص بك باستخدام web3:

 const MyContract = new web3.eth.Contract(ABI, {}) const ode = MyContract.deploy({ data: BYTECODE, arguments: contructorArgs }).encodeABI(); const factory = new web3.eth.Contract(FACTORY_ABI, factoryAddress); tx = factory.methods.create2(ode, salt); 

بسبب محدودية الدعم في الصلابة ، قد لا يتم احتساب الغاز للعقد بشكل صحيح بسبب بعض التفاصيل الدقيقة للإثير.

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

الآن يمكننا نقل الرموز المميزة إلى العقود دون إنشائها مقدمًا ، وإلى أن ننشرها على الشبكة ، لن يخمن أحد ما يفعله العقد بالضبط.

الغراب لن ينقر الغراب


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

كيفية التأكد من أن التجزئة لا تضيء؟

نقوم بنقل المبادلة نفسها إلى السلسلة: يتبادل المشاركون التوقيعات لنقلها إلى عقد مبادلة ، ثم يتم الكشف عن السر بشكل خاص.

خطوة بخطوة
يتم إنشاء "multisig" اثنين ، والتي يمكنك من خلالها سحب الأموال إذا كان لديك توقيعات Alice و Bob.

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

أليس وبوب يقومان بعمل ودائع بشكل متواز

  • أليس تصنع سرًا وتتيح لبوب تجزئة السر وتوقيع المعاملة التي تنقل عملات البيتكوين إلى عنوان المبادلة
  • بوب يعطي أليس توقيعًا على سحب الرموز المميزة بعقد المبادلة مع علامة تجزئة خفية.
  • أليس تخبر بوب السر.


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

بالنسبة إلى مراقب خارجي ، يبدو أن الأموال قد تم التعاقد عليها مع توقيع متعدد 2 من 2.

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

المستوى 2


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

الآن ستتمكن أليس وبوب من الالتفاف مع القوة والرئيسية. على سبيل المثال ، قم تلقائيًا بحساب متوسط ​​السعر من خلال استبدال Satoshi بالثانية ، أو قم ببساطة بربط صانع السوق ومستلم السيولة مباشرة.

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


الآن لدينا إمكانية الوصول إلى تداول P2P عالي السرعة ، الشيء الرئيسي هو مراقبة الوقت وإغلاق الصفقة قبل انتهاء المهلة.

ومع ذلك ، بعد تعديل العقود بشكل طفيف ، يمكننا أن نعطي قنواتنا الخلود ، الأمر الذي سيؤدي إلى تبسيط إنشاء شبكة خاصة بنا.

لكن سنتحدث عن هذا في السلسلة التالية.

Source: https://habr.com/ru/post/ar483828/


All Articles