كيفية تطبيق مستقل (إثبات الوجود) في 2 خطوات

مرحبا بالجميع! اسمي Ararat وأنا أعمل في QuantNet ، التي تحمل مسابقات لاستراتيجيات حسابية. في الآونة الأخيرة ، ظهرت مهمة هامة أمامي - وهي تقديم ضمانات لحرمة تواريخ المستخدمين (هذا أمر بالغ الأهمية ، لأنه من أجل التحقق من فعالية الاستراتيجيات بشكل صحيح ، من الضروري استخدام البيانات من الأسواق المالية العالمية في الوقت الحقيقي).

هذا هو المكان الذي صادفت فيه مفهوم PoE (إثبات الوجود). لقد كتب ما يكفي عن ذلك على الإنترنت ، لكن تفاصيل المنصة جعلتني أفكر قليلاً. لذلك ، قررت أن أكتب هذا المقال وأن أشارك تجربتي في هندسة وتنفيذ PoE. أعتقد أنه سيكون مناسبًا بشكل خاص للرجال fintech.

لقد قسمت مقالي إلى 3 كتل رئيسية:

  • ما هو بو ومتى قد تكون هناك حاجة إليها
  • خوارزمية التنفيذ
  • الحل لحالتي محددة

إذن ما هو إثبات الوجود؟


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

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

كيف يمكن ضمان ذلك؟ الحق ، وتنفيذ بو.

بو خوارزمية التنفيذ


تحتاج أولا:

  1. قم بإعداد الملف الذي تريد براءات الاختراع. (فعلت ملف PDF ، لكن يمكنك استخدام أي حاوية أخرى).
  2. الحصول على التجزئة للملف المحدد (استخدمت تنسيق sha256).

فقط في الحالة ، فإن التجزئة عبارة عن "بصمة" فردية للملف ، مما يضمن عدم وجود مصادفة (كاملة تقريبًا) مع صدفة ملف آخر. عندما تتلقى التجزئة من الملف ، سيكون عليك فقط إنشاء معاملة على شبكة blockchain ، مما يشير إلى تجزئة المستند في نص المعاملة.

هذا كل شيء. مع مقدمة الانتهاء. الآن نمر إلى الأكثر إثارة للاهتمام.

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

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

أقترح تقسيم التنفيذ إلى جزأين:

  1. إعداد عقد ذكي ومحفظة الأثير.
  2. إنشاء معاملة في رمز Node.js والمفتاح الخاص.

دعنا نذهب بالترتيب:

الجزء الأول: إعداد عقد ومحفظة Ethereum Smart

كان PoE نفسه مرتبطًا أولاً بـ blockcoin Bitcoin. لكنني اخترت الأثير blockchain والعقود الذكية للتنفيذ. العقود الذكية تمنحك المرونة والمرونة والقابلية للتوسعة في المستقبل ، حيث تعمل كمخزن للتجزئة في سلسلة المفاتيح.

لقد اخترت عقدًا ذكيًا بسيطًا يمكنه قبول التجزئة مع تاريخ مناسب ، وتنسيق hash => date ، كما أنه سيكون من الرائع أن يكون هناك طريقة لإرجاع تاريخ التجزئة عند الاتصال. بالإضافة إلى ذلك ، سيكون من الجيد توخي الحذر لأن مالك العقد هو الوحيد الذي كان قادرًا على إضافة علامات تجزئة جديدة.

رمز العقد الذكي:

``` pragma solidity 0.5.9; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @title HashStore * @dev The contract store the hashes and returns date by hash * Only the owner can add new hashes */ contract HashStore is Ownable { mapping(bytes32 => uint256) private _hashes; event HashAdded(bytes32 hash); function addHash(bytes32 rootHash) external onlyOwner { require(_hashes[rootHash] == 0, "addHash: this hash was already deployed"); _hashes[rootHash] = block.timestamp; emit HashAdded(rootHash); } function getHashTimestamp(bytes32 rootHash) external view returns (uint256) { return _hashes[rootHash]; } } ``` 

كما لاحظت بالفعل ، استخدمنا عقدين منفصلين: Ownable و HashStore.
عقد HashStore مسؤول عن تخزين التجزئة وإصدار تاريخ التجزئة عند الطلب. عقد Ownable مسؤول عن التحقق من أن التجزئة الجديدة تمت إضافتها حصريًا بواسطة مالك العقد.

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

 require(_hashes[rootHash] == 0, "addHash: this hash was already deployed"); 

يمكننا الحصول على تاريخ معاملة التجزئة باستخدام طريقة getHashTimestamp ، وتمرير التجزئة مع تاريخ المعاملة المطلوب كوسيطة. الأسلوب getHashTimestamp بإرجاع الوقت بتنسيق UNIX. يمكنك ترجمة أي تنسيق أكثر قابلية للقراءة.

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

  1. عنوان الأثير للتفاعل مع blockchain
  2. بعض الأثير لطرق الدعوة ونشر العقود.

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

الجزء 2: إنشاء المعاملات في Node.js والمفتاح الخاص

لذلك ، في هذه المرحلة لدينا بالفعل محفظة ether ومفتاحها السري وعقد في شبكة الاختبار وتجزئة البيانات. يبقى تكوين التفاعل مع blockchain.

للقيام بذلك ، سوف نستخدم مكتبة web3.js وننشئ رمزًا مميزًا للعقدة الخاصة بنا. أنا خلقت لي باستخدام infura.io الخدمة ويبدو شيء من هذا القبيل:

 ropsten.infura.io/v3/YOUR_TOKEN_HERE 

للتجزئة ، استخدم الحزمة sha256. يمكن أن يكون تنسيق البيانات موجودًا ، ولكن في المثال ، نستخدم البيانات في JSON.

كيف يمكنني حل حالتي باستخدام PoE؟


بالإضافة إلى امتلاك PoE ، كان من المهم بالنسبة لي ألا أفرط في تحميل المستخدمين مع blockchain ورسوم المعاملات ، على سبيل المثال ، تكلفة أسلوب addHash (bytes32 rootHash) تكلف 0.2 finney (0.0002 ETH أو 0.06 دولار بمعدل يونيو 2019).



تم إصدار حوالي 30 استنتاجًا لموقف الاستراتيجية يوميًا ، أي أنه يكلفنا 2.1 دولار. إذا زاد عدد المستخدمين 100 مرة ، وارتفع معدل الأثير ، فسترتفع التكلفة بالطبع.

قررت أن تبقي واحدة تجزئة على blockchain لمدة يوم. سيتم إنشاء هذا التجزئة من تجزئة المخرجات الاستراتيجية اليومية ومعرفاتها الداخلية.



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

في النهاية


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

 ```   : 1.    API       1.     2.    API  ,         3.          ,              .          . ``` 

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


All Articles