قفل زمانی Timelock یک عملکرد نوآورانه در بیتکوین و بهنوعی قرارداد هوشمند smart contract است که به شماره بلاک و یا زمانی واقعی اشاره دارد و برای قفل نمودن یک آدرس بیتکوین برای مدتزمانی در آینده بکار برده میشود. به بیان سادهتر از این امکان میتوان بهمانند دستور پرداخت در آینده استفاده کرد. در این شیوه پرداخت میتوان از ابتدا یا در هر زمانی قبل از موعد بازپرداخت، افزایش موجودی داد.
در این مقاله به طور پیشفرض در نظر میگیریم که آشنایی لازم با شبکه بیتکوین، ساخت و استفاده از کیف پول الکتروم و ایجاد امنیت کاربری در استفاده از آن را برخوردار هستیم. توجه داشته باشید برای فهم بهتر کلیه تراکنشها بر روی شبکه اصلی بیتکوین انجام گرفته است. همچنین برای حفظ حریم خصوصی نگارنده از کاراکتر ϴϴϴϴϴϴϴϴϴ در کلیه آدرسها استفاده شده است.
برای ایجاد آدرس کیف پول با قابلیت قفل زمانی از دو کیف پول Electrum و Coinb.in استفاده میکنیم. با توجه به اهمیت دریافت کیف پول از منبع معتبر، کافی است از وبسایت رسمی کیف پول آن را دانلود و در صورت دارابودن امضای pgp آن را کنترل نمایید.
کیف پول Coinb.in بهصورت html و به زبان جاوا اسکریپت نوشته شده است. کافی است پس از دانلود، اکسترکت نموده و فایل index.html را در کامپیوتر خود اجرا کنید تا بهصورت آفلاین و امن از امکانات این کیف پول استفاده کنید. متأسفانه این کیف پول از سال ۲۰۱۷ توسط برنامهنویسان توسعه پیدا نکرده و امکان پشتیبانی TimeLockAddress در کیف پول SegWit و یا استفاده از شبکه testnet وجود ندارد و بایستی بر روی شبکه اصلی از کیف پول Legacy استفاده کنیم.
برای ایجاد و بازپرداخت قفل زمانی نیازمند به یک آدرس اولیه بیتکوین به همراه کلیدهای عمومی و خصوصی آن هستیم که میتوانیم از یکی از آدرسهای کیف پول الکتروم استفاده کنیم. برای امنیت بیشتر بهتر است کیف پول جدیدی در الکتروم ایجاد و مبلغی را که میخواهیم قفل شود در آن آدرس واریز کنیم. توجه کنید که تنها یکی از آدرسهای کیف پول HD Address استفاده میکنیم و مبلغ موردنظر را در آن واریز میکنیم.
همینطور که مشاهده میکنید بر روی کیف پول الکتروم موجودی به مبلغ ۰.۰۰۱۱۸۲۴ بیتکوین به آدرس اولیه 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 مدتزمانی است که آدرس جدید قفل خواهد بود.
مبلغ ۰.۰۰۱۱۸۲۴ بیتکوین در آدرس اولیه موجود است که پس از کسر fee تراکنش، میبایست آن را به آدرس جدید (دارای قفل زمانی 3ϴϴϴϴϴϴϴϴϴSRh) انتقال دهیم.
کار تمام است، بدین ترتیب مبلغ ۰.۰۰۰۰۸۷۸۲ در آدرس جدید با قفل زمانی قرار گرفت و تا زمان سرسید آن نمیتوان مبلغ را از آدرس جدید خارج نمود.
برای انجام تراکنش و خارج کردن مبلغ از آدرس جدید قفل شده از تب New گزینه Transaction را انتخاب میکنیم، در فیلد اول Redeem Script وارد و بر روی load کلیک میکنیم، موجودی کیف پول 3ϴϴϴϴϴϴϴϴϴSRh در تب Inputs نمایش میابد، حال میتوانیم تراکنش ایجاد کنیم، در تب Outputs آدرسی که قصد داریم مبلغ به آن واریز شود را در فیلد Address وارد میکنیم بهعنوانمثال bc1ϴϴϴϴϴϴϴϴϴc ، شما میتوانید از هر آدرسی برای خروجی اعم از P2PKH ، P2SH ، P2WPKH ، P2WSH استفاده کنید به جز آدرس P2TR که در زمان نگارش این مقاله هنوز در شبکه بهصورت عمومی قابلاجرا نبود.
حجم تراکنش با توجه به یک آدرس ورودی P2PKH و یک آدرس خروجی چیزی حدود ۱۹۰ تا ۲۰۱ bytes با توجه به نوع آدرس خروجی خواهد بود که با ضرب در جدول whatthefee.io میتوان بهترین fee برای این تراکنش را محاسبه کرد.
کافی است مبلغ fee را از موجودی ۰.۰۰۰۰۸۷۸۲ کم و در فیلد 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