-
0
قفل زمانی Timelock یک عملکرد نو آورانه در بیت کوین و به نوعی قرار داد هوشمند smart contract است که به شماره بلاک ویا زمانی واقعی اشاره دارد و برای قفل نمودن یک آدرس بیت کوین برای مدت زمانی در آینده بکار برده می شود. به بیان ساده تر از این امکان می توان به مانند دستور پرداخت در آینده استفاده کرد. در این شیوه پرداخت می توان از ابتدا یا در هر زمانی قبل از موعد بازپرداخت، افزایش موجودی داد.
در این مقاله بطور پیش فرض درنظر می گیریم که آشنایی لازم با شبکه بیت کوین، ساخت و استفاده از کیف پول الکتروم و ایجاد امنیت کاربری در استفاده از آن را برخوردار هستیم. توجه داشته باشید برای فهم بهتر کلیه تراکنش ها بر روی شبکه اصلی بیت کوین انجام گرفته است. همچنین برای حفظ حریم خصوصی نگارنده از کاراکتر ϴϴϴϴϴϴϴϴϴ در کلیه آدرس ها استفاده شده است.
برای ایجاد آدرس کیف پول با قابلیت قفل زمانی از دو کیف پول Electrum و Coinb.in استفاده می کنیم. با توجه به اهمیت دریافت کیف پول از منبع معتبر، کافیست از وب سایت رسمی کیف پول آن را دانلود و در صورت دارا بودن امضای pgp آن را کنترل نمایید.
کیف پول Coinb.in به صورت html و به زبان جاوا اسکریپت نوشته شده است. کافیست پس از دانلود، اکسترکت نموده و فایل index.html را در کامپیوتر خود اجرا کنید تا به صورت آفلاین و امن از امکانات این کیف پول استفاده کنید. متاسفانه این کیف پول از سال 2017 توسط برنامه نویسان توسعه پیدا نکرده و امکان پشتیبانی TimeLockAddress در کیف پول SegWit و یا استفاده از شبکه testnet وجود ندارد و بایستی بر روی شبکه اصلی از کیف پول Legacy استفاده کنیم.
برای ایجاد و بازپرداخت قفل زمانی نیازمند به یک آدرس اولیه بیت کوین به همراه کلید های عمومی و خصوصی آن هستیم که می توانیم از یکی از آدرس های کیف پول الکتروم استفاده کنیم. برای امنیت بیشتر بهتر است کیف پول جدیدی در الکتروم ایجاد و مبلغی را که می خواهیم قفل شود در آن آدرس واریز کنیم. توجه کنید که تنها یکی از آدرس های کیف پول HD Address استفاده می کنیم و مبلغ مورد نظر را در آن میریزیم.
همینطور که مشاهده می کنید بر روی کیف پول الکتروم موجودی به مبلغ 0.0011824 بیتکوین به آدرس اولیه 1ϴϴϴϴϴϴϴϴϴ2HbiE واریز شده است و حالا کافیست کلید عمومی و خصوصی آدرس اولیه مورد نظر را از کیف پول استخراج کنیم.
کلید عمومی آدرس اولیه که موجودی در آن قرار دارد: 0ϴϴϴϴϴϴϴϴϴ57b0ce
کلید خصوصی آدرس اولیه که موجودی در آن قرار دارد: KϴϴϴϴϴϴϴϴϴDeJay
حال به کمک coinb.in یک آدرس جدید با قفل زمانی ایجاد می کنیم، از تب new گزینه Time Locked Address را انتخاب و کلید عمومی را در باکس اول وارد و مدت زمان قفل ماندن آدرس را در باکس دوم انتخاب و بر روی submit کلیک می کنیم. همچنین می توانید بجای وارد نمودن مدت زمان، شماره بلاکی که در آینده ماین می شود را وارد نمایید.
آدرس جدید 3ϴϴϴϴϴϴϴϴϴSRh به صورت یک آدرس از نوع p2sh خواهد بود و مبلغ موجود در آدرس اولیه بایستی به این آدرس جدید منتقل شود. همچنین Redeem Script ساخته شده 04206ϴϴϴϴϴϴϴϴϴceac برای ارسال تراکنش به همراه کلید خصوصی حساب اولیه KϴϴϴϴϴϴϴϴϴDeJay مورد استفاده قرار خواهد گرفت.
برای تایید کافیست تب Verify را انتخاب و اسکریپت ساخته شده را وارد و بر روی submit کلیک کنیم. Hodl Address همان آدرس جدید با قفل زمانی، Required Signature آدرس اولیه و Unlock Time مدت زمانی است که آدرس جدید قفل خواهد بود.
مبلغ 0.0011824 بیتکوین در آدرس اولیه موجود است که پس از کسر fee تراکنش، میبایست آن را به آدرس جدید (دارای قفل زمانی 3ϴϴϴϴϴϴϴϴϴSRh ) انتقال دهیم.
کار تمام است، بدین ترتیب مبلغ 0.00008782 در آدرس جدید با قفل زمانی قرار گرفت و تازمان سرسید آن نمی توان مبلغ را از آدرس جدید خارج نمود.
برای انجام تراکنش و خارج کردن مبلغ از آدرس جدید قفل شده از تب New گزینه Transaction را انتخاب می کنیم، در فیلد اول Redeem Script وارد و بر روی load کلیک می کنیم، موجودی کیف پول 3ϴϴϴϴϴϴϴϴϴSRh در تب Inputs نمایش میابد، حال می توانیم تراکنش ایجاد کنیم، در تب Outputs آدرسی که قصد داریم مبلغ به آن واریز شود را در فیلد Address وارد می کنیم به عنوان مثال bc1ϴϴϴϴϴϴϴϴϴc ، شما می توانید از هر آدرسی برای خروجی اعم از P2PKH ، P2SH ، P2WPKH ، P2WSH استفاده کنید به جز آدرس P2TR که در زمان نگارش این مقاله هنوز در شبکه به صورت عمومی قابل اجرا نبود.
حجم تراکنش با توجه به یک آدرس ورودی P2PKH و یک آدرس خروجی چیزی حدود 190 تا 201 bytes با توجه به نوع آدرس خروجی خواهد بود که با ضرب در جدول whatthefee.io میتوان بهترین fee برای این تراکنش را محاسبه کرد.
کافیست مبلغ fee را از موجودی 0.00008782 کم و در فیلد Amount وارد کنید. بر روی دکمه Submit کلید تا کد transaction یا tx شما ساخته شود.
حال بایستی تراکنش را به کمک کلید خصوصی آدرس اولیه KϴϴϴϴϴϴϴϴϴDeJay که موجودی در آن قرار داشت امضا کنیم. برای این منظور Sign را از منوی اصلی انتخاب می کنیم، در فیلد اول Private key برای امضای تراکنش و در فیلد دوم کد transaction که در مرحله پیش ساخته شد را وارد و در انتها بر روی Submit کلیک می کنیم، tx امضاء شده حاضر برای ارسال بر روی شبکه است.
برای ارسال تراکنش بر روی شبکه و انجام نهایی آن از منوی اصلی Broadcast را انتخاب، کد تراکنش امضاء شده مرحله قبل را در فیلد آن وارد و بر روی Submit کلیک می کنیم.
اگر مدت زمان لازم که ادرس در حالت قفل قرار دارد نگذشته باشد با پیغام خطای non-final مطابق زیر روبرو خواهید شد.
تنها در صورتی امکان ارسال تراکنش بر روی شبکه را خواهید داشت که مدت زمانی که برای قفل بودن آدرس در نظر گرفته اید سپری شده باشد.
پس از ارسال تراکنش در شبکه می توانید TXID را مشاهده و در اکسپلورر بیتکوین آن بررسی کنید.
References
https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki
https://en.bitcoin.it/wiki/Timelock
https://bitcoindev.network/guides/bitcoinjs-lib/timelock-transactions
https://github.com/OutCast3k/coinbin
https://github.com/spesmilo/electrum
تمام (;
درصورت هرگونه سوالی با من در توئیتر درارتباط باشید.
قفل زمانی Timelock یک قرار داد هوشمند در بیت کوین pic.twitter.com/ZS0ol34zci
— Ali2k (@Ali2kCom) July 4, 2021
علی
me [at] ali2k [dot] com