Published Date : 2022年1月1日9:21

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

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を使って理解してみよう。パート4

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

00:06 では前回までの流れをおさらいしてみましょう。

00:06 Let's review the flow up to the last time.

00:09 アルファベットと数字を組み合わせた文字列を作成して、

00:09 Create a string consisting of a combination of alphabetic and numeric characters,

00:14 その中からアルファベット大文字のIとO、小文字のl、

00:14 and remove the uppercase I and O, the lowercase l,

00:18 そして数字の0を除外してbase58で使用する文字列を作成します。

00:18 and the number 0 to create a string to use with base 58.

number = "0123456789"
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
alphanumeric = number + alphabet
misreadable_chars = ["I", "l", "0", "O"]
base58_chars = ""
for c in alphanumeric:
    if c not in misreadable_chars:
        base58_chars += c

00:41 そして前回おこなったbase58のエンコード作業を関数としてまとめます。

00:41 Then, the previous base 58 encoding work is summarized as a function.

00:48 基数は58に設定し、引数として渡された整数値から、商と余りを初期化します。

00:48 Set the radix to 58 and initialize the quotient and remainder from the integer value passed as argument.

00:55 剰余計算の結果を格納する配列を用意して、

00:55 You prepare an array to store the result of the remainder computation,

00:58 While文を使用して、商が0になるまでdivmodメソッドを使って、

00:58 and then use the While statement to compute the quotient and

01:04 商と余りを計算していきます。

01:04 remainder using the divmod method until the quotient is zero.

01:07 そして、剰余計算の結果をインデックスとして使い、

01:07 It then uses the result of the remainder computation as an index,

01:12 base58の文字列からインデックス番号に対応する文字を取り出しリスト化して、

01:12 extracts the characters corresponding to the index number from the base 58 string, lists them,

01:18 joinメソッドを使ってそのリストを結合して、文字列に直したものを関数の結果として返します。

01:18 combines the lists using the join method, and returns the resulting string.

def encode_base58(int_value):
    base = 58
    quotient, remainder = int_value, 0
    list_of_remainders = []
    while quotient > 0:
        quotient, remainder = divmod(quotient, base)
    return ''.join([base58_chars[r] for r in reversed(list_of_remainders)])

01:25 デコード作業も同様に関数としてまとめます。詳細は前回の動画を参考にしてください。

01:25 Let's summarize the decoding work as a function as well. Please refer to my previous video for details.

def decode_base58(base58_encoded_string):
    base = 58
    base58_decoded_int_value = 0
    for idx, c in enumerate(reversed(base58_encoded_string)):
        remainder = base58_chars.find(c)
        int_value = remainder * (base ** idx)
        base58_decoded_int_value += int_value
    return base58_decoded_int_value

01:33 それでは任意の整数値を用意して、作成した関数が上手く機能するかどうかを試してみましょう。

01:33 Now let's give it an arbitrary integer value and see if it works.

01:41 この整数値は前回の時と同じなので、結果は分かっていますが、作成した関数が機能するかどうかを試してみましょう。

01:41 This integer value is the same as last time, so we know the result, but let's see if our function works.

01:51 エンコード作業とデコード作業を行います。

01:51 Perform encoding and decoding tasks.

02:19 では続いて、整数値ではなく文字列をbase58を用いてエンコードするとどうなるか試してみましょう。

02:19 Now let's see what happens if you encode a string instead of an integer using base 58.

02:27 このように、このシリーズの最初のほうで説明した、ハッシュ関数の時に使用したordメソッドを使う方法だと、

02:27 Thus, using the ord method used in the hash function described earlier in this series,

02:37 全ての文字の整数値は計算することができますが、一つの整数値として導くのはどうすればいいでしょうか。

02:37 you can calculate the integer values of all characters, but how do you get them to a single integer value?

02:45 このように、例えばhの文字を16進数表記に直します。

02:45 So, for example, let's change the letter h to hexadecimal.

02:50 これを最後の文字までおこない、一つの16進数表記としてみましょう。

02:50 Let's do this up to the last character and make it a hexadecimal notation.

03:24 この16進数表記をintメソッドを使って整数値に直します。

03:24 Use the int method to convert this hexadecimal notation to an integer value.

03:30 あとは先ほど作成したbase58のエンコード関数を使えば簡単に文字列が作成されます。

03:30 The base 58 encoding function you just created can be used to easily create a base 58 string.

03:39 ordメソッドを使って文字を一つずつ整数に直してエンコード作業を行うと、まったく違った文字列になってしまいます。

03:39 Using the ord method to convert characters to integers one at a time and perform the encoding would result in a completely different string.

04:03 上記のようなめんどくさい作業を行わなくても、簡単に文字列を、

04:03 There is an encode method that can easily convert a string into

04:08 そのままバイト列として変換できるencodeメソッドがあるので、

04:08 a byte without the hassle of doing the above,

04:13 isinstanceメソッドなどを併用して、使ってみましょう。

04:13 so you can use it with the isinstance method, etc.

04:17 バイト列から整数値を計算するときは、from_bytesメソッドを使用しましょう。

04:17 Use the from_bytes method to compute an integer value from a sequence of bytes.

04:24 第一引数に変換したいバイト列、第二引数にはバイトオーダーを指定します。

04:24 The first argument specifies the byte sequence to be converted, and the second argument specifies the byte order.

04:30 バイト列やバイトオーダーに関してはこのシリーズの最初のほうの動画で説明しているので、それらの動画を参考にしてください。

04:30 Byte strings and byte order are explained in the video at the beginning of this series, so please refer to those videos.

04:38 最初に計算した整数値と同じになっていますね。

04:38 It is the same as the integer value calculated first.

04:43 16進数表記に直しても、同じであることが確認できます。

04:43 It can be confirmed that they are the same even if you change them to hexadecimal notation.

04:53 Part5へ続く。

04:53 Continued to Part 5.


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