【図解あり】ブロックチェーン改ざん防止ロジック | Proof of Workを採用したパターンで解説

ブロックチェーンの技術は、その構造上改ざんに強い性質があり、スマートコントラクトや仮想通貨に活用されています。本記事では、Proof of Workを採用したブロックチェーンの改ざん防止ロジックについて解説します。ブロックチェーンのセキュリティーに興味のある方は、ぜひ参考にしてください。

## ブロックチェーンとは
ブロックチェーンは取引情報のデータベースです。複数の取引情報がブロックという単位でまとまっており、ブロックを連結させたチェーンを連想させることから、ブロックチェーンと呼ばれます。このチェーン構造によって、データの改ざんに強い特性を持ちます。データ改ざん防止のロジックについては、後述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163239/4f172f67-ff1a-6e7e-79b6-2943de2274a9.png)

## ブロックチェーンの実際のデータ
ブロックチェーンのデータの実態を確認して、よりイメージを詳細につかみましょう。ブロックチェーン技術を利用した仮想通貨の一例として、ビットコインが挙げられます。ビットコインの実際のデータは[Blockchain.com](https://www.blockchain.com/explorer?view=btc)に公開されています。ブロック一覧と取引データ一覧が表示されており、各リンクを踏むことで詳細情報を閲覧できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163239/9bae8377-df77-602c-9d97-2c61476915ea.png)
引用：https://www.blockchain.com/explorer?view=btc

取引データの詳細を閲覧すると、誰が誰に何ビットコイン送付したかを確認できます。「誰が」と「誰に」は、重複のない不規則な文字列で表現されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163239/23e0beea-9bda-89cd-d6b6-cfed658b3010.png)
引用：https://www.blockchain.com/explorer?view=btc

ブロックの詳細を閲覧すると、そのブロックにまとめられた取引データが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163239/a98b8398-091b-d2bb-f750-48e099a596a8.png)
引用：https://www.blockchain.com/explorer?view=btc

ブロックは取引データだけでなく、様々なパラメータも保持しています。後述するデータ改ざん防止ロジックでは、このうちHashとNonceというパラメータが関与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163239/27974395-b30e-8899-0fe6-ecde851a159e.png)
引用：https://www.blockchain.com/explorer?view=btc

## データ改ざん防止ロジック
ブロックチェーンには様々なデータ改ざん防止策がありますが、ここではProof of Workというアルゴリズムを採用したブロックチェーンを例として、代表的な改ざん防止ロジックを解説します。

### ブロックチェーンの前後関係
ブロックチェーンの各ブロックは、直前のブロック情報のhash値を保持しています。ビットコインの「Hash」パラメータに該当します。hash値とは、あるデータを一定のルールで不規則な文字列に変換した値のことです。直前のブロックのhash値を次のブロックが持つことによって、ブロックの並びに前後関係が生まれます。あるブロックの取引データを改ざんした場合、次のブロックのhash値と整合性が取れなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163239/47eb18e4-42f4-2ff8-6983-3399830e6c93.png)

バレずに改ざんするには、改ざんしたブロックに加え、それより後ろのブロックすべてのhash値を書き換える必要があります。しかし後述する「ブロック生成における制約」によって、すべて書き換えることも現実的に不可能な仕組みとなっています。

### ブロックのパラメータ間の制約
ブロックを生成する際、「Nonce」とよばれるパラメータも設定する必要があります。Nonceそのものは特別な意味をもちません。しかし、Transaction, Hash, Nonceの結合データのhash値がある制約を満たすというルール設定がなされています。

これは、hash値を書き換える場合、別のパラメータであるNonceの再設定も必要となることを意味します。詳細は後述しますが、Nonceの算出には多大な時間がかかります。したがって「後ろのブロックすべてのhash値を書き換える」ことは現実的に不可能となります。

#### Nonce算出の具体的なステップ
ブロック生成時のNonce算出の流れを知ることで、Nonce算出に多大な時間を要する理由を理解できます。ここでは、具体的なNonce算出ステップを解説します。

1. ブロックに格納しようとしているTransactionsとHashとNonce（この際、Nonce=0）の結合データのhash値を算出する。
1. hash値の頭X桁（この桁数はシステムによって異なる）が全て0ではない場合、次はNonce=1として、TransactionsとHashとNonceの結合データのhash値を算出する。
1. hash値の頭X桁が全て0ではない場合、次はNonce=2として、TransactionsとHashとNonceの結合データのhash値を算出する。
1. Nonceを1ずつ増やしながら、TransactionsとHashとNonceの結合データのhash値の頭X桁が全て0となるまで繰り返す。この時のNonceがブロックに格納される値となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163239/67f491a6-b78d-408b-c9af-8a2fbd9403d7.png)

hash値は、元のデータを逆算することが困難な数学的性質を持ちます。そのため、Nonceを少しずつ変えながらhash値の確認を繰り返す必要があります。このように意図的にブロックのパラメータ算出に時間がかかるような仕組みを「Proof of Work」と呼びます。

### ブロックチェーンの前後関係と制約の検証
ブロックチェーンは多くの場合、複数の組織や個人が同一のブロックチェーンのデータを保持しています。データ通信によってすべてのブロックチェーンが同期しています。この同期の際に、データが改ざんされていないことを検証しています。

具体的には、同期時に受け入れようとするブロックチェーンの全ブロックに対して、Hashはとなりのブロックのhash値と一致しているか、NonceはProof of Workを満たしているかを確認しています。ひとつでも満たされない場合、同期が拒否される仕組みになっています。

## まとめ
ブロックチェーンはブロック間の前後関係を持ち、またブロック生成における制約が存在します。これらの特徴を満たしているか検証することによって、データの改ざんを防止しています。本記事で解説した実際のデータや図解を参考に、ブロックチェーンのセキュリティー勉強に役立ててください。

「Pythonによるブロックチェーン開発教本」（私が制作したもの）はブロックチェーンをゼロからプログラミングする学習教材です。ブロックチェーン初学者向けに執筆されています。プログラミングを実際に行うことで、ブロックチェーンの仕組みをよりクリアに理解できるでしょう。興味のある方は、無料公開の部分からお試しください。

日本語版

https://www.amazon.co.jp/dp/B0B55XSBNZ

英語版

https://www.amazon.co.jp/dp/B0B7BLLDWQ