قرارداد

ساخت وبلاگ

یک قرارداد توزیع شده روشی برای استفاده از بیت کوین برای ایجاد توافق با افراد از طریق زنجیره بلوک است. قراردادها چیزی را ممکن نمی کنند که قبلاً غیرممکن باشد ، بلکه به شما امکان می دهد مشکلات مشترک را به گونه ای حل کنید که اعتماد را به حداقل برساند. اعتماد حداقل اغلب با اجازه دادن به قضاوت های انسانی از حلقه ، امور راحت تر می شود ، بنابراین امکان اتوماسیون کامل فراهم می شود.

با ساختن پروتکل های اعتماد کم که با بیت کوین در تعامل هستند ، می توان محصولات کاملاً جدیدی را ایجاد کرد:

  • دارایی هوشمند املاک است که می تواند از طریق زنجیره بلوک به صورت اتمی معامله و وام شود.
  • املاک مجازی قابل انتقال موارد دیجیتالی هستند که قابل معامله هستند اما تکثیر نمی شوند.
  • نمایندگان برنامه های خودمختار هستند که کیف پول خود را حفظ می کنند ، که از آنها برای خرید زمان سرور استفاده می کنند. پول توسط خدمات فروش نماینده بدست می آید. اگر تقاضا بیش از عرضه باشد ، مأمورین می توانند بسته به اینکه آیا می توانند به اندازه کافی تجارت کنند ، کودکانی را که زنده می مانند یا می میرند ، تخم ریزی کند.
  • بازارهای توزیع شده راهی برای اجرای اوراق قرضه همسالان و تجارت سهام است و این امکان را می دهد تا بیت کوین به یک رقیب کامل به سیستم مالی بین المللی تبدیل شود.

در این صفحه همچنین نمونه های کوچکتر ذکر شده است.

بسیاری از ایده های اساسی قراردادهای بیت کوین برای اولین بار توسط Nick Szabó در مقاله اصلی وی ، رسمیت بخشیدن و تضمین روابط در شبکه های عمومی توصیف شده است. این صفحات توسط مایک هارن نوشته شده است. اگر ایده ای برای نوع جدید قرارداد دارید با او تماس بگیرید. شما می توانید ویدئویی از بحث در مورد قراردادهایی را که در کنفرانس بیت کوین 2012 در لندن ارائه شده است ، تماشا کنید.

فهرست

هشدار در مورد مکانیسم جایگزینی معامله Mempool

در مکان ها این صفحه به توانایی استفاده از قسمت Nequence برای جایگزینی Mempool Transaction اشاره دارد. این مکانیسم در سال 2010 غیرفعال شد و اخیراً کد به دلیل نگرانی از افرادی که از آن برای انجام حملات DOS استفاده می کنند ، کاملاً حذف شده است. مجریان باید این موضوع را در نظر بگیرند و سعی در ایجاد مکانیسم های قرارداد ایجاد کنند که در صورت تمایل به اجرای برنامه های خود با اجرای فعلی ، به جایگزینی Mempool اعتماد نکنند. اگر بیت کوین در آینده تغییر کند تا یک بار دیگر جایگزین Mempool شود ، این صفحه به روز می شود.

تئوری

هر معامله در بیت کوین دارای یک یا چند ورودی و خروجی است. هر ورودی/خروجی دارای یک تابع کوچک و خالص است که با آن به نام اسکریپت همراه است. اسکریپت ها می توانند حاوی امضایی بر روی اشکال ساده شده خود معامله باشند.

هر معامله می تواند زمان قفل مرتبط با آن داشته باشد. این اجازه می دهد تا معامله در انتظار و قابل تعویض باشد تا زمان آینده مورد توافق ، یا به عنوان یک شاخص بلوک یا به عنوان یک زمان سنج مشخص شود (همان زمینه برای هر دو استفاده می شود ، اما ارزش های کمتر از 500 میلیون به عنوان یک شاخص بلوک تفسیر می شوند). اگر به زمان قفل معامله رسیده باشد ، می گوییم نهایی است.

هر ورودی معامله دارای شماره دنباله است. در یک معامله عادی که فقط ارزش آن را به وجود می آورد ، شماره های دنباله همه uint_max و زمان قفل صفر است. اگر هنوز زمان قفل نرسیده است ، اما تمام شماره های دنباله uint_max هستند ، معامله نیز نهایی در نظر گرفته می شود. از شماره های دنباله می توان برای صدور نسخه های جدید یک معامله استفاده کرد بدون آنکه امضای ورودی های دیگر را باطل کند ، به عنوان مثال ، در مواردی که هر ورودی در یک معامله از یک طرف متفاوت تهیه می شود ، هر ورودی ممکن است با تعداد دنباله صفر شروع شود ، و آن شماره ها می توانندبه طور مستقل افزایش می یابد.

پرچم های آه

بررسی امضای انعطاف پذیر است زیرا شکل معامله ای که امضا می شود می تواند با استفاده از پرچم های آهسته ، که در انتهای یک امضا گیر کرده اند ، کنترل شود. به این ترتیب ، قراردادها می توانند ساخته شوند که در آن هر یک از طرفین فقط بخشی از آن را امضا می کنند و اجازه می دهد سایر قسمت ها بدون درگیری آنها تغییر کند. پرچم های آهگی دارای دو قسمت ، یک حالت و اصلاح کننده Anyonecanpay هستند:

  1. Shighash_all: این پیش فرض است. این نشان می دهد که همه چیز در مورد معامله امضا شده است ، به جز اسکریپت های ورودی. امضای اسکریپت های ورودی نیز بدیهی است که ساخت یک معامله را غیرممکن می کند ، بنابراین همیشه خالی می شوند. توجه داشته باشید ، هرچند ، که سایر خصوصیات ورودی ، مانند تعداد خروجی و شماره های دنباله متصل ، امضا می شوند. این فقط اسکریپت هایی هستند که نیستند. به طور شهودی ، این بدان معنی است که "من موافقت می کنم پول خود را وارد کنم ، اگر همه پول خود را وارد کنند و خروجی ها این باشد".
  2. Shighash_none: خروجی ها امضا نشده و می توانند هر چیزی باشند. از این استفاده کنید تا نشان دهد "من موافقت می کنم پول خود را وارد کنم ، تا زمانی که همه پول خود را وارد کنند ، اما من اهمیتی نمی دهم که با خروجی چه کاری انجام شده است". این حالت به دیگران اجازه می دهد تا با تغییر شماره های توالی ورودی خود ، معامله را به روز کنند.
  3. Shighash_Single: مانند Shighash_none ، ورودی ها امضا می شوند ، اما تعداد دنباله ها خالی می شوند ، بنابراین دیگران می توانند نسخه های جدیدی از معامله ایجاد کنند. با این حال ، تنها خروجی که امضا شده است ، یکی از همان موقعیت های ورودی است. از این استفاده کنید تا نشان دهد "من موافقم ، تا زمانی که خروجی من همان چیزی است که می خواهم ؛ من به دیگران اهمیتی نمی دهم".

اصلاح کننده SHIGHASH_ANYONECANPAY را می توان با سه حالت فوق ترکیب کرد. هنگام تنظیم ، فقط این ورودی امضا می شود و ورودی های دیگر می توانند هر چیزی باشند.

اسکریپت ها می توانند حاوی checkmultisig opcode باشند. این opcode بررسی N-OF-M را ارائه می دهد: شما چندین کلید عمومی را ارائه می دهید و تعداد امضاهای معتبر را که باید موجود باشد مشخص کنید. تعداد امضاها می تواند کمتر از تعداد کلیدهای عمومی باشد. یک خروجی می تواند با تنظیم آن به چیزی شبیه به این ، به دو امضایی بپردازد:

دو الگوی کلی برای ایجاد ایمن قراردادها وجود دارد:

  1. معاملات در خارج از شبکه P2P ، به صورت جزئی کامل یا نامعتبر منتقل می شوند.
  2. دو معامله استفاده می شود: یکی (قرارداد) ایجاد و امضا می شود اما بلافاصله پخش نمی شود. در عوض ، معامله دیگر (پرداخت) پس از توافق قرارداد برای قفل کردن پول ، پخش می شود و سپس قرارداد پخش می شود.

این امر برای اطمینان از این است که مردم همیشه می دانند با چه چیزی موافق هستند.

با هم ، این ویژگی ها به ما اجازه می دهد تا ابزارهای مالی جدید جالب را در بالای زنجیره بلوک بسازیم.

مثال 1: تهیه سپرده

تصور کنید که یک حساب کاربری را در یک وب سایت (به عنوان مثال ، یک انجمن یا ویکی) باز کرده اید و می خواهید اعتماد خود را با اپراتورها برقرار کنید ، اما هیچ اعتبار از قبل موجود برای اهرم ندارید. یک راه حل این است که با پرداخت پول به وب سایت اعتماد کنید. اما اگر در بعضی مواقع حساب خود را ببندید ، احتمالاً دوست دارید این پول را برگردانید. شما ممکن است به اندازه کافی به سایت اعتماد نکنید تا به آنها سپرده دهید که وسوسه می شوند هزینه کنند. خطر دیگر این است که سایت ممکن است یک روز ناپدید شود.

هدف این است که ثابت کنید که شما به نوعی قربانی کرده اید ، بنابراین سایت می داند که شما یک اسپمبوت نیستید ، اما شما نمی خواهید که آنها بتوانند پول را خرج کنند. و اگر اپراتورها ناپدید شوند ، شما در نهایت دوست دارید سکه ها را بدون نیاز به چیزی از آنها برگردانید.

ما می توانیم این مشکل را با یک قرارداد حل کنیم:

  1. کاربر و وب سایت یک کلید عمومی تازه تولید شده به یکدیگر ارسال می کنند.
  2. کاربر معامله TX1 (پرداخت) را ایجاد می کند که 10 BTC را در خروجی قرار می دهد که هم کاربر و هم وب سایت را امضا می کند ، اما آن را پخش نمی کند. آنها از مرحله قبلی برای سایت استفاده می کنند.
  3. کاربر هش TX1 را به وب سایت می فرستد.
  4. وب سایت معامله TX2 (قرارداد) را ایجاد می کند. TX2 TX1 را خرج می کند و آن را از طریق آدرس ارائه شده در مرحله اول به کاربر باز می گرداند. توجه داشته باشید که TX1 به دو امضا نیاز دارد ، بنابراین این معامله نمی تواند کامل شود. NlockTime در آینده در آینده (به عنوان مثال ، شش ماه) تنظیم شده است. شماره دنباله روی ورودی روی صفر تنظیم شده است.
  5. سرانجام ، معامله ناقص (نیم امضا) به کاربر ارسال می شود. کاربر بررسی می کند که قرارداد همانطور که انتظار می رود - که سرانجام سکه ها به او باز می گردند - اما ، مگر اینکه اوضاع تغییر کند ، فقط پس از شش ماه. از آنجا که شماره دنباله صفر است ، در صورت موافقت هر دو طرف ، قرارداد در آینده اصلاح می شود. اسکریپت موجود در ورودی به پایان نرسیده است. فقط صفر وجود دارد که امضای کاربر باید باشد. او این مسئله را با امضای قرارداد و قرار دادن امضای جدید در نقطه مناسب برطرف می کند.
  6. کاربر TX1 را پخش می کند ، سپس TX2 را پخش می کند.

در این مرحله ، 10 BTC در وضعیتی قرار دارد که نه کاربر و نه وب سایت نمی توانند آنها را به طور مستقل خرج کنند. پس از شش ماه ، قرارداد کامل خواهد شد و کاربر حتی اگر وب سایت از بین برود ، سکه ها را پس می گیرد.

اگر کاربر بخواهد حساب خود را زود ببندد چه می شود؟وب سایت نسخه جدیدی از TX2 را با NlockTime تنظیم شده روی صفر ایجاد می کند و شماره دنباله ورودی روی UINT_MAX تنظیم می شود ، سپس آن را دوباره امضا می کند. سایت TX را به کاربر باز می گرداند ، که آن را نیز امضا می کند. کاربر سپس معامله را پخش می کند ، قرارداد را زودتر خاتمه می دهد و سکه ها را آزاد می کند.

اگر شش ماه تقریباً تمام شود و کاربر بخواهد حساب خود را حفظ کند ، چه می شود؟همین مورد نیز صدق می کند: قرارداد را می توان با NLOCKTIM جدیدتر استعفا داد ، دنباله شماره 1 بالاتر از قبلی و دوباره بارگذاری مجدد 2^32 بار. مهم نیست که چه اتفاقی می افتد ، هر دو طرف باید برای تغییر قرارداد موافقت کنند.

بدیهی است ، اگر کاربر بدخواه باشد (یعنی اسپمر) ، وب سایت اجازه نزدیکی اولیه قرارداد را نمی دهد. اگر سوءاستفاده بیش از حد از بین برود ، می توان اندازه سپرده را افزایش داد یا طول قرارداد افزایش می یابد.

مثال 2: واسطه گری و اختلاف نظر

یک خریدار می خواهد با کسی که نمی داند یا به آن اعتماد ندارد ، تجارت کند. در مورد مشترک که معامله به خوبی پیش می رود ، مشتری نمی خواهد اشخاص ثالث درگیر شود. اگر چیزی اشتباه پیش بیاید ، او دوست دارد شخص ثالث تصمیم بگیرد که چه کسی پول می گیرد - شاید یک سرویس واسطه گری اختلاف نظر باشد. توجه داشته باشید که این مفهوم می تواند برای خریدار یا فروشنده اعمال شود. به عنوان مثال واسطه ممکن است اثبات هزینه پستی را از بازرگان درخواست کند.

به عبارت دیگر ، کسی می خواهد برخی از سکه ها را قفل کند ، بنابراین شخص ثالث برای صرف هزینه کردن آنها باید موافقت کند:

  1. با بازرگان در یک واسطه اختلاف موافق (به عنوان مثال ، ClearCoin).
  2. از بازرگان یک کلید عمومی (K1) بخواهید. از یک واسطه برای یک کلید عمومی (K2) بخواهید. یک کلید جدید برای خودتان ایجاد کنید (K3).
  3. بازرگان K2 را ارسال کنید. بازرگان واسطه را با غیر تصادفی تصادفی به چالش می کشد. واسطه گر را با شکل خصوصی K2 امضا می کند ، بنابراین اثبات می کند که واقعاً متعلق به بازرگان است.
  4. یک معامله (TX1) با یک اسکریپت خروجی به شرح زیر ایجاد کنید و آن را پخش کنید:

اکنون سکه ها به گونه ای قفل شده اند که فقط با روش های زیر قابل صرف هستند:

  1. مشتری و بازرگان موافق هستند (یا یک تجارت موفق ، یا بازرگان موافقت می کند که مشتری را بدون واسطه بازپرداخت کند)
  2. مشتری و واسط
  3. واسطه و بازرگان موافق هستند (کالاهای تحویل داده شده ، بازرگان با وجود اختلافات سکه های مشتری را دریافت می کند)

هنگام امضای ورودی ، محتویات روی خروجی متصل تنظیم می شوند. بنابراین ، برای بازپرداخت این معامله ، مشتری یک اسکریپتگ حاوی صفرا ایجاد می کند که در آن امضای دیگر باید باشد ، آن را امضا می کند ، و سپس یکی از اسلات ها را به امضای جدید خود تنظیم می کند. معامله جزئی کاملاً مناسب می تواند برای امضای دوم به بازرگان یا واسطه ارسال شود.

مثال 3: قراردادهای تضمین

یک قرارداد تضمین راهی برای تأمین بودجه ایجاد یک کالای عمومی است ، یعنی یک خیر که پس از ایجاد ، هر کسی می تواند به صورت رایگان از آن بهره مند شود. مثال استاندارد یک فانوس دریایی است: در حالی که همه ممکن است قبول کنند که باید یک نفر ساخته شود ، با توجه به اینکه این امر به نفع همه رقبای وی نیز خواهد بود ، یک ملوان برای یک ملوان بسیار گران است.

یک راه حل این است که همه بتوانند پول را به سمت ایجاد منافع عمومی تعهد کنند ، به گونه ای که تعهدات فقط در صورتی انجام می شود که ارزش کل همه وعده ها بالاتر از هزینه ایجاد باشد. اگر مردم به اندازه کافی مشارکت نکنند ، هیچ کس مجبور نیست چیزی بپردازد.

مثالهایی که بیت کوین نسبت به روشهای پرداخت سنتی برای جمع آوری کمک های مالی تضمین کننده برتر است ، شامل برنامه هایی است که در آن نیاز به تعهدات مکرر و کوچک به طور خودکار انجام می شود ، به عنوان مثال بودجه ایستگاه رادیویی اینترنتی و ترجمه صفحه وب. یک برنامه افزودنی مرورگر را در نظر بگیرید که کمی پول برای آن ارسال می کنید. این زبان فعلی صفحه را تشخیص می دهد و تعهد را برای تهیه ترجمه به زبان شما پخش می کند. اگر کاربران کافی با زمین پسوند در همان صفحه به طور همزمان (به عنوان مثال ، از جایی در ترافیک زیاد مرتبط بود) ، تعهدات کافی برای ایجاد پرداخت به شرکتی که ترجمه با کیفیت بالا را تهیه می کند ، پخش می شود. پس از اتمام آن به طور خودکار در مرورگر شما بارگیری می شود.

ما می توانیم این را در بیت کوین به شرح زیر مدل کنیم:

  1. یک کارآفرین آدرس جدیدی ایجاد می کند و اعلام می کند که اگر حداقل 1000 BTC افزایش یابد ، خیر ایجاد می شود. هر کسی می تواند مشارکت کند.
  2. هر طرف که مایل به تعهد است ، معامله جدیدی را ایجاد می کند که برخی از سکه های خود را به آدرس اعلام شده می پردازد ، اما آنها آن را پخش نمی کنند. معامله شبیه به یک معامله منظم است به جز سه تفاوت: اولا ، نمی توان تغییری ایجاد کرد. اگر هیچ خروجی با اندازه مناسب ندارید ، باید ابتدا با هزینه کردن به یکی از آدرس های خود ، ابتدا یک مورد را ایجاد کنید. ثانیا ، امضای اسکریپت ورودی با shighash_all |shighash_anyonecanpay. سرانجام ، مقدار خروجی روی 1000 BTC تنظیم می شود. توجه داشته باشید که این یک معامله معتبر نیست زیرا مقدار خروجی از مقدار ورودی بزرگتر است.
  3. معامله در سرور کارآفرین بارگذاری می شود ، که آن را در دیسک ذخیره می کند و تعداد آن را در مورد تعداد سکه ها به روز می کند.
  4. هنگامی که سرور به اندازه کافی سکه داشته باشد ، معاملات جداگانه را با هم در یک معامله جدید ادغام می کند. معامله جدید دارای یک خروجی واحد است که به سادگی به آدرس اعلام شده می پردازد - این همانند خروجی های مربوط به هر معامله مشارکت شده است. ورودی های معامله از تعهدات کمک شده جمع آوری می شود.
  5. معامله تمام شده پخش می شود و سکه های تعهد شده را به آدرس اعلام شده ارسال می کند.

این طرح به چندین جنبه پروتکل متکی است. اولین مورد پرچم های آهی است که مورد استفاده قرار می گیرد. shighash_all پیش فرض است و به این معنی است که کل محتوای معامله به جز اسکریپت های ورودی امضا شده است. shighash_anyonecanpay یک اصلاح کننده اضافی است به این معنی که امضای فقط ورودی موجود در آن را پوشش می دهد - ورودی های دیگر امضا نمی شوند و بنابراین می توانند هر چیزی باشند.

با ترکیب این پرچم ها در کنار هم ، ما قادر به ایجاد امضایی هستیم که حتی در صورت اضافه شدن ورودی های دیگر نیز معتبر باشد ، اما در صورت تغییر خروجی یا سایر خصوصیات معامله ، شکسته می شود.

دومین جنبه ای که ما از آن بهره برداری می کنیم این واقعیت است که معامله ای که در آن مقادیر خروجی بزرگتر از مقادیر ورودی است نامعتبر است (به دلایل واضح). این بدان معنی است که می توان معامله ای را که چنین سکه هایی را خرج می کند ، به کارآفرین ارسال کند - برای وی غیرممکن است که سکه ها را مطالبه کند ، مگر اینکه او ورودی های دیگری داشته باشد که به ارزش خروجی یا بیشتر باشد.

ایجاد قراردادهای تضمین بدون استفاده از shighash_anyonecanpay امکان پذیر است. در عوض ، از یک فرآیند دو مرحله ای استفاده می شود که در آن تعهدات بدون معاملات جمع آوری می شود و پس از رسیدن به مقدار کل ، معامله ای با ورودی برای هر یک از این تعهدات ایجاد می شود و تا زمانی که همه امضاها جمع آوری شود ، منتقل می شود. با این حال ، استفاده از shighash_anyonecanpay و سپس ادغام احتمالاً راحت تر است.

یک قرارداد تضمین می تواند برای تأمین اعتبار امنیت شبکه برای بلوک بعدی تهیه شود. به این ترتیب ، حتی اگر فضای بلوک کمیاب نباشد ، می توان از معدن استفاده کرد.

شرح این مفهوم توسط Tabarrok در مقاله خود با عنوان "تهیه خصوصی کالاهای عمومی از طریق قراردادهای تضمین غالب" شرح داده شده است. در یک قرارداد تضمین غالب ، در صورت عدم موفقیت یک قرارداد (تعهدات کافی در یک پنجره زمانی تعیین شده) ، کارآفرین هزینه ای را به کسانی که تاکنون تعهد کرده اند پرداخت می کند. این نوع قرارداد تلاش می کند تا مشوق ها را ترتیب دهد به گونه ای که شرکت کردن همیشه استراتژی مناسب است. طرحی برای قراردادهای تضمین غالب در بیت کوین ارائه شده است.

مثال 4: استفاده از حالت خارجی

اسکریپت ها ، با طراحی ، توابع خالص هستند. آنها نمی توانند سرورهای خارجی را نظرسنجی کنند و یا هیچ دولتی را که ممکن است تغییر کند وارد می کند زیرا این امکان را به یک مهاجم می دهد تا از زنجیره بلوک پیشی بگیرد. علاوه بر این ، زبان اسکریپت در کاری که می تواند انجام دهد بسیار محدود است. خوشبختانه ، ما می توانیم معاملات را به روش های دیگر به جهان متصل کنیم.

نمونه پیرمردی را که مایل به ارث به نوه خود است ، یا در تولد 18 سالگی نوه یا وقتی مرد می میرد ، در نظر بگیرید.

برای حل این مسئله ، مرد ابتدا مبلغ وراثت را برای خود ارسال می کند ، بنابراین یک خروجی واحد از مقدار مناسب وجود دارد. سپس او معامله ای را با زمان قفل 18 سالگی نوه ایجاد می کند که سکه ها را به کلید دیگری که متعلق به نوه است ، می پردازد ، آن را امضا می کند و آن را به او می دهد - اما آن را پخش نمی کند. این مراقبت از شرایط تولد 18 سالگی است. اگر تاریخ بگذرد ، نوه معامله را پخش می کند و سکه ها را ادعا می کند. او قبل از آن می توانست این کار را انجام دهد ، اما به او اجازه نمی دهد سکه ها را زودتر بدست آورد ، و برخی از گره ها ممکن است تصمیم بگیرند که معاملات را در استخر حافظه با زمان قفل در آینده دور کنند.

وضعیت مرگ سخت تر است. از آنجا که گره های بیت کوین نمی توانند شرایط دلخواه را اندازه گیری کنند ، ما باید به یک اوراکل اعتماد کنیم. اوراکل سرور است که دارای صفحه کلید است و وقتی یک عبارت ارائه شده توسط کاربر به درستی ارزیابی می شود ، معاملات را در صورت درخواست امضا می کند.

به عنوان مثال. مرد معامله ای را صرف هزینه خود می کند و خروجی را تنظیم می کند:

این اسکریپت اوراکل است. این یک شکل غیرمعمول دارد - داده ها را به پشته سوق می دهد و بلافاصله دوباره آن را حذف می کند. Pubkey در وب سایت Oracle منتشر شده و مشهور است. این هش قرار است هش از عبارت کاربر ارائه شده باشد که می گوید او درگذشته است ، به شکلی که اوراکل می داند چگونه ارزیابی کند. به عنوان مثال ، این می تواند هش رشته باشد:

این زبان کوچک فرضی است ، توسط اوراکل تعریف می شود و می تواند هر چیزی باشد. مقدار بازگشت یک خروجی است: مقدار ارزش و آدرس متعلق به نوه.

یک بار دیگر ، مرد این معامله را ایجاد می کند اما به جای پخش آن ، مستقیماً به نوه خود می دهد. او همچنین عبارتی را که در معامله و نام اوراکل که می تواند آن را باز کند ، ارائه می دهد.

در الگوریتم زیر استفاده می شود:

  1. اوراکل درخواست اندازه گیری را می پذیرد. این درخواست شامل عبارت ارائه شده توسط کاربر ، یک کپی از اسکریپت خروجی و یک معامله جزئی کامل است که توسط کاربر ارائه شده است. همه چیز در این معامله به جز Scriptsig ، که فقط یک امضا (نوه) دارد - به پایان رسیده است - برای باز کردن بازده کافی نیست.
  2. Oracle بیان بیان شده توسط کاربر را به مقدار موجود در اسکریپت خروجی ارائه شده بررسی می کند. اگر این کار را نکند ، خطایی را برمی گرداند.
  3. اوراکل بیان را ارزیابی می کند. اگر نتیجه آدرس مقصد خروجی نباشد ، خطایی را برمی گرداند.
  4. در غیر این صورت اوراکل معامله را امضا می کند و امضا را به کاربر باز می گرداند. توجه داشته باشید که هنگام امضای معامله بیت کوین ، اسکریپت ورودی روی اسکریپت خروجی متصل تنظیم می شود. دلیل این امر این است که وقتی op_checksig اجرا می شود ، اسکریپت حاوی کد در ورودی مورد ارزیابی قرار می گیرد ، _not_ اسکریپت حاوی خود امضا. اوراکل هرگز خروجی کاملی را که خواسته می شود امضا کند ، ندیده است ، اما لازم نیست. این اسکریپت خروجی ، کلید عمومی خود را می شناسد ، و هش از عبارت کاربر ارائه شده ، این همه چیزهایی است که برای بررسی اسکریپت خروجی و به پایان رساندن معامله نیاز دارد.
  5. کاربر امضای جدید را می پذیرد ، آن را در Scriptsig وارد می کند و معامله را پخش می کند.

اگر اوراکل موافقت کند که مرد مرده است ، نوه می تواند دو معاملات (قرارداد و ادعا) را پخش کند و سکه ها را انجام دهد.

اوراکل ها به طور بالقوه می توانند هر چیزی را ارزیابی کنند ، اما فرم اسکریپت خروجی در زنجیره بلوک همیشه می تواند یکسان باشد. امکانات زیر را در نظر بگیرید:

شرایطی که علائم اوراکل را کنترل می کند می تواند به طور خودسرانه پیچیده باشد ، اما زنجیره بلوک هرگز نیازی به بیش از یک هش واحد ندارد.

پروژه اولیه معبد نمونه اولیه ای از اوراکل را اجرا کرده است که به دنبال یک عبارت کلیدی در یک صفحه وب است.

به حداقل رساندن اعتماد: چالش ها

روش های مختلفی برای کاهش سطح اعتماد مورد نیاز در اوراکل وجود دارد.

با بازگشت به مثال اول ما ، اوراکل معامله ای را که نوه در تلاش برای باز کردن آن است ، ندیده است ، زیرا هرگز پخش نشده است ، بنابراین ، نمی تواند نوه را باج دهد زیرا نمی داند معامله ای که برای آن امضا می کند حتی وجود دارد. مردم می توانند و باید به طور مرتب اوراکل را به صورت خودکار به چالش بکشند تا اطمینان حاصل کنند که همیشه آنچه را که انتظار می رود ، از آن استفاده می کند. این چالش ها را می توان بدون صرف هزینه های سکه انجام داد زیرا TX برای امضاء می تواند نامعتبر باشد (یعنی به معامله هایی که وجود ندارند). اوراکل هیچ راهی برای دانستن اینکه درخواست امضاء تصادفی یا واقعی است ، ندارد. چگونگی به چالش کشیدن اوراکل با شرایطی که هنوز درست نیست ، یک سؤال تحقیقاتی باز است.

به حداقل رساندن اعتماد: چندین اوراکل مستقل

تعداد کلیدهای موجود در checkmultisig را می توان افزایش داد تا در صورت لزوم به اوراکل های n-m-m امکان پذیر شود. البته ، بررسی این نکته ضروری است که اوراکل ها واقعاً مستقل هستند و در تبانی نیستند. اجرای چنین سیستمی و توضیح در Whitepaper Orisi منتشر شد.

به طور خلاصه ، این ایده این است که اوراکل های مستقل می توانند توسط مجموعه ای از بازیگران مستقل قابل اعتماد اداره شوند. شرکت کنندگان در قرارداد ابتدا بر روی مجموعه ای از اوراکل هایی که هر دو با استفاده از آنها راحت هستند - به عنوان مثال با اعتماد به یک سایت اختصاصی - تسویه می کنند و سپس قراردادی را امضا می کنند که نیاز به اکثر امضاهای Oracles دارد.

یکی از ویژگی های جالب چنین سیستمی این است که احتمالاً می تواند مجموعه های بسیار پیچیده ای از اسکریپت ها و ورودی های خارجی را اجرا کند ، در حالی که بر اساس مجموعه ای از اسکریپت های استاندارد بیت کوین است. خاصیت دیگر این است که اوراکل ها می توانند با ارسال وجوه به آدرس های جدید Multisig ، هنگامی که متوجه می شوند یکی از اوراکل ها معیوب/فاسد است ، هر یک را جایگزین کنند. سرانجام ، از چنین اوراکل هایی می توان برای اجرای Sidechains بدون استفاده از Opcodes اختصاصی استفاده کرد.

به حداقل رساندن اعتماد: سخت افزار قابل اعتماد

با استفاده از سخت افزار کالا ، می توانید از محاسبات قابل اعتماد در قالب Intel TXT یا معادل AMD (Skinit) برای تنظیم یک محیط سخت افزار مهر و موم شده استفاده کنید و سپس از تراشه TPM برای اثبات این واقعیت به شخص ثالث استفاده کنید. شخص ثالث می تواند تأیید کند که سخت افزار در حالت مورد نیاز بوده است. شکست دادن این امر مستلزم این است که شخصی بتواند در اجرای برنامه ای که ممکن است کاملاً بر روی CPU اجرا شود ، حتی در موارد شدید بدون هیچ گونه داده ای که در اتوبوس حافظه عبور می کند ، دخالت کند (اگر این برنامه به اندازه کافی کوچک باشد می توانید با استفاده از حافظه نهان روی DIE اجرا کنید.).

به حداقل رساندن اعتماد: Amazon AWS Oracles

سرانجام ، شاید عملی ترین رویکرد در حال حاضر استفاده از خدمات وب آمازون باشد. از نوامبر 2013 ، نزدیکترین ما به یک Oracle کار می کنیم این دستور العمل برای ایجاد یک محیط محاسباتی قابل اعتماد با استفاده از AWS است که در پشتیبانی از این پروژه برای انجام ورود به سیستم انتخابی SSL و رمزگشایی ساخته شده است. ایده این است که یک اوراکل ، که می تواند با استفاده از API های آمازون با آمازون به عنوان ریشه اعتماد ، قابل اعتماد باشد ، جلسات SSL را رمزگذاری می کند تا به یک رابط بانکی آنلاین بپردازد به گونه ای که بعداً در صورت بروز اختلاف در مورد شخص به شخصمبادله شخص ، سیاههها را می توان رمزگشایی کرد و اختلافات حل شد.

مثال 5: تجارت در زنجیرها

فناوری بیت کوین را می توان برای ایجاد ارزهای متعدد و مستقل سازگار کرد. NameCoin نمونه ای از چنین ارز است که تحت یک مجموعه قوانین کمی متفاوت عمل می کند و همچنین می تواند برای اجاره نام در یک فضای نام استفاده شود. ارزهایی که ایده های مشابه بیت کوین را اجرا می کنند با اعتماد محدود می توانند آزادانه علیه یکدیگر معامله شوند.

به عنوان مثال ، یک کنسرسیوم شرکت هایی که Eurcoins را صادر می کنند تصور کنید ، یک ارز رمزنگاری که از 1: 1 توسط سپرده های حساب های بانکی کنسرسیوم پشتیبانی می شود. چنین ارز مجموعه متفاوتی از تجارت به بیت کوین خواهد داشت: متمرکز تر ، اما بدون خطر FX. ممکن است مردم بخواهند بیت کوین را برای یوروها به جلو و عقب تجارت کنند ، در حالی که شرکت ها فقط هنگام ورود به سیستم از سیستم بانکی معمولی درگیر می شوند.

برای اجرای این کار ، پروتکل پیشنهادی توسط Tieolan می تواند استفاده شود:

  1. حزب "A" داده های تصادفی را تولید می کند ، x (راز).
  2. حزب "A" TX1 (پرداخت) را تولید می کند که حاوی خروجی با اسکریپت تجارت زنجیره ای در آن است. در زیر برای این فیلمنامه و بحث در مورد آن مشاهده کنید. این اجازه می دهد تا با امضای دو کلید (کلید "A" و کلید "B") یا با (مخفی "X" ، کلید "B") نسخه سکه را آزاد کنید. این معامله پخش نمی شود. اسکریپت انتشار زنجیره ای حاوی هش است ، نه خود اسرار واقعی.
  3. حزب "A" TX2 (قرارداد) را تولید می کند ، که TX1 را خرج می کند و خروجی دارد که به کلید "A" باز می گردد. در آینده زمان قفل دارد و ورودی دارای تعداد دنباله صفر است ، بنابراین می توان آن را جایگزین کرد."A" TX2 را امضا می کند و آن را به "B" می فرستد ، که آن را نیز امضا می کند و آن را به عقب می فرستد.
  4. 'A' TX1 و TX2 را پخش می کند. حزب 'B' اکنون می تواند سکه ها را ببیند اما نمی تواند آنها را خرج کند زیرا خروجی به سمت او نمی رود و TX به هر حال نهایی نمی شود.
  5. 'B' همان طرح را به صورت معکوس بر روی زنجیره جایگزین انجام می دهد. زمان قفل برای "B" باید بسیار بزرگتر از زمان قفل برای "A" باشد. هم اکنون هر دو طرف تجارت در انتظار اما ناقص هستند.
  6. از آنجا که "A" راز را می شناسد ، "A" می تواند بلافاصله سکه های خود را ادعا کند. با این حال ، "A" ، در روند ادعای سکه خود ، راز "X" را به "B" آشکار می کند ، که سپس از آن استفاده می کند تا طرف دیگر تجارت را با ("X" ، کلید "B" به پایان برساند.

این پروتکل باعث می شود انجام معاملات به صورت خودکار به روشی کاملاً همتا به همسالان امکان پذیر شود ، که باید نقدینگی خوبی را تضمین کند.

فیلمنامه تجارت زنجیره ای می تواند به این شکل باشد:

اسکریپت ورودی قرارداد به نظر می رسد:

یعنی اولین عنصر داده انتخاب می کند که از کدام مرحله استفاده می شود.

توجه داشته باشید که در حالی که Eurcoins یک ایده طبیعی است ، روش های دیگری برای اجرای مبادله ارز به همسالان وجود دارد (بیت کوین به فیات و برعکس).

Sergio Demian-Leer P2PTradex را پیشنهاد کرد ، راه حلی که مستلزم قوانین اعتبار سنجی برای یک blockchain است که به طور مؤثر در قوانین اعتبار سنجی برای دیگری رمزگذاری شود.

مثال 6: قراردادهای ضد پرداخت: خرید راه حل برای هر عملکرد خالص

در مثال 4 ، ما دیدیم که چگونه می توان پرداخت ها را به تولید برخی از برنامه های دلخواه مشروط کرد. این برنامه ها بسیار قدرتمند هستند و می توانند هر کاری را انجام دهند که یک برنامه معمولی بتواند انجام دهد ، مانند واکشی صفحات وب. نکته منفی این است که شخص ثالث مورد نیاز است (یک اوراکل). اگرچه تکنیک هایی وجود دارد که می تواند به کاهش اعتماد مورد نیاز در اوراکل کمک کند ، هیچ کس نمی تواند آن را به صفر کاهش دهد.

برای یک کلاس محدود از برنامه ها ، کارکردهای خالص ، تکنیک های رمزنگاری جدید در دسترس قرار می گیرند که در واقع می تواند اعتماد مورد نیاز را به تمام راه به صفر کاهش دهد و هیچ شخص ثالث وجود ندارد. این برنامه ها نمی توانند I/O را انجام دهند ، اما در بسیاری از موارد این محدودیت به نظر می رسد بی اهمیت است یا می توان به روش های دیگر کار کرد ، مانند این که به جای اینکه برنامه آن را بارگیری کند ، یک سند امضا شده/زمان بندی شده به عنوان ورودی به عنوان ورودی ارائه می دهد.

گرگوری ماکسول پروتکل را برای انجام این کار اختراع کرده است ، که می توانید در اینجا بخوانید: صفر دانش مشروط

مثال 7: پرداخت سریع (میکرو) به یک طرف از پیش تعیین شده

معاملات بیت کوین نسبت به سیستم های پرداخت سنتی بسیار ارزان است ، اما به دلیل نیاز به استخراج و ذخیره آن هنوز هزینه ای دارند. مواردی وجود دارد که در آن می خواهید به سرعت و ارزان مبلغ پول ارسال شده را به یک گیرنده خاص تنظیم کنید بدون اینکه هزینه یک معامله پخش را تحمل کنید.

به عنوان مثال ، یک نقطه دسترسی به اینترنت غیرقابل اعتماد را در نظر بگیرید ، مانند یک کافه WiFi در یک کافه که قبلاً هرگز از آن بازدید نکرده اید. شما می خواهید بدون باز کردن حساب با کافه ، 0. 001 BTC را در هر 10 کیلوبایت استفاده کنید. یک راه حل صفر به این معنی است که می تواند کاملاً اتوماتیک باشد ، بنابراین می توانید در ابتدای ماه بودجه خود را بر روی کیف پول تلفن همراه تلفن خود از قبل اختصاص دهید ، و سپس دستگاه شما به طور خودکار مذاکره و پرداخت به اینترنت را در صورت تقاضا می پردازد. این کافه همچنین می خواهد به هر کسی اجازه دهد بدون ترس از پاره شدن آنها را بپردازد.

یک راه حل کانال های پرداخت مانند شبکه لایتنینگ است.

گزینه دیگر پروتکل زیر است. این پروتکل به رفتار متفاوتی از NlockTime با طراحی اصلی متکی است. از حدود سال 2013 معاملات بسته بندی شده زمان غیر استاندارد ساخته شده و دیگر وارد استخر حافظه نمی شوند ، بنابراین نمی توان قبل از انقضای زمان بندی پخش شد. هنگامی که رفتار NlockTime از Satoshi به طرح اصلی بازگردد ، نوعی از این پروتکل مورد نیاز است که در زیر مورد بحث قرار می گیرد.

ما مشتری را به عنوان طرفی ارسال می کنیم و سرور آن طرفی است که آن را دریافت می کند. این از دیدگاه مشتری نوشته شده است.

  1. یک کلید عمومی (K1) ایجاد کنید. یک کلید عمومی از سرور (K2) درخواست کنید.
  2. ایجاد و امضا کنید اما معامله ای (T1) را پخش نکنید که پرداخت (برای مثال) 10 BTC را به خروجی تنظیم می کند که به کلید خصوصی سرور و یکی از موارد مورد نیاز شما نیاز دارد. یک روش خوب برای انجام این کار استفاده از op_checkmultisig است. مقدار مورد استفاده به عنوان یک تجارت کارآیی انتخاب می شود.
  3. یک معامله بازپرداخت (T2) ایجاد کنید که به خروجی T1 وصل شود که تمام پول را به خودتان ارسال می کند. این یک قفل زمان برای مدتی در آینده است ، به عنوان مثال چند ساعت. آن را امضا نکنید و معامله بدون امضا را به سرور ارائه دهید. طبق کنوانسیون ، اسکریپت خروجی "2 K1 K2 2 CheckMultisig" است
  4. سرور T2 را با استفاده از کلید خصوصی خود در ارتباط با K2 امضا می کند و امضای را به مشتری باز می گرداند. توجه داشته باشید که در این مرحله T1 را ندیده است ، فقط هش (که در T2 امضا نشده است).
  5. مشتری تأیید می کند که امضای سرورها صحیح است و در صورت عدم سقط است.
  6. مشتری T1 را امضا می کند و امضا را به سرور منتقل می کند ، که اکنون معامله را پخش می کند (هر یک از طرفین می توانند این کار را انجام دهند اگر هر دو اتصال داشته باشند). این قفل در پول است.
  7. مشتری سپس یک معامله جدید ، T3 ایجاد می کند که مانند معامله بازپرداخت به T1 متصل می شود و دارای دو خروجی است. یکی به K1 می رود و دیگری به K2 می رود. این کار با تمام مقدار اختصاص داده شده به اولین خروجی (K1) شروع می شود ، یعنی همان کار را با معامله بازپرداخت انجام می دهد اما زمان قفل نیست. مشتری T3 را امضا می کند و معامله و امضا را به سرور ارائه می دهد.
  8. سرور تأیید می کند که خروجی به خود اندازه مورد انتظار است و تأیید می کند که امضای ارائه شده مشتری صحیح است.
  9. هنگامی که مشتری مایل به پرداخت سرور است ، کپی خود را از T3 تنظیم می کند تا ارزش بیشتری را به خروجی سرور اختصاص دهد و کمتر به خود باشد. سپس T3 جدید را دوباره امضا می کند و امضا را به سرور ارسال می کند. لازم نیست کل معامله را ارسال کند ، فقط امضا و مبلغ افزایش آن کافی است. سرور کپی T3 خود را برای مطابقت با مبالغ جدید تنظیم می کند ، امضا را تأیید می کند و ادامه می یابد.

این تا پایان جلسه ادامه می یابد ، یا دوره 1 روزه نزدیک می شود. سپس AP آخرین معامله ای را که دید ، امضا و پخش می کند و مبلغ نهایی را به خود اختصاص می دهد. معامله بازپرداخت برای رسیدگی به مواردی که سرور در هر نقطه از بین می رود یا متوقف می شود ، لازم است و مقدار اختصاص یافته را در لنگه باقی می گذارد. اگر این اتفاق بیفتد ، پس از اتمام قفل زمان ، مشتری می تواند معامله بازپرداخت را پخش کند و تمام پول را پس بگیرد.

تعداد قفل و تعداد دنباله از حمله ای که در آن AP اتصال را فراهم می کند ، جلوگیری می کند و سپس کاربر با استفاده از نسخه اول TX2 ، خروجی را به خود باز می گرداند ، بنابراین مانع از ادعای کافه می شود. اگر کاربر این کار را امتحان کند ، TX بلافاصله گنجانده نمی شود و به نقطه دسترسی یک پنجره زمان می دهد که در آن می تواند پخش TX را مشاهده کند ، و سپس آخرین نسخه ای را که دید ، پخش می کند ، و بر روی تلاش دوازدهم بر روی کاربر غلبه می کند. بشر

پروتکل دوم که به جایگزینی معامله متکی است انعطاف پذیرتر است زیرا به مقدار اختصاص داده شده در طول عمر کانال ، تا زمانی که مشتری از سرور امضا کند ، به پایین می رود ، اما برای بسیاری از موارد استفاده این عملکرد نیست. ضروری. جایگزینی همچنین امکان تنظیمات پیچیده تری از کانال هایی را فراهم می کند که بیش از دو طرف را درگیر می کند. توضیح در مورد چنین مواردی به عنوان یک تمرین برای خواننده باقی مانده است.

مثال 8: قرعه کشی های غیر متمرکز چند حزبی

با استفاده از برخی از تکنیک های مثال 6 و برخی از برنامه نویسی بسیار پیشرفته ، ساخت یک قرعه کشی چند حزبی بدون اپراتور امکان پذیر می شود. پروتکل دقیق مورد استفاده در مقاله "محاسبات چند حزبی ایمن روی بیت کوین" توضیح داده شده است. توضیحی کوتاه تر در مورد نحوه کار آن ممکن است به این ویکی در مقطعی در آینده اضافه شود.

توصیه معامله گران با تجربه...
ما را در سایت توصیه معامله گران با تجربه دنبال می کنید

برچسب : نویسنده : حمید ابراهیمی بازدید : 42 تاريخ : سه شنبه 9 خرداد 1402 ساعت: 22:41