Published Date : 2021年11月7日17:35

027 Pythonでビットコインを学ぶ (BASE58の仕組みをPythonと図を使って理解してみよう パート2)
027 Use python to learn bitcoin (Understand how BASE 58 works in using Python and diagrams Part 2)


This blog has an English translation


ニコニコ動画にアップした動画のまとめ記事です。

This is a summary blog post about a video I uploaded to NicoNico.

細かい部分は動画を参考にしてください。

Please refer to the video for details.


目次

Table of Contents




① 動画の説明
① Video Description



00:00 BASE58の仕組みをPythonを使って理解してみよう。パート2

00:00 Understand how BASE 58 works in using Python. Part 2

00:07 前回のパート1では図でBase58の概要を説明して、Pythonで数字とアルファベットを組み合わせて文字列を作成しました。

00:07 In Part 1, I gave you an overview of Base58 in several diagrams, and created a string in Python that combines numbers and alphabets.

number = "0123456789"
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
alphanumeric = number + alphabet

print(alphanumeric)

'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

00:28 文字列の長さは0から9までの10文字、大文字Aから大文字Z、小文字aから小文字zまでの52文字で合計62文字です。

00:28 The string length is 10 characters from 0 to 9, 52 characters from uppercase A to uppercase Z and from lowercase a to lowercase z for a total of 62 characters.

len(alphanumeric)

62

00:48 では前回説明した不要な4文字を除去していきましょう。配列から要素のインデックス番号を調べるにはindexメソッドを使います。

00:48 Now, let's remove the 4 unnecessary characters I explained last time. Use the index method to find the index number of an element in an array.

00:55 一文字ずつ調べていきましょう。

00:55 Let's check one character at a time.

alphanumeric.index('I')
18

alphanumeric.index('l')
47

alphanumeric.index('O')
24

alphanumeric.index('0')
0

01:33 Base58の文字列を作る為に除去する不要な4文字の配列を用意します。

01:33 Prepare an array of 4 characters that you need to remove to make a Base 58 string.

misreadable_chars = ['I', 'O', 'l', '0']

01:41 Base58の文字列を格納する空文字変数を用意します。

01:41 Prepares an empty string variable to store the Base 58 string.

base58_chars = ''

01:48 先ほど作成した数字とアルファベットを組み合わせた配列の要素を、For文を使って一つずつ取り出します。

01:48 Use the For statement to retrieve the elements of the array you just created, one by one.

01:53 そしてその要素が不要な4文字の配列の中にあるかどうかを判定し、無かったらその要素をBase58の文字列の変数へ足し合わせていきます。

01:53 It then determines if the element is in an array of 4 characters that it doesn't need, and if the character is not in the array, the element is added to the base 58 string variable.

for c in alphanumeric:
    if c not in misreadable_chars:
        base58_chars += c

print(base58_chars)
'123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

len(base58_chars)
58

02:07 前回の図で説明した10進数や2進数等による文字列の長さの違いを確認してみましょう。

02:07 Let's take a look at the difference in the length of a character string depending on how it is displayed, such as the decimal and binary numbers described in the previous diagram.


            

02:38 それでは2の32乗の数を使って(この数はどんな数でも構いません)、Base58のエンコードを行ってみましょう。

02:38 Now let's do Base 58 encoding, using the number of 2 raised to the power of 32 as a test (any number will do).

02:47 ちなみに1ビットに対して左シフトを行うと、N回シフトする毎に2のN乗の値になります。

02:47 By the way, if you do the left shift to the one bit, you get a value of 2 raised to the power of N for every N left shifts.

03:27 divmodメソッドの第一引数に割られる数、第二引数に割る数を渡すと商と余りを同時に計算できます。

03:27 The divmod method allows the quotient and remainder to be computed simultaneously. The first argument of the divmod method is the number to dividend, and the second argument is the number to divisor.

03:54 商と余りはトゥープルで渡されるので、二つの変数をカンマ区切りにしてそれらの変数に計算結果の商と余りを代入してあげます。

03:54 Since the quotient and the remainder are passed in tuples, we separate the two variables into commas and assign the quotient and remainder of the result to them.

quotient, remainder = divmod(int_value, 58)

4:10 Part3へ続く。

4:10 Continued to Part 3.



以上です。お疲れ様です。

That's all. Thank you for your hard work.