راهنمای رویدادها و ثبت نام در قراردادهای هوشمند Ethereum

وبلاگ 1NewsDevelopersEnterpriseBlockchain ExplainedEvent ها و کنفرانس ها Pressخبرنامه ها

مشترک شدن در خبرنامه ما.

آدرس ایمیل

ما به حریم خصوصی شما احترام می گذاریم

صفحه اصلی وبلاگ توسعه Blockchain

راهنمای رویدادها و ثبت نام در قراردادهای هوشمند Ethereum

معرفی فنی برای استفاده از موارد برای رویدادها و ورود به سیستم در بلاک چین Ethereum با کد نمونه توسط Joseph Chow 6 ژوئن 2016 ارسال شده در 6 ژوئن 2016

ConsenSys سیگنال راهنمای وقایع و ورود به سیستم اتریوم با قراردادهای هوشمند

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

وقایع می توانند گیج کننده باشند زیرا می توانند به روش های مختلف مورد استفاده قرار گیرند. یک رویداد برای یک نفر ممکن است برای یک اتفاق دیگر به نظر نرسد. 3 مورد اصلی برای رویدادها و گزارش ها وجود دارد:

  1. مقادیر بازگشت قرارداد هوشمند برای رابط کاربر
  2. عوامل ناهمزمان همراه با داده ها
  3. نوع ذخیره سازی ارزان تر

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

1) مقادیر بازگشت قرارداد هوشمند برای رابط کاربر

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

contract ExampleContract {// برخی از متغیرهای حالت … تابع foo (int256 _value) بازده (int256) {// manipulation state … return _value؛ }} زبان کد: JavaScript (javascript)

با فرض exampleContract نمونه ای از مثالContract است ، یک frontend با استفاده از web3.js ، می تواند با شبیه سازی اجرای قرارداد ، مقدار برگشتی بدست آورد:

var returnValue = exampleContract.foo.call (2)؛ console.log (returnValue) // 2 زبان کد: JavaScript (javascript)

با این حال ، هنگامی که web3.js فراخوان قرارداد را به عنوان یک معامله ارسال می کند ، نمی تواند مقدار برگشتی را بدست آورد [1]:


var returnValue = exampleContract.foo.sendTransaction (2 ، {از: web3.eth.coinbase})؛ console.log (ReturnValue) // معاملات هش زبان کد: JavaScript (javascript)

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

راه حل توصیه شده استفاده از یک رویداد است و این یکی از اهداف در نظر گرفته شده برای رویدادها است.

contract ExampleContract {event ReturnValue (آدرس نمایه شده _ از ، int256 _value)؛ function foo (int256 _value) برمی گرداند (int256) {ReturnValue (msg.sender، _value)؛ بازگشت _ارزش؛ }} سپس یک frontend می تواند مقدار بازگشتی را بدست آورد: var exampleEvent = exampleContract.ReturnValue ({_ از: web3.eth.coinbase})؛ exampleEvent.watch (تابع (خطا ، نتیجه) {if (خطا) {console.log (خطا) بازگشت ؛} console.log (نتیجه. آرگز ._ ارزش) // بررسی کنید که نتیجه چیست. args._from از web3.eth.coinbase است سپس // نمایش نتیجه

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

2) راه اندازهای ناهمزمان با داده

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

3) فرم ذخیره سازی ارزان تر

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

سیاهههای مربوط به نوعی ذخیره سازی طراحی شده اند که هزینه آن به طور قابل توجهی کمتر از ذخیره سازی قراردادی است. لاگها اساساً [2] به ازای هر بایت 8 گاز هزینه می کنند ، در حالیکه ذخیره انبار قرارداد برای هر 32 بایت 20000 گاز است. اگرچه سیاهههای مربوط به صرفه جویی در مصرف گاز عظیم الجثه ارائه می دهند ، اما از هرگونه قراردادها دسترسی به سیاههها استفاده نمی شود [3].

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

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

قرارداد CryptoExchange {رویداد سپرده گذاری (uint256 نمایه شده _ بازار ، آدرس نمایه شده _ ارسال کننده ، uint256 _ مقدار ، uint256 _ زمان)؛ تابع Deposit (uint256 _amount، uint256 _market) برمی گرداند (int256) {// انجام سپرده ، به روزرسانی موجودی کاربر و غیره سپرده (_market ، msg.sender ، _amount ، اکنون)؛ } زبان کد: جاوا اسکریپت (جاوا اسکریپت)

فرض کنید ما می خواهیم UI را به روز کنیم زیرا کاربر واریز می کند. در اینجا مثالی از استفاده از یک رویداد (سپرده گذاری) به عنوان محرک ناهمزمان با داده ها (_market ، msg.sender ، _amount ، اکنون) وجود دارد. فرض کنید cryptoExContract نمونه ای از CryptoExchange است:

var depositEvent = cryptoExContract.Deposit ({_ فرستنده: userAddress})؛ depositEvent.watch (تابع (خطا ، نتیجه) {if (خطا) {console.log (اشتباه) بازگشت ؛} // ضمیمه کردن جزئیات result.args به UI}) زبان کد: جاوا اسکریپت (javascript)

بهبود کارایی گرفتن همه رویدادها برای کاربر دلیل ایندکس شدن پارامتر _ ارسال کننده به رویداد است: رویداد سپرده گذاری (uint256 _market _market ، آدرس نمایه _sender ، uint256 _amount ، uint256 _time).

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

var depositEventAll = cryptoExContract.Deposit ({_ sender: userAddress}، {fromBlock: 0، toBlock: ‘latest’})؛ depositEventAll.watch (تابع (خطا ، نتیجه) {if (خطا) {console.log (خطا) بازگشت ؛} // ضمیمه کردن جزئیات result.args به UI}) زبان کد: JavaScript (javascript)

هنگامی که رابط کاربری ارائه می شود ، باید از طریق EEEEAll.stopWatching () فراخوانی شود.

کنار – پارامترهای نمایه شده

حداکثر 3 پارامتر می تواند نمایه شود. به عنوان مثال ، یک استاندارد توکن پیشنهادی دارای: انتقال رویداد (آدرس نمایه شده _ از ، آدرس نمایه شده _ به ، uint256 _ مقدار). این بدان معناست که یک frontend می تواند به طور موثر فقط انتقال رمزهایی را که عبارتند از:

  • ارسال شده توسط یک آدرس tokenContract.Transfer ({_ از: senderAddress})
  • یا توسط یک آدرس tokenContract.Transfer دریافت شده است ({_ به: recerAddress})
  • یا توسط یک آدرس به یک آدرس خاص tokenContract.Transfer ارسال شده است ({_ از: senderAddress ، _to: recerAddress})

نتیجه

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

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

منابع

[1] web3.js می تواند معامله را در نظر بگیرد که بلاکچین در آن گنجانده شده است ، سپس معامله را در نمونه ای از EVM بازپخش می کند تا مقدار برگشتی را بدست آورد ، اما این مقدار قابل توجهی منطق برای اضافه کردن به web3.js است [2] هزینه های گاز 375 برای یک عملیات LOG و 375 گاز برای هر موضوع وجود دارد ، اما وقتی بسیاری از بایت ها ذخیره می شوند ، این هزینه ها کسری ناچیز از کل هزینه های ذخیره سازی را نشان می دهد.. [3] اثبات مرکل برای سیاهههای مربوط ممکن است ، بنابراین اگر یک نهاد خارجی قراردادی را با چنین مدرکی تهیه کند ، یک قرارداد می تواند تأیید کند که سیاهههای مربوط در واقع در داخل بلاکچین وجود دارد.

راهنمای توسعه دهنده مستقیماً به صندوق ورودی خود می خواهید?

در خبرنامه توسعه دهنده ConsenSys مشترک شوید

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

چگونه یک محصول بلاکچین موفق بسازیم

نحوه تنظیم و اجرای گره Ethereumوبینار

نحوه تنظیم و اجرای گره Ethereum

چگونه API Ethereum خود را بسازیموبینار

چگونه API Ethereum خود را بسازیم

چگونه یک نشانه اجتماعی ایجاد کنیموبینار

چگونه یک نشانه اجتماعی ایجاد کنیم

استفاده از ابزارهای امنیتی در توسعه قرارداد هوشمندوبینار

استفاده از ابزارهای امنیتی در توسعه قرارداد هوشمند

آینده دارایی های دیجیتال مالی و DeFiوبینار

آینده مالی: دارایی های دیجیتال و DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map