およそ2週間前、私は自分がなぜビットコインに対して敵意を持っていたのかを認識しました。その理由は、ビットコインを所有しておらず、理解していなかったからです。そのため私は、ブロックチェーンとも呼ばれるビットコインの背後にある技術を研究することで、ビットコインについて学習することを決意しました。ブロックチェーンを構築するPythonスクリプトを作成することを学んだ私は、ブロックチェーンに対する理解を深めたいと思っている人たちとその学習内容を共有しようと考えました。誤解のないように言うと、私はビットコインにインスピレーションを受けましたが、この記事はブロックチェーンに重点を置いています。
ブロックの内容
一般的に、ブロックには、トランザクション(取引)データ、タイムスタンプ、直前のブロックへのリンクが含まれています。私のブロックの実装では、以下の属性を持つブロックのクラスを作成しました。
・インデックス:チェーン内のブロックの位置を追跡するもの
・タイムスタンプ:ブロックが作成された日時
・データ:ブロックに格納されている実際のデータ(誰がどのくらい購入したかなど)
・直前のハッシュ:チェーン内の直前のブロックのハッシュ
・ハッシュ:ブロックのハッシュ。ハッシング(ハッシュ化)についてよくわからない人向けに説明すると、ハッシュとは基本的に任意の長さのデータを固定サイズのデータにマッピングすることであり、本質的にブロックを表す文字列です。
私は、暗号学的ハッシュアルゴリズムであるSHA-256のアルゴリズムを使ってブロックのハッシュ値を計算しました。ブロックを表す属性(つまり、インデックス、タイムスタンプ、データ、直前のハッシュ)をハッシュアルゴリズムに入力すると、「calculateHash」関数はその入力に基づいて256ビットの文字列を返します。
ブロックチェーン
チェーンの初期化
第一に、ブロックチェーンの最初のブロックをgenesis(起源)ブロックと呼びます。genesisブロックと呼ばれるのは、チェーンの始まりである元のブロックだけです。私の実装では、ブロックチェーンが作成されると、genesisブロックが自動的に作成されます。
ブロックの追加
チェーンに新しいブロックを追加するには、直前のブロックのハッシュを取得してから、新しいブロックのハッシュ値を計算する必要があります。直前のブロックのハッシュは、ハッシュ関数に対する入力値であるため、直前のハッシュを取得した後に新しいブロックのハッシュ値を計算しなければなりません。「getLatestBlock」メソッドは、チェーン上の最後のブロックを取得するために使用されるため、新しいブロックを追加する場合、そのブロックが直前のブロックになります。
チェーンのセキュリティ保護
ブロックチェーンは、設計自体に修正(改ざん)に対する耐性があります。ブロックチェーンのセキュリティが保護されている理由の一部として挙げられるのは、ブロック間のリンクが改ざんされていないことを保証するというその特性です。そのため、3番目のブロックの直前のハッシュは、2番目のブロックのハッシュと実質的に同じです。このことを確認できるのが「isChainValid」メソッドです。ブロックチェーンのセキュリティを保護するもう1つの要素は、ブロックが作成されてからブロック内のデータが変更されていないことを保証する特性です。例えば、誰かがブロック内でトランザクション(取引)を完了した人物を変更(改ざん)しようとした場合、セキュリティを確保するためにこの行為を防止しなければなりません。ブロック内のデータが改ざんされている場合、ブロックのハッシュも変更されます。なぜなら、データはハッシュ関数に対する入力値であるためです。ハッシュ値の変更は、ブロックが作成されてからデータが変更されたかどうかを確認してくれる「isChainValid」メソッドでも考慮されます。
Anna Coinを使ったブロックチェーンのテスト
以下は、annaCoinという名前のブロックチェーンオブジェクトを作成し、そこにブロックを追加するコードです。ブロックに改ざんを加えようとしたとします。改ざんする前と、私がブロックを改ざんしようとした後にブロックチェーンの有効性をチェックすることによって、annaCoinのセキュリティは証明されました。
この関数の出力は以下のとおりです。
注:テスト時にブロックチェーンをより読みやすくするために、ブロックチェーンとブロッククラスでいくつかのprint関数を作成しました。単純化するために、前記のコードスニペットにはprint関数を含めませんでした。
完全なスクリプトを見たい方は、こちらを参照してください:https://github.com/annamcabee/Block-Chain
CREDIT:原著者の許諾のもと翻訳・掲載しています。
[原文]Learning about Block Chain with Python (Posted Dec 16, 2017) by Anna McAbee