مرحبا بالجميع! اسمي Ararat وأنا أعمل في QuantNet ، التي تحمل مسابقات لاستراتيجيات حسابية. في الآونة الأخيرة ، ظهرت مهمة هامة أمامي - وهي تقديم ضمانات لحرمة تواريخ المستخدمين (هذا أمر بالغ الأهمية ، لأنه من أجل التحقق من فعالية الاستراتيجيات بشكل صحيح ، من الضروري استخدام البيانات من الأسواق المالية العالمية في الوقت الحقيقي).
هذا هو المكان الذي صادفت فيه مفهوم PoE (إثبات الوجود). لقد كتب ما يكفي عن ذلك على الإنترنت ، لكن تفاصيل المنصة جعلتني أفكر قليلاً. لذلك ، قررت أن أكتب هذا المقال وأن أشارك تجربتي في هندسة وتنفيذ PoE. أعتقد أنه سيكون مناسبًا بشكل خاص للرجال fintech.
لقد قسمت مقالي إلى 3 كتل رئيسية:
- ما هو بو ومتى قد تكون هناك حاجة إليها
- خوارزمية التنفيذ
- الحل لحالتي محددة
إذن ما هو إثبات الوجود؟
يساعد إثبات التواجد (حرفيًا ، إثبات الوجود) على إثبات أنه تم إنشاء مستند أو ملف أو بيانات في تاريخ ووقت محددين. أكبر تطبيق هو تسجيل براءات الاختراع. ولكن مما رأيته ، يتم تطبيقه في أغلب الأحيان في مناطق عند تقاطع التمويل وتكنولوجيا المعلومات.
مثال من مجال تداول الخوارزميات الخاص بي: لديك خوارزمية تعطي حوالي 70٪ من التوقعات الصحيحة للأسهم للأسبوعين المقبلين. أنت تقرر بيع توقعاتك للاعبين الآخرين في السوق. هذه النقطة صغيرة - لإقناع المشتري بأن توقعاتك صحيحة وتم إعدادها قبل نتائج المزايدة ، أي ضمان تنفيذها في وقت محدد.
كيف يمكن ضمان ذلك؟ الحق ، وتنفيذ بو.
بو خوارزمية التنفيذ
تحتاج أولا:
- قم بإعداد الملف الذي تريد براءات الاختراع. (فعلت ملف PDF ، لكن يمكنك استخدام أي حاوية أخرى).
- الحصول على التجزئة للملف المحدد (استخدمت تنسيق sha256).
فقط في الحالة ، فإن التجزئة عبارة عن "بصمة" فردية للملف ، مما يضمن عدم وجود مصادفة (كاملة تقريبًا) مع صدفة ملف آخر. عندما تتلقى التجزئة من الملف ، سيكون عليك فقط إنشاء معاملة على شبكة blockchain ، مما يشير إلى تجزئة المستند في نص المعاملة.
هذا كل شيء. مع مقدمة الانتهاء. الآن نمر إلى الأكثر إثارة للاهتمام.
(لمزيد من الوضوح ، قمت بإنشاء رمز خاص (فقط للمظاهرة). يمكنك الاطلاع على المثال التوضيحي للخدمة
هنا .)
دعونا نلقي نظرة فاحصة على كيفية عمل التجريبي.
أقترح تقسيم التنفيذ إلى جزأين:
- إعداد عقد ذكي ومحفظة الأثير.
- إنشاء معاملة في رمز Node.js والمفتاح الخاص.
دعنا نذهب بالترتيب:
الجزء الأول: إعداد عقد ومحفظة Ethereum Smart
كان PoE نفسه مرتبطًا أولاً بـ blockcoin Bitcoin. لكنني اخترت الأثير blockchain والعقود الذكية للتنفيذ. العقود الذكية تمنحك المرونة والمرونة والقابلية للتوسعة في المستقبل ، حيث تعمل كمخزن للتجزئة في سلسلة المفاتيح.
لقد اخترت عقدًا ذكيًا بسيطًا يمكنه قبول التجزئة مع تاريخ مناسب ، وتنسيق hash => date ، كما أنه سيكون من الرائع أن يكون هناك طريقة لإرجاع تاريخ التجزئة عند الاتصال. بالإضافة إلى ذلك ، سيكون من الجيد توخي الحذر لأن مالك العقد هو الوحيد الذي كان قادرًا على إضافة علامات تجزئة جديدة.
رمز العقد الذكي:
``` pragma solidity 0.5.9; contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(isOwner()); _; } function isOwner() public view returns (bool) { return msg.sender == _owner; } function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } 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. يمكنك ترجمة أي تنسيق أكثر قابلية للقراءة.
لذلك ، اكتشفنا العقد ، والآن تحتاج إلى نشره على الشبكة. للقيام بذلك ، نحتاج إلى شيئين:
- عنوان الأثير للتفاعل مع blockchain
- بعض الأثير لطرق الدعوة ونشر العقود.
حتى لا نضيع الأثير في الاختبارات ، يمكننا استخدام شبكة اختبار 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. , . . ```