التسلسل الهرمي للمحفظة متعددة الإشارات (نظام الثقة)

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

المحتويات


1 مقدمة
2 وصف المحفظة متعددة التوقيع
3 طرق لبناء التسلسل الهرمي للمحفظة
4 واجهة متعددة التسلسل الهرمي للمحفظة
5 تيارات التفاعل
5.1 تدفق التفاعل القياسي
5.2 تدفق التفاعل الآمن
5.3 تدفق التفاعل المثير للجدل
6 بروتوكول ESCB9
7 تكامل نظام الثقة والعقود الذكية تنفيذ بروتوكول ESCB9
8 أمثلة على العقود التي تنفذ ESCB9
8.1 عقد ذكي لسوق الإيجار الخاص ، على غرار مثال AirBnb
8.2 عقد ذكي لتبادل أي عملة مشفرة مقابل أموال الورقية والعودة في وضع لامركزي
9 عقد التحكيم
10 قاموس

1. مقدمة


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

2. وصف المحفظة متعددة التوقيع


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

يمكن تمثيل واجهة العقد الذكي لمثل هذا التجريد على النحو التالي:

  1. يقبل المنشئ عناوين الأعضاء المؤسسين وعدد الحد الأدنى من التأكيدات المطلوبة للمعاملات
    constructor(address[]:members, uint256:requiredConfirmationCount) 

  2. واجهة مشارك مفوض
    1. الحصول على قائمة المشاركين
       static getMembers() -> address[]:address 

    2. عرض عنوان العضو
       static getMember(uint256:indexNumber) -> address:address 

    3. التحقق من عنوان العضوية
       static isMember(address:address) -> bool:value 

    4. الحصول على أكبر عدد ممكن من المشاركين في المحفظة
       static getMaxMemberCount() -> uint256:value 

    5. تأكيد الحد الأدنى من الإجماع
       static getRequiredConfirmationCount() -> uint256:value 

    6. حدث إضافة عضو جديد
       event MemberAddition() -> address:member 

    7. حدث حذف العضو
       event MemberRemoval() -> address:member 

    8. مطلوب تغيير حدث عدد من التأكيدات لتنفيذها
       event RequiredConfirmationCountChange() -> uint256:count 

    9. إضافة عضو
       execute addMember(address:member) -> void:value 

    10. حذف العضو
       execute removeMember(address:member) -> void:value 

    11. استبدال العضو
       execute replaceMember(address:currentMember, address:newMember) -> void:value 
    12. تغيير في عدد التأكيدات الإلزامية للتنفيذ
       execute changeRequiredConfirmationCount(uint256:count) -> void:value 


  3. واجهة المعاملات
    1. التحقق من تأكيد المعاملة على عنوان المشارك
       static getConfirmationByAddress(uint256:indexNumber, address:addressMember) -> bool:value 

    2. الحصول على معلومات من معاملة
       static getTransactionInfo(uint256:indexNumber) -> [address:destination, uint256:value, bytes:data, bool:executed] 
    3. الحصول على العدد الإجمالي للمعاملات في هذه المحفظة
       static getTransactionCount() -> uint256:value 
    4. تلقي حالة تأكيد المعاملة
       static isConfirmed(uint256:transactionId) -> bool:value 
    5. تلقي عدد التأكيدات
       static getConfirmationCount(uint256:transactionId) -> uint256:count 
    6. الحصول على عدد المعاملات حسب النوع
       static getTransactionCount(bool:pending, bool:executed) -> uint256:count 
    7. الحصول على قائمة المشاركين الذين أكدوا المعاملة
       static getConfirmations(uint256:transactionId) -> address[]:confirmations 
    8. الحصول على قائمة معرف المعاملة حسب النوع في فترة زمنية معينة
       static getTransactionIds(uint256:from, uint256:to, bool:pending, bool:executed) -> uint256[]:transactionIds 
    9. حدث تأكيد معاملة الطرف
       event Confirmation() -> [address:sender, uint256:transactionId, uint256:timeStamp] 
    10. حدث سحب تأكيد مشارك قبل المعاملة
       event Revocation() -> [address:sender, uint256:transactionId, uint256:timeStamp] 
    11. إضافة معاملة قائمة الانتظار حدث
       event Submission() -> [uint256:transactionId] 
    12. حدث تنفيذ المعاملات
       event Execution() -> [uint256:transactionId] 
    13. حدث خطأ في المعاملة
       event ExecutionFailure -> [uint256:transactionId] 
    14. حدث تجديد المحفظة
       event Deposit -> [address:sender, uint256:amount] 
    15. إضافة معاملة العضو
       execute submitTransaction(address:destination, uint256:value, bytes:data) -> uint256:transactionId 
    16. تأكيد المعاملة من قبل المشارك
       execute confirmTransaction(uint256:transactionId) -> void:value 
    17. سحب التأكيد من قبل المشارك
       execute revokeConfirmation(uint256:transactionId) -> void:value 
    18. معاملة يدوية
       execute executeTransaction(uint256:transactionId) -> void:value 



3 طرق لبناء التسلسل الهرمي للمحفظة


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

4 واجهة متعددة التسلسل الهرمي للمحفظة


لبناء نظام ثقة ، من الضروري توسيع الواجهة البسيطة للمحفظة متعددة الاشتراكات الموضحة أعلاه ، وإضافة آليات لتنظيم التسلسل الهرمي والتنفيذ التلقائي للتأكيدات ، بالإضافة إلى إمكانية التنفيذ المؤجل.
  1. يقبل المنشئ عنوان المحفظة الأم ، وعناوين الأعضاء المؤسسين ، وعدد الحد الأدنى من التأكيدات المطلوبة للمعاملات ، والوقت القياسي للتأكيدات التلقائية في ثوان
     constructor(address:parent, address[]:members, uint256:requiredConfirmationCount, uint256:standardTimeAutoConfirmation) 

  2. واجهة العضو
    1. الحصول على قائمة المشاركين
       static getMembers() -> address[]:address 

    2. وظيفة لعرض عنوان المشارك
       static getMember(uint256:indexNumber) -> address:address 

    3. التحقق من عنوان العضوية
       static isMember(address:address) -> bool:value 

    4. الحصول على أكبر عدد ممكن من المشاركين في المحفظة
       static getMaxMemberCount() -> uint256:value 

    5. تأكيد الحد الأدنى من الإجماع
       static getRequiredConfirmationCount() -> uint256:value 

    6. حدث إضافة عضو جديد
       event memberAddition() -> address:member 

    7. حدث حذف العضو
       event memberRemoval() -> address:member 

    8. مطلوب تغيير حدث عدد من التأكيدات لتنفيذه
       event requiredConfirmationCountChange() -> uint256:count 

    9. إضافة عضو
       execute addMember(address:member) -> void:value 

    10. حذف العضو
       execute removeMember(address:member) -> void:value 

    11. استبدال العضو
       execute replaceMember(address:currentMember, address:newMember) -> void:value 

    12. تغيير في عدد التأكيدات الإلزامية للتنفيذ
       execute changeRequiredConfirmationCount(uint256:count) -> void:value 


  3. واجهة التسلسل الهرمي
    1. الحصول على قائمة محافظ الأطفال
       static getChildren() -> address[]:wallets 

    2. تحقق مما إذا كان عنوان المحفظة تابعًا للحافظة الحالية
       static isChild() -> bool:value 

    3. التحقق مما إذا كان عنوان المحفظة أبويًا للعنوان الحالي يتم من خلال isChild من خلال مقارنته.
    4. حدث مرفق محفظة التابعة
       event childAttachment() -> [address:address,uint256:timeStamp] 

    5. حدث إزالة محفظة الطفل
       event childRemoval() -> [address:address,uint256:timeStamp] 

    6. وضع محفظة أطفال
       execute attachChild(addres:child) -> void:value 

    7. حذف محفظة الأطفال
       execute removeChild(address:address) -> void:value 

    8. تغيير محفظة طفل إلى آخر
       execute replaceChild(address:newAddress) -> void:value 


  4. واجهة المعاملات
    1. تحقق من حالة المعاملة
       static getTransactionStatus(uint256:transactionId) -> enum:{submitted,completed,frozen,disputed,reverted} 

    2. التحقق من حالة المعاملة للامتثال
       static isTransactionStatus(uint256:transactionId, uint256:enumStatusNumber) -> bool:value 

    3. التحقق من تأكيد المعاملة على عنوان المشارك
       static getConfirmationByAddress(uint256:transactionId, address:addressMember) -> bool:value 

    4. الحصول على معلومات من معاملة
       static getTransactionInfo(uint256:transactionId) -> [address:destination, uint256:value, bytes:data, bool:executed] 

    5. الحصول على العدد الإجمالي للمعاملات في المحفظة
       static getTransactionCount() -> uint256:value 

    6. تلقي حالة تأكيد المعاملة
       static isConfirmed(uint256:transactionId) -> bool:value 

    7. تلقي عدد التأكيدات
       static getConfirmationCount(uint256:transactionId) -> uint256:count 

    8. الحصول على عدد المعاملات حسب النوع
       static getTransactionCount(bool:pending, bool:executed) -> uint256:count 

    9. الحصول على قائمة المشاركين الذين أكدوا المعاملة
       static getConfirmations(uint256:transactionId) -> address[]:confirmations 

    10. الحصول على وقت للتأكيد التلقائي
       static getTimeAutoConfirmation(uint256:transactionId) -> uint256:timestamp 

    11. الحصول على قائمة معرف المعاملة حسب النوع في فترة زمنية معينة
       static getTransactionIds(uint256:from, uint256:to, bool:pending, bool:executed) -> uint256[]:transactionIds 

    12. حدث تأكيد معاملة الطرف
       event Confirmation() -> [address:sender, uint256:transactionId, uint256:timeStamp] 

    13. حدث تأكيد المعاملة التلقائي
       event AutoConfirmation() -> [uint256:transactionId, uint256:timeStamp] 

    14. حدث سحب تأكيد مشارك قبل المعاملة
       event Revocation() -> [address:sender, uint256:transactionId, uint256:timeStamp] 

    15. إضافة معاملة قائمة الانتظار حدث
       event Submission() -> [uint256:transactionId] 

    16. حدث تنفيذ المعاملات
       event Execution() -> [uint256:transactionId] 

    17. حدث خطأ في المعاملة
       event ExecutionFailure -> [uint256:transactionId] 

    18. تغيير حالة المعاملة إلى الحدث المجمد
       event TransactionFrozen -> [uint256:transactionId] 

    19. تغيير حالة المعاملة إلى حدث مثير للجدل
       event TransactionDisputed -> [uint256:transactionId] 

    20. تغيير حالة المعاملة إلى الحدث المرتجع
       event TransactionReverted -> [uint256:transactionId] 

    21. حدث تجديد المحفظة
       event Deposit -> [address:sender, uint256:amount] 

    22. إضافة معاملة للتنفيذ
       execute submitTransaction(address:destination, uint256:value, uint256:TimeAutoConfirmation, bytes:data) -> uint256:transactionId 

    23. تأكيد المعاملة
       execute confirmTransaction(uint256:transactionId) -> void:value 

    24. تأكيد الإبطال
       execute revokeConfirmation(uint256:transactionId) -> void:value 

    25. تغيير حالة المعاملة إلى المجمدة
       execute setTransactionStatus(uint256:transactionId, uint256:enumStatusNumber) -> void:value 

    26. معاملة يدوية
       execute executeTransaction(uint256:transactionId) -> void:value 


  5. إدارة التصنيف
    1. الحصول على تصنيف في
       static getRatingByAddress(address:agent) -> [uint256:negativeRating, uint256:positiveRating, uint256:countRatingRecords] 

    2. الحصول على سجل التصنيف حسب العنوان والرقم التسلسلي
       static getRatingRecordForAddress(address:agent, uint256:indexNumber) -> void:value 

    3. حدث إضافة سجل إلى التصنيف في
       event RatingRecordAdded -> [address:author, address:agent, bytes32:smartContractAddress, bool:positiveOrNegative, uin256:ratingNumber, bytes:comment, uint256:indexNumber] 

    4. إضافة سجل لتصنيف العنوان
       execute addRatingRecord(address:agent, bytes32:smartContractAddress, bool:positiveOrNegative, uin256:ratingNumber, bytes:comment) -> void:value 


  6. التكامل مع بروتوكول ESCB9
    1. التحقق في العنوان ما إذا كان العقد الذكي المرفق بهذه المحفظة هو عقد ذكي مع تنفيذ ESCB9
        static isAttachedESCB9SmartContract(address:smartContract) -> bool:result 

    2. التحقق من حالة الإيداع لعقد ذكي مع ESCB9 المرفق بهذه المحفظة
        static getDepositStatusForESCB9SmartContract(address:smartContract) -> enum:{awaiting,founded,returned} 

    3. حدث إرفاق عقد ذكي مع تنفيذ محفظة ESCB9
       event AttachingESCB9SmartContract -> [address:smartContract] 

    4. حدث إيداع للعقد الذكي مع التنفيذ المرفق لمحفظة ESCB9
       event ConfirmationForDepositESCB9SmartContract -> [address:smartContract, uint256:sum, bytes:notice] 

    5. إرفاق عقد ذكي مع تنفيذ ESCB9 في المحفظة
       execute attachESCB9SmartContract(address:smartContract) -> void:value 

    6. تأكيد الإيداع للعقد الذكي مع تنفيذ ESCB9. إذا كان الإيداع في النظام الخارجي ، فسيكون للإعلان تسمية. إذا كان الإيداع في ETH ، فسيتم إرسال مبلغ الإيداع عند تنفيذ الطريقة.
       execute fundDepositForESCB9SmartContract(address:smartContract, uint256:sum, bytes:notice) -> void:value 




5 تيارات التفاعل


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

كل محفظة في نظام الثقة لديها عدد من المشاركين المفوضين ، الذين يصدرون قرارًا. لسبب بسيط ، سوف نجمع بين جميع المشاركين المصرح لهم في المحفظة في مفهوم واحد - الحكم .

5.1 تدفق التفاعل القياسي


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

5.2 تدفق التفاعل الآمن


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

5.3 تدفق التفاعل المثير للجدل


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

6 بروتوكول ESCB9


مثال على بروتوكول ESCB9 في Solidity كعقد ذكي مجرد (البروتوكول قيد التطوير وقابل للتغيير)
 contract ESCB9 { /** * Modificator for arbitrage */ modifier onlyArbitrage() { require(msg.sender == arbitrage()); _; } /** * Modificator for checking deposit status */ modifier isDeposited { uint i; bytes memory _funcName = bytes4(keccak256("getDepositStatusForESCB9SmartContract(address)")); bytes memory _concat = new bytes(_funcName.length + 32); for(i=0; i < address(this).length; i++) { _concat[i] = address(this)[i]; } require(arbitrage().call.value(0)(_concat) == 1); // “founded” for enum _; } event confirmed(uint256 unixtimestamp, bytes32 notice); event frozen(uint256 unixtimestamp, bytes32 notice); event disputed(uint256 unixtimestamp, bytes32 notice); event canceled(uint256 unixtimestamp, bytes32 notice); /** * @notice Function to approve escrow deal and confirm success * @return Success of operation **/ function confirm(notice) public onlyArbitrage returns(bool); /** * @notice Function to freeze escrow deal * @return Success of operation **/ function freeze(notice) public onlyArbitrage returns(bool); /** * @notice Function to dispute escrow deal * @return Success of operation **/ function dispute(notice) public onlyArbitrage returns(bool); /** * @notice Function to cancel escrow deal and confirm fail * @return Success of operation **/ function cancel(notice) public onlyArbitrage returns(bool); /** * @notice Function to get seller's address * @return Seller's address **/ function seller() public returns(address); /** * @notice Function to get custom type for ESCB9 smart contract * @return Type **/ function type() public returns(bytes); /** * @notice Function to get buyer's address * @return Buyer's address **/ function buyer() public returns(address); /** * @notice Function to get sum for deal * @return Sum of deal in wei **/ function depositedSum() public returns(uint256); /** * @notice Function to get arbitrage's address * @return Arbitrage's address **/ function arbitrage() public returns(address); } 


7 تكامل نظام الثقة والعقود الذكية تنفيذ بروتوكول ESCB9


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

8 أمثلة على العقود التي تنفذ ESCB9


8.1 عقد ذكي لسوق الإيجار الخاص ، على غرار مثال AirBnb


 // Don't use this code, it can be not working or contain the vulnerability, for demonstration purpose only pragma solidity ^0.4.21; /// @title rentMyApartmentESCB9 - Allows rent object on market with escrow service. The safe way to do deal for counterparties. /// @author Konstantin Viktorov - <ceo@escrowblock.net> contract rentMyApartmentESCB9 is ESCB9 { // 2018-05-10 18:25 in unix timestamp uint256 constant public checkInTime = 1525965900; // 2018-05-20 18:25 in unix timestamp uint256 constant public checkOutTime = 1526829900; // Coordinates in bytes format. For example 56.865129,35.881540 bytes constant public coordinates = "0x35362e3836353132392c33352e383831353430"; // Google maps link, as example, but better add Url to landing page bytes constant public externalUrl = "0x68747470733a2f2f676f6f2e676c2f6d6170732f6e783563396b6737384170"; /** * Encrypted information, see https://github.com/ethereumjs/ethereumjs-wallet and * https://github.com/pubkey/eth-crypto/blob/master/tutorials/encrypted-message.md * For example you can leave here information about pin-code for smart lock **/ bytes constant private privateInformation = '0x0dfef623523483245687234'; modifier only_before_check_in { require(getNow() < checkInTime); _; } modifier only_after_check_out { require(getNow() > checkOutTime); _; } modifier only_during_renting { require(getNow() > checkInTime && getNow() < checkOutTime); _; } modifier only_not_in_during_renting { require(getNow() < checkInTime && getNow() > checkOutTime); _; } /** * @notice ESCB9 interface * @notice Function to get address of apartment owner * @return Seller's address **/ function seller() public returns(address) { return "0x27a36731337cdee360d99b980b73e24f6e188618"; } /** * @notice ESCB9 interface * @notice Function to get custom type for ESCB9 smart contract * @return Type **/ function type() public returns(bytes) { return "rent"; } /** * @notice ESCB9 interface * @notice Function to get address of renter * @return Buyer's address **/ function buyer() public returns(address) { return "0xb582baaF7e749d6aA98A22355A9d08B4c4d013C8"; } /** * @notice ESCB9 interface * @notice Function to get sum for deal * @return Sum of deal in wei **/ function depositedSum() public returns(uint256) { return 1000000000000000000; //1 ETH in weis } /** * @notice ESCB9 interface * @notice Function to get arbitrage's address * @return Arbitrage's address **/ function arbitrage() public returns(address) { return "0xe91065d8bb2392121a8fbe6a81e79782fbc89dd4"; } /** * @notice ESCB9 interface * @notice Function to approve escrow deal and confirm success * @param Some comment * @return Success of operation **/ function confirm(notice) public onlyArbitrage only_after_check_out returns(bool) { confirmed(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to freeze escrow deal * @param Some comment * @return Success of operation **/ function freeze(notice) public onlyArbitrage only_during_renting returns(bool) { frozen(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to dispute escrow deal * @return Success of operation **/ function dispute() public onlyArbitrage only_after_check_out returns(bool) { disputed(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to cancel escrow deal and confirm fail * @return Success of operation **/ function cancel() public onlyArbitrage only_not_in_during_renting returns(bool) { canceled(getNow(), notice); } /** * @notice Get current unix time stamp **/ function getNow() constant public returns (uint) { return now; } /** * @notice Get private information when renter will pay deposit **/ function getPrivateInformation() constant isDeposited public returns (bytes) { return privateInformation; } } 


8.2 عقد ذكي لتبادل أي عملة مشفرة مقابل أموال الورقية والعودة في وضع لامركزي


يتيح لك مثال العقد الذكي الموضح أدناه استبدال BTC مقابل النقود الورقية مباشرة ، بدون مشاركة المبادلات وخدمات الطرف الثالث. يقوم البائع BTC بتحويل المبلغ في العقد الذكي إلى الإيداع في blockchain BTC. بعد تأكيد الإيداع من قبل الحكم ، يقوم المشتري تلقائيًا بتحويل المبلغ المنصوص عليه في العقد إلى الحساب أو رقم البطاقة البلاستيكية المدرجة في العقد. يجوز للمحكم التدخل في المعاملة بعد استئناف أحد المشاركين. في البداية ، سيتم تجميد الإيداع وإذا لم يتفق الطرفان بتوافق الآراء ، فإن هذا العقد سيصبح محل نزاع مع مزيد من القرار بشأن تدفق التفاعل المتنازع عليه.
 // Don't use this code, it can be not working or contain the vulnerability, for demonstration purpose only pragma solidity ^0.4.21; /// @title p2pExchangeESCB9 - Allows exchanging any cryptocurrencies on fiat money and back, directly between users. The safe way to do deal for counterparties. /// @desc This example shows as exchange fiat money on BTC (forward flow) /// @author Konstantin Viktorov - <ceo@escrowblock.net> contract p2pExchangeESCB9 is ESCB9 { // in minimal decimals, for example, 500.000 rubles is equal 50000000 kopeks uint256 constant public inputAmount = 50000000; // RUR in bytes bytes constant public inputCurrency = "0x525552"; // in minimal decimals, for example, 1 BTC is equal 100000000 satoshi uint256 constant public outputAmount = "100000000"; // BTC in bytes bytes constant public outputCurrency = "0x425443"; // Deposit can be place only before this time const bytes public closeTime = "1526829900"; // use "forward" way, when output currency will be deposited or "backward" if input currency will be deposited uint256 constant public depositWay = "forward"; /** * Encrypted information, see https://github.com/ethereumjs/ethereumjs-wallet and * https://github.com/pubkey/eth-crypto/blob/master/tutorials/encrypted-message.md **/ /** * Encrypted information for placing deposit, for example BTC address **/ bytes private externalDepositAddress = "0x3139333978476346484d6f464b465845564754415761706b3537694e6a3579556b52"; /** * Encrypted information for the amount of deposit, for example for BTC 8 decimals can be added 2-3 chars from 0-9 as pin-code for deal. See more in EscrowBlock WhitePaper * If output amount is equal 100000000, then deposited amount can be 100000123 **/ bytes private externalDepositAmount = "0x5f5e17b"; /** * Encrypted information for sending amount to seller, for example credit card number or bank account, for example 4242424242424242 **/ bytes private externalIncomingAddress = "0xf12765df4c9b2"; modifier only_before_close_time { require(getNow() < closeTime); _; } modifier only_after_close_time { require(getNow() > closeTime); _; } /** * @notice ESCB9 interface * @notice Function to get address of apartment owner * @return Seller's address **/ function seller() public returns(address) { return "0x27a36731337cdee360d99b980b73e24f6e188618"; } /** * @notice ESCB9 interface * @notice Function to get custom type for ESCB9 smart contract * @return Type **/ function type() public returns(bytes) { return "exchange"; } /** * @notice ESCB9 interface * @notice Function to get address of renter * @return Buyer's address **/ function buyer() public returns(address) { return "0xb582baaF7e749d6aA98A22355A9d08B4c4d013C8"; } /** * @notice ESCB9 interface * @notice Function to get sum for deal * @return Sum of deal in minimal decimals **/ function depositedSum() public returns(uint256) { rerurn outputAmount; } /** * @notice ESCB9 interface * @notice Function to get arbitrage's address * @return Arbitrage's address **/ function arbitrage() public returns(address) { return "0xe91065d8bb2392121a8fbe6a81e79782fbc89dd4"; } /** * @notice ESCB9 interface * @notice Function to approve escrow deal and confirm success * @param Some comment * @return Success of operation **/ function confirm(notice) public onlyArbitrage only_after_close_time returns(bool) { confirmed(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to freeze escrow deal * @param Some comment * @return Success of operation **/ function freeze(notice) public onlyArbitrage only_after_close_time returns(bool) { frozen(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to dispute escrow deal * @return Success of operation **/ function dispute() public onlyArbitrage only_after_close_time returns(bool) { disputed(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to cancel escrow deal and confirm fail * @return Success of operation **/ function cancel() public onlyArbitrage only_before_close_time returns(bool) { canceled(getNow(), notice); } /** * @notice Get current unix time stamp **/ function getNow() constant public returns (uint) { return now; } /** * @notice Get private information for buyer when seller sent deposit **/ function getExternalIncomingAddress() constant isDeposited public returns (bytes) { return externalIncomingAddress; } /** * @notice Get private information about amount for seller for sending deposit **/ function getExternalDepositAmount() constant public returns (bytes) { return externalDepositAmount; } /** * @notice Get private information about address for seller for sending deposit **/ function getExternalDepositAddress() constant public returns (bytes) { return externalDepositAddress; } } 


9 عقد التحكيم


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

10


Ethereum هي تقنية مفتوحة المصدر تسمح لك بإنشاء سلسلة معاملات لامركزية ثابتة. يمكن تنفيذ كل معاملة بشروط معينة مسجلة في عقد ذكي.
عقد ذكي - مكتوب بلغة Solidity ، المنطق الذي يتم تنفيذه في جهاز Ethereum الظاهري ، والذي يسمح لك بتوسيع منطق المعاملات.
المحفظة متعددة التوقيع (حكم) هي عقد ذكي خاص تتحكم فيه مجموعة من المشاركين المعتمدين الذين يمكنهم تأكيد أو إلغاء المعاملات. باستخدام آلية المحافظ متعددة الاشتراكات ، يمكنك إنشاء سلسلة من بوابات المعاملات ومراقبة التنفيذ أو رد الأموال في الوقت المناسب.
– , , . . , .
– , , . . , .

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


All Articles