1.ブロックチェーンとは
Web3.0では中央のサービス提供事業者を介在することなく、利用者間で情報を発信と閲覧が可能となる情報分散型の仕組みが使われるが、ブロックチェーンは分散型管理技術として使われ、中央で情報を管理しなくても情報の改ざんなどが困難な仕組みが可能になる。
2.ブロックチェーンの事例
仮想通貨の他、現在、ブロックチェーンを活用したサービス例として下記のものがある。
(1)NFTマーケットプレイスのOpenSea(オープンシー)
NFT(Non-Fungible-Token:非代替性トークン)とは、アート作品や音楽作品、イラストなどあらゆるデジタルデータに、暗号資産に用いられるブロックチェーンを組み合わせることで作品としての唯一性を持たせる技術であり、これらを使ったオンラインマーケットプレイスである。
3.ブロックチェーンの仕組み
(1)背景
ブロックチェーンはWeb3.0の分散型管理の基本的な技術となっており、サービス提供者の存在を前提としないインターネット上で取引などの情報を安全に扱うために、なりすましや改ざんをどう防ぐか、二重支払いをどう防ぐかという問題に対処している。
ブロックチェーンは、P2Pネットワーク、ハッシュ、電子署名、コンセンサスアルゴリズムの4つの技術を応用することで上記の問題の解決を図ってい
(2)ブロックチェーンのメリットとデメリット
・メリット
分散型のためシステムダウンせず、改ざんが非常に困難な仕組みを持っている。
取引記録の書き換えや消去ができないため、公的な記録を残したい場合には最適。
・デメリット
一度記録した個人情報は二度と削除できなくなってしまうだけでなく、暗号化された状態ではあるもののネットワーク上の全ての参加者に情報が行き渡ってしまう。
合意形成に時間がかかる。
ブロックチェーンの利用が進むに従い取引履歴として保持するデータ量が増え通信量が増える。
(3)ブロックチェーンの種類
ブロックチェーンには誰でも参加できるか否かによって、パブリックチェーン、プライベートチェーンの2種類がある。
・パブリックチェーンはオープンで誰でも参加できるブロックチェーンで不正を働く者や正常に動作しない者も含まれる前提でシステムを運用する必要がある。そのためにはProof of Workのようなコンセンサスアルゴリズムを必要とし、合意形成に数十分の時間がかかる。
・プライベートチェーンでは参加のために管理者の承認を必要とすることで悪意を持つ参加者が含まれるリスクを抑えやすいことから、厳格なコンセンサスアルゴリズムがなくとも機能する。
(参考)
・【保存版】超わかりやすいブロックチェーンの基礎知識https://www.softbank.jp/biz/blog/business/articles/201804/blockchain-basic/
4.ブロックチェーンに関するキーワード
(1)分散ハッシュテーブル
分散ハッシュテーブル( Distributed Hash Table, DHT)とは、ハッシュテーブルを複数のピアで管理する技術のこと。2001年に発表されたCAN、Chord、Pastry、Tapestryが代表的なアルゴリズムとして挙げられる。アドレスとコンテンツのハッシュ値を空間に写像し、その空間を複数のピアで分割管理することで、特定ピアに負荷が集中することなく大規模なコンテンツ探索を実現するオーバーレイ・ネットワーク。(参考:wikipedia)
(2)オーバーレイ・ネットワーク
オーバーレイ・ネットワーク (overlay network) は、あるコンピュータネットワークの上に構築された別のコンピュータネットワークで、オーバーレイ・ネットワーク上のノードは下位ネットワークのトポロジーを意識せずに通信することができる。P2Pソフトウェアはオーバレイ・ネットワークを利用したもので、エンドホストにオーバレイプロトコルソフトウェアを搭載している。(参考:wikipedia)
(3)ハッシュテーブル
ハッシュテーブル ( hash table) は、キーと値の組(エントリと呼ぶ)を複数個格納し、キーに対応する値をすばやく参照するためのデータ構造でハッシュ表ともいう。(参考:wikipedia)
(4)ハッシュ
ハッシュ関数(hash function) (要約関数ともいう)は、任意のデータから、別の値を得るための関数のこと。ハッシュ関数から得られた値のことを要約値やハッシュ値またはハッシュという。ハッシュ関数の入力をキー (key)と呼び、得られるハッシュ値は、2つ以上のキーから同じ値が得られることがあり、これを衝突という。
ハッシュ関数は用途によって、MD5(Message Digest Algorythm 5)、SHA-2(Secure Hash Algorighm2、シャーツー)、SHA-3(Secure Hash Algorighm3、シャースリー)などがある。
SHA-2は、SHA-256(ハッシュ値:256bit)、SHA-512(ハッシュ値:512bit)などのバリエーションを総称したもの。
(5)コンセンサスアルゴリズム
コンセンサスアルゴリズムはデータの真正性を担保するルールで、多くの利用者が持っているデータが正しいものかどうかを証明し担保する方法として、取引データを格納するブロックを「誰が作るか」を定義し、そのルールにもとづいて作られた1つのブロックを「正しいブロック」として認める、というルールのタイプを表すのがコンセンサスアルゴリズムです。
主なコンセンサスアルゴリズムとして、PoW(プルーフ・オブ・ワーク)、PoS(プルーフ・オブ・ステーク、PoI(プルーフ・オブ・インポータンス)などがある。
・PoW(プルーフ・オブ・ワーク)
ブロックを生成するの1つの「ナンス値」を探して膨大な試行錯誤を繰り返し、世界中のマイナー(採掘者)たちの競争で最も早く正解であるナンス値を見つけた人がブロック生成の権利を得るコンセンサスアルゴリム。
・PoS(プルーフ・オブ・ステーク)
誰がブロックを生成するかはランダムに決定されるが通貨の保有量が多いほどブロックを生成できる確率が高まるコンセンサスアルゴリム。
・PoI(プルーフ・オブ・インポータンス)
通貨の保有量が勘案されるPoSの発展型ともいえる方式で保有量に加えて取引回数や取引量など、いくつかの指標を設けてその通貨に対する保有者の「重要度」をスコアリングしてブロック生成者を決める方式。
5.ブロックチェーンプログラム
(1)実行環境
・バーチャルボックスcentos8
# cat /etc/redhat-release
CentOS Linux release 8.4.2105
・pyhton3のインストール
# dnf -y install python36
# pip3 –version
pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)
・pipenv.のインストール
# pip3 install pipenv
# pipenv install
# pip install Flask==0.12.2 requests==2.18.4
(2)ブロックチェーン
ブロックチェーンのイメージを理解するため、ブロックのデータ(前回のハッシュ値を含む)からハッシュ値を求めて、前回のブロックに追加するイメージをプログラムで表現する。
ブロックチェーンのイメージ図
block_sample1.py
import hashlib, json
import datetime
class Block:
def __init__(self, index, timestamp, prev_hash, data):
self.index = index #ブロック番号
self.timestamp = timestamp #日付を記録
self.prev_hash = prev_hash #一つ前のブロックのハッシュ値
self.data = data #データ
self.now_hash = self.calc_hash() #ハッシュ値の計算
def calc_hash(self): #ハッシュ値の計算
#now_hash(今回のブロック)を除いたデータをjsonに変換しsha256でハッシュ化
block_data = {
'index' : self.index,
'timestamp' : self.timestamp,
'prev_hash' : self.prev_hash,
'data' : self.data
}
json_text = json.dumps(block_data, sort_keys=True)
return hashlib.sha256(json_text.encode('ascii')).hexdigest()
#ブロックの生成とブロックを繋げていくイメージ
block_chain = []
#最初のブロック
st_block = Block(0, str(datetime.datetime.now()), '-', "初回のデータ")
block_chain.append(st_block)
#最初のブロックから追加していく
for i in range(5):
new_block = Block(i+1, str(datetime.datetime.now()), block_chain[i].now_hash, "データ"+str(i+1))
block_chain.append(new_block)
#ブロックチェーンのデータを表示
#ブロック番号、ハッシュ値、前回のブロックのハッシュ値、ブロックデータ
for block in block_chain:
print("index:",block.index,"\n","now_hash:",block.now_hash,"\n","prev_hash:",block.prev_hash,"\n","data:",block.data,"\n")
# python3 block_sample1.py
The end