کدگذاری پایه۵۸آزما
کدگذاری پایه۵۸آزما (به انگلیسی: Base58Check encoding) گونهای از کدگذاری ویرایش شدهی پایه۵۸ است که برای نشانیهای بیتکوین بکار میرود. به زبان دیگر آرایههای بایتی با این کدگذاری رشتههای خوانا برای انسان میشوند.
پیشزمینه[ویرایش | ویرایش مبدأ]
نخستین نگارش نرمافزار مشتری بیتکوین دربارهی انگیزهی کدگذاری پایه۵۸ در فایل base58.h میگوید:
// Why base-58 instead of standard base-64 encoding?
// - Don't want 0OIl characters that look the same in some fonts and
// could be used to create visually identical looking account numbers.
// - A string with non-alphanumeric characters is not as easily accepted as an account number.
// - E-mail usually won't line-break if there's no punctuation to break at.
// - Doubleclicking selects the whole number as one word if it's all alphanumeric.
«چرا پایه۵۸ بجای پایه۶۴ استاندارد؟
-نویسههای همانند، مانند 0OIl که در برخی فونتها یکریختند و میتوان با آنها شماره حسابهای به چشم برابر ساخت نمیخواهیم
-رشتهای با نویسههایی جز الفبا و شماره به سادگی به نام شماره حساب پذیرفته نمیشود
-رایانامه به خط را نمیشکند مگر نشانهی روشنی برای شکست خط باشد.
-اگر همهی نویسهها شماره و الفبا باشد دوبار تلیک کردن همهی شماره را یک واژه دیده و میگزیند»
ویژگیهای کدگذاری پایه۵۸آزما[ویرایش | ویرایش مبدأ]
کدگذاری پایه۵۸آزما ویژگیهای زیر را دارد:
- بار به اندازهی دلبخواه.
- دستهای از ۵۸ نماد الفبا و شماره که از واتهای بزرگ و کوچک روشن است (0oil بکار نمیرود)
- یک بایت برای دانش نگارش/کاربرد. نشانیهای بیتکوین این بایت را 0x00 میگذارند. (آیندگان شاید 0x05 را بکار ببرند).
- چهار بایت (۳۲ بیت) کد بررسی ایراد برپایهی SHA256. این کد را میتوان برای شناسایی خودکار و شاید ویرایش ایرادهای نوشتاری بکار برد.
- گامی اضافی برای حفظ صفرهای پیشرو در داده ها.
- گامی افزوده برای نگهداری سِفرها در آغازِ داده.
ساخت رشتهی پایه۵۸آزما[ویرایش | ویرایش مبدأ]
رشتهی پایه۵۸آزما با داشتن یک بایت نگارش/کاربرد و بایتهای بار اینگونه است:
- بایت نگارش و بایتهای بار را به هم میچسبانیم.
- چهار بایت آغازین درهمِ درهمِ گرفته شده با شا-۲۵۶ را برمیداریم (به زبان دیگر چهار بایت آغازین
SHA256(SHA256(دادهی گام ۱))
) - دادههای گام ۱ و گام ۲ را به هم میچسبانیم.
- دادهی گام ۳ که یک سری بایت است را یک شمارهی بزرگ به ریخت بزرگسر(بیگ اندیان) گرفته و به کمک گامهای ریاضی (تقسیم شمارهی بزرگ) و الفبای پایه۵۸ پایین آن را به پایه۵۸ در میآوریم. دادهی بدست آمده باید پیرایش شود تا سِفرِ پایه۵۸ نداشته باشد. (نویسهی آغازین 1 خواهد بود)
- نخستین نویسه، 1، که در پایه۵۸ ارزش سفر دارد برای بایت درستهی آغازین با ارزش سفر نگهداری شده و برابر با نمادی در پایه۵۸ نیست. میتوان یک یا بیش از یک 1 در آغاز داده آورد تا نمایندهی یک یا بیش از یک بایتِ ارزش سفر باشند. بایتهای آغازین ارزش سفر گام ۳ را بشمارید (برای نشانیهای کهنهی بیتکوین همیشه دست کم یکی برای بایت نگارش/کاربرد هست و برای نشانیهای نوتر هرگز نیست) در دادهی نهایی به ازای هر یک باید یک 1 پیشرو آمده باشد.
- 1های گام۵ را به آغاز گام ۴ بچسبانید، این ریخت پایه۵۸آزماست.
کدگذاری نشانی بیتکوین[ویرایش | ویرایش مبدأ]
نشانیهای بیتکوین با کدگذاری پایه۵۸آزمای درهم یکی از این دو پیاده میشوند:
- پرداخت به درهم دستورگان (P2SH): بار
RIPEMD160 (SHA256 (RedeemScript))
است که در آنRedeemscript دستورگانگشایش
دستورگانی است که کیف پول میداند چگونه خرج کند. نگارش 0x05 (این نشانیها با '3' آغاز میشود) - پرداخت به درهم کلید همهبین (P2PKH): بار
RIPEMD160 (SHA256 (ECDSA_PUBLICKEY)))
کهکلیدهمهبین_ایسیدیاسای ECDSA_Publickey
کلید همهبینی است که کیفپول کلید خودویژهاش را میشناسد. نگارش 0x00 (این نشانیها با '1' آغاز میشود)
درهم بدست آمده در هر دو گونه همیشه بیکم و کاست ۲۰ بایت است. اینها بزرگسرند (آغاز با پرارزشترین بایت). (از پیادهسازیهای شماره بزرگی که بایت پیشروی 0x00 را میزدایند پرهیز کنید، یا یک بایت 0x00 را برای نمایش نشان به آغاز شماره بیافزایید- برنامهی شما باید در برابر این نمونهها به درستی پاسخ دهد وگرنه ممکن است نشانیهایی با نمای درست بسازید که می توان به آنها پول فرستاد اما نمیتوان از آن خرج کرد پس به از دست دادن سکهها برای همیشه میانجامد.)
کدگذاری کلید خودویژه[ویرایش | ویرایش مبدأ]
کدگذاری پایه۵۸آزمای همچنین برای کدگذاری کلیدهای خودویژهی ایسیدیاِساِی در ریخت درونبرد کیفپول بکار میرود. این روند همانند روند نشانی بیتکوین است، به جز اینکه 0x80 برای بایت نگارش/کاربرد بکار میرود، و بار به جای ۲۰ بایت، ۳۲ بایت است (کلید خودویژه در بیتکوین شمارهی درست بزرگسرِ بینشانِ ۳۲بایتی است). برای کلیدهای خودویژهی همتای کلید همهبین فشرده نشده، این کدگذاریها همیشه یک رشتهی ۵۱نویسهای میدهند که با "5" یا ریزبینانهتر با "5H"یا "5J" یا "5K" آغاز میشود.
نمودار نماد پایه۵۸[ویرایش | ویرایش مبدأ]
این نمودار تنها برای بیتکوین است و با بافتارهای دیگر شاید سازگار نباشد (نویسههای زدوده شده: 0O, lI )
ارزش | نویسه | ارزش | نویسه | ارزش | نویسه | ارزش | نویسه |
---|---|---|---|---|---|---|---|
0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 |
4 | 5 | 5 | 6 | 6 | 7 | 7 | 8 |
8 | 9 | 9 | A | 10 | B | 11 | C |
12 | D | 13 | E | 14 | F | 15 | G |
16 | H | 17 | J | 18 | K | 19 | L |
20 | M | 21 | N | 22 | P | 23 | Q |
24 | R | 25 | S | 26 | T | 27 | U |
28 | V | 29 | W | 30 | X | 31 | Y |
32 | Z | 33 | a | 34 | b | 35 | c |
36 | d | 37 | e | 38 | f | 39 | g |
40 | h | 41 | i | 42 | j | 43 | k |
44 | m | 45 | n | 46 | o | 47 | p |
48 | q | 49 | r | 50 | s | 51 | t |
52 | u | 53 | v | 54 | w | 55 | x |
56 | y | 57 | z |
الگوریتم کدگذاری رشته بایت نشانی(۱ بایت نگارش+ درهم یا دادهی دیگر+ ۴بایت کد وارسی):
code_string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
x = convert_bytes_to_big_integer(hash_result)
output_string = ""
while(x > 0)
{
(x, remainder) = divide(x, 58)
output_string.append(code_string[remainder])
}
repeat(number_of_leading_zero_bytes_in_hash)
{
output_string.append(code_string[0]);
}
output_string.reverse();
بایتهای نگارش[ویرایش | ویرایش مبدأ]
برخی بایتهای نگارش:
نگارش دهدهی | نماد پیشرو | کاربرد |
---|---|---|
0 | 1 | درهم کلید همهبین بیتکوین |
5 | 3 | درهم دستورگان بیتکوین |
21 | 4 | کلید همهبین(فشرده) بیتکوین(پیشنهادی) |
52 | M یا N | درهم کلید همهبین نِیمکوین |
128 | 5 | کلید خودویژه(همتای کلید همهبین نافشرده) |
128 | K یا L | کلید خودویژه(همتای کلید همهبین فشرده) |
129-135 | 5, K, L, یا M | کلید خودویژه (ویژهی الکترام و اکنون تاریخ گذشته) |
111 | m یا n | درهم کلید همهبین بیتکوین شبکهی آزمایشی |
196 | 2 | درهم دستورگان بیتکوین شبکهی آزمایشی |