چطور آدرس بیت کوین تولید کنیم !؟

سلام ! قبل از هرچیزی اشاره کنم که یه برنامه نویسم، معمولا برنامه نویسا با نوشتن محتوا زیاد رابطه خوبی ندارند مگر زمان صحبت با ماشین :)، پس اگر غلط محتوایی، املایی دیدین دیگه مرحمت فرمایید. نمیخوام درمورد اینکه بیت کوین چیه و از کجا اومده یا باهاش چیکارا میشه کرد صحبت کنم، بیشتر حرفمون الگوریتم و ریاضیات پشت برده این قضیه اس البته اثبات الگوریتم نه فقط مفاهیم! و در آخر با همدیگه نحوه تولید آدرس بیت کوین رو کدنویسی میکنیم . Elliptic curveنمودار الیپتیک درواقع ریشه اصلی پیدایش ارزهای کریپتو هست. چند تا ویژگی منحصر به فردی داره این برادرمون که باعث میشه تو مباحث کریپتو ازش استفاده کنن.نمودار همیشه نسبت به محور x متقارن هست.اگر دو نقطه مشخص روی نمودار رو با یه خط به هم وصل کنیم، همیشه یه نقطه سومی روی نمودار رو قطع میکنه که اگر این نقطه رو نسبت به محور x منعکس کنیم نقطه ای که بدست میاد جمع اون نقاط قبلی هست که بهش میگن عملیات Point Addition. شکل رو توجه کنین بهتر متوجه میشین: P + Q = R یه عملیات دیگه هم داریم به اسم Point Doubling که دقیقا مشابه توضیحات قبله ولی اینجا نقطه مورد نظر با خودش جمع میشه (خط مماس روی نقطه) شکل رو توجه کنین: P + P = R = 2 . pاز این عملیات یه نتیجه گیری میشه : R = a . Pبهش میگن ضرب اسکالر یا همون ضرب نقطه ای یا همون ضرب برداری (نقاط دارای طول و عرض هست برا همین ضرب اسکالر هست.)خیلی معادله رو باز نمیکنیم فقط اشاره کنم که تو بحث بیت کوین نقاط به این شکل نامگذاری میشه:P -> Base Point ()a -> Private KeyR -> Public Keyاگه علاقه دارین بدونین دلیل این نامگذاری و اثباتش میتونین کتاب Programming Bitcoin: Learn How to Program Bitcoin from Scratch از jimmy song رو مطالعه کنید.همانطوری که از اسم متغیر ها مشخصه Public key چیزیه که ما میتونیم با همه به اشتراک بزاریم، پس برا تولید آدرس بیت کوین اول باید private key داشته باشیم تا طبق معادله R = a . P به public key و در نتیجه تولید یه آدرس یا کیف برای دریافت بیت کوین برسیم.مراحل تولید آدرس به این شکل هست من از زبان برنامه نویسی Golang استفاده میکنم، طبق شماره مراحل کدنویسی رو شروع میکنیم:در ابتدا برا کار با elliptic و تولید key دو تا پکیج نیاز داریم&quotgithub.com/btcsuite/btcd/btcec&quot &quotgithub.com/btcsuite/btcutil&quotطبق عکس بالا شروع میکنیم.در ابتدا نیاز به تولید private key هست تا بتونیم public key رو بدست بیاریم:privateKey, _ := btcec.NewPrivateKey(elliptic.P256()) pubKey := privateKey.PubKey().SerializeCompressed()دقت کنید که داریم با نمودار کار میکنیم پس key ها بصورت نقطه روی نمودار هست یعنی طول و عرض دارن پس نیاز هست که serialize کنیم به بایت (مرحله ۲ تو عکس بالا) ، دو روش وجود داره compressed و uncompressed که compressed فضای کمتری نسبت به uncompressed اشغال میکنه، برا جزییات بیشتر کتابی که معرفی کردم رو حتما مطالعه کنید.بریم سراغ مرحله بعدی یعنی شماره 2 : اینجا نیاز به انجا دو تا عملیات هش داریم sha256 پشت سرش ripemd160 که ترکیب اینا رو به اصطلاح hash160 میگن.pubKeyH160 := btcutil.Hash160(pubKey)بیت کوین دو تا شبکه داره testnet و mainnet ، همانطوری که از اسمش پیداس شبکه testnet برا اهداف برنامه نویسی توسط دولوپرا استفاده میشه.برا تولید آدرس تو شبکه اصلی مقدار بدست آمده تو مرحله ۳ رو با مقدار هگز 0x00 ترکیب میکنیم:pk := append(prefix, pubKeyH160...)سپس طبق مرحله ۵ و ۶ دوبار عملیات هش رو انجام میدیم:pkh1 := sha256.Sum256(pk) pkh2 := sha256.Sum256(pkh1[:])مراحل ۷ و ۸ به این صورته که ابتدا ۴ بایت اول نتیجه قبل رو بدست میاریم و با مقدار مرحله ۳ ترکیب کرده و بصورت base58 انکد میکنیم ، نتیجه بدست آمده آدرس بیت کوین می باشد.باز هم اشاره میکنم اینکه چرا base58 کردیم و از base64 استفاده نشده تو کتاب گفقته شده مفصل توضیح داده شده است.base58.Encode(append(pk, pkh2[:4]...)) //our btc address یه تست ساده برا چک کردن طول آدرس بدست آمده می نویسیم (آدرس بیت کوین ۳۴ کاراکتر می باشد.)package main import ( &quottesting&quot ) func TestGenerateAddr(t *testing.T) { btcAddress := generateAddr(&quottestnet&quot) if len(btcAddress) != 34 { t.Error(&quotWrong address&quot) } }اگر علاقه مند باشید کتاب jimmy song همراه با وب سایت ویکی بیت بسیار کمک کننده خواهد بود.