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

Ali
Ali Dec 07, 2021
قفل زمانی یک قرارداد هوشمند در بیتکوین؛ دستور پرداخت در آینده

قفل زمانی Timelock یک عملکرد نوآورانه در بیتکوین و به‌نوعی قرارداد هوشمند smart contract است که به شماره بلاک و یا زمانی واقعی اشاره دارد و برای قفل نمودن یک آدرس بیتکوین برای مدت‌زمانی در آینده بکار برده می‌شود. به بیان ساده‌تر از این امکان می‌توان به‌مانند دستور پرداخت در آینده استفاده کرد. در این شیوه پرداخت می‌توان از ابتدا یا در هر زمانی قبل از موعد بازپرداخت، افزایش موجودی داد.

 

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

 

برای ایجاد آدرس کیف پول با قابلیت قفل زمانی از دو کیف پول Electrum و Coinb.in استفاده می‌کنیم. با توجه به اهمیت دریافت کیف پول از منبع معتبر، کافی است از وب‌سایت رسمی کیف پول آن را دانلود و در صورت دارابودن امضای pgp آن را کنترل نمایید.

 

کیف پول Coinb.in به‌صورت html و به زبان جاوا اسکریپت نوشته شده است. کافی است پس از دانلود، اکسترکت نموده و فایل index.html را در کامپیوتر خود اجرا کنید تا به‌صورت آفلاین و امن از امکانات این کیف پول استفاده کنید. متأسفانه این کیف پول از سال ۲۰۱۷ توسط برنامه‌نویسان توسعه پیدا نکرده و امکان پشتیبانی TimeLockAddress در کیف پول SegWit و یا استفاده از شبکه testnet وجود ندارد و بایستی بر روی شبکه اصلی از کیف پول Legacy استفاده کنیم.

 coinb.in wallet

coinb.in wallet


برای ایجاد و بازپرداخت قفل زمانی نیازمند به یک آدرس اولیه بیتکوین به همراه کلیدهای عمومی و خصوصی آن هستیم که می‌توانیم از یکی از آدرس‌های کیف پول الکتروم استفاده کنیم. برای امنیت بیشتر بهتر است کیف پول جدیدی در الکتروم ایجاد و مبلغی را که می‌خواهیم قفل شود در آن آدرس واریز کنیم. توجه کنید که تنها یکی از آدرس‌های کیف پول HD Address استفاده می‌کنیم و مبلغ موردنظر را در آن واریز می‌کنیم.

 address 1ϴϴϴϴϴϴϴϴϴHbiE, amount 0.0011824

address 1ϴϴϴϴϴϴϴϴϴHbiE, amount 0.0011824


همین‌طور که مشاهده می‌کنید بر روی کیف پول الکتروم موجودی به مبلغ ۰.۰۰۱۱۸۲۴ بیتکوین به آدرس اولیه 1ϴϴϴϴϴϴϴϴϴ2HbiE واریز شده است و حالا کافی است کلید عمومی و خصوصی آدرس اولیه موردنظر را از کیف پول استخراج کنیم.

public key 0ϴϴϴϴϴϴϴϴϴ57b0ce

public key 0ϴϴϴϴϴϴϴϴϴ57b0ce

 کلید عمومی آدرس اولیه که موجودی در آن قرار دارد: 0ϴϴϴϴϴϴϴϴϴ57b0ce


private key KϴϴϴϴϴϴϴϴϴDeJay

private key KϴϴϴϴϴϴϴϴϴDeJay

کلید خصوصی آدرس اولیه که موجودی در آن قرار دارد: KϴϴϴϴϴϴϴϴϴDeJay

 

حال به کمک coinb.in یک آدرس جدید با قفل زمانی ایجاد می‌کنیم، از تب new گزینه Time Locked Address را انتخاب و کلید عمومی را در باکس اول وارد و مدت‌زمان قفل ماندن آدرس را در باکس دوم انتخاب و بر روی submit کلیک می‌کنیم. همچنین می‌توانید به‌جای وارد نمودن مدت‌زمان، شماره بلاکی که در آینده ماین می‌شود را وارد نمایید.

time locked address

time locked address


آدرس جدید 3ϴϴϴϴϴϴϴϴϴSRh به‌صورت یک آدرس از نوع p2sh خواهد بود و مبلغ موجود در آدرس اولیه بایستی به این آدرس جدید منتقل شود. همچنین Redeem Script ساخته شده 04206ϴϴϴϴϴϴϴϴϴceac برای ارسال تراکنش به همراه کلید خصوصی حساب اولیه KϴϴϴϴϴϴϴϴϴDeJay مورداستفاده قرار خواهد گرفت.

 

برای تأیید کافی است تب Verify را انتخاب و اسکریپت ساخته شده را وارد و بر روی submit کلیک کنیم. Hodl Address همان آدرس جدید با قفل زمانی، Required Signature آدرس اولیه و Unlock Time مدت‌زمانی است که آدرس جدید قفل خواهد بود.

 verify redeem script

verify redeem script

 

مبلغ ۰.۰۰۱۱۸۲۴ بیتکوین در آدرس اولیه موجود است که پس از کسر fee تراکنش، می‌بایست آن را به آدرس جدید (دارای قفل زمانی 3ϴϴϴϴϴϴϴϴϴSRh) انتقال دهیم.

send amount to time locked address

send amount to time locked address

 

کار تمام است، بدین ترتیب مبلغ ۰.۰۰۰۰۸۷۸۲ در آدرس جدید با قفل زمانی قرار گرفت و تا زمان سرسید آن نمی‌توان مبلغ را از آدرس جدید خارج نمود.

 

برای انجام تراکنش و خارج کردن مبلغ از آدرس جدید قفل شده از تب New گزینه Transaction را انتخاب می‌کنیم، در فیلد اول Redeem Script وارد و بر روی load کلیک می‌کنیم، موجودی کیف پول 3ϴϴϴϴϴϴϴϴϴSRh در تب Inputs نمایش میابد، حال می‌توانیم تراکنش ایجاد کنیم، در تب Outputs آدرسی که قصد داریم مبلغ به آن واریز شود را در فیلد Address وارد می‌کنیم به‌عنوان‌مثال bc1ϴϴϴϴϴϴϴϴϴc ، شما می‌توانید از هر آدرسی برای خروجی اعم از P2PKH ، P2SH ، P2WPKH ، P2WSH استفاده کنید به جز آدرس P2TR که در زمان نگارش این مقاله هنوز در شبکه به‌صورت عمومی قابل‌اجرا نبود.

 create a new transaction

create a new transaction

 

حجم تراکنش با توجه به یک آدرس ورودی P2PKH و یک آدرس خروجی چیزی حدود ۱۹۰ تا ۲۰۱ bytes با توجه به نوع آدرس خروجی خواهد بود که با ضرب در جدول whatthefee.io می‌توان بهترین fee برای این تراکنش را محاسبه کرد.

 whatthefee.io

whatthefee.io

 

کافی است مبلغ fee را از موجودی ۰.۰۰۰۰۸۷۸۲ کم و در فیلد Amount وارد کنید. بر روی دکمه Submit کلید تا کد transaction یا tx شما ساخته شود.

 

حال بایستی تراکنش را به کمک کلید خصوصی آدرس اولیه KϴϴϴϴϴϴϴϴϴDeJay که موجودی در آن قرار داشت امضا کنیم. برای این منظور Sign را از منوی اصلی انتخاب می‌کنیم، در فیلد اول Private key برای امضای تراکنش و در فیلد دوم کد transaction که در مرحله پیش‌ساخته شد را وارد و در انتها بر روی Submit کلیک می‌کنیم، tx امضا شده حاضر برای ارسال بر روی شبکه است.

 sign transaction

sign transaction


برای ارسال تراکنش بر روی شبکه و انجام نهایی آن از منوی اصلی Broadcast را انتخاب، کد تراکنش امضا شده مرحله قبل را در فیلد آن وارد و بر روی Submit کلیک می‌کنیم.

اگر مدت‌زمان لازم که آدرس در حالت قفل قرار دارد نگذشته باشد با پیغام خطای non-final مطابق زیر روبرو خواهید شد.

 broadcast transaction

broadcast transaction


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

broadcast transaction

broadcast transaction


پس از ارسال تراکنش در شبکه می‌توانید TXID را مشاهده و در اکسپلورر بیتکوین آن بررسی کنید.

bitcoin block explorer

bitcoin block explorer


برای مطالعه مطالب بیشتر از این نویسنده: توییتر / علی

 

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

دیدگاه کاربران
رضا Dec 25, 2021

با سپاس از شما برای تهیه ی این مقاله ی مفید

ارسال دیدگاه جدید