1. TOPTOP
  2. Webサービス

ビットコインを支える技術 「ブロックチェーンの仕組み(分散型台帳技術)」について ~「アフター・ビットコイン: 仮想通貨とブロックチェーンの次なる覇者」より

|

blockchain_after_bitcoin_1

ブロックチェーンの仕組みとは、正当な取引者が次の受取人にコインを渡したいときに、それまでの取引データを使って次の正当な取引データを承認するという仕組みのことを指します。

聞きなれない言葉で頭の中が混乱するかもしれませんが、「ブロックチェーン」という言葉のうち「ブロック」の中身が分かると、「ブロックチェーンの仕組み」が理解できるようになります。

「ブロック」の中身

blockchain_after_bitcoin_1_1

ブロックは主に取引データ・ハッシュ値・ナンス値の3つで構成されています。他にもタイムスタンプなども含まれていますが、理解しやすいように他は割愛します。ビットコインでは10分間につき1つのブロックが作成されます

取引データとは

取引データとは取引履歴のことであり、「トランザクション」とも言われます。送金人や送金額の過去データが含まれています。ブロックに含まれている「取引データ」が真正なものあることを証するために、公開鍵と電子署名の技術が使われています。ご興味のあるかたははこちらの記事(新しいタブで開く)を参考にしてください。

ハッシュ値とは

ハッシュ値とは、ハッシュ関数によって求められた数値で、元になるデータから一定の計算方法によって求められる規則性のない固定長の値で表されます。ハッシュ関数と固定長の値について順を追って説明していきましょう。

通常の関数

例えば任意の2つの文字列を足し合わせる性質を持った”cat”という関数があったとしましょう。

cat("kobe-", "city") → "kobe-city"
cat("Osaka-", "prefecture") → "Osaka-prefecture"

通常の関数では、cat関数のように関数の性質と出力値を見れば、どんな値が引数として入力されているか予測することが可能です。

ハッシュ関数

ところがハッシュ関数を使うと、何か規則性のあるような引数を用いても少しでも違う文字があると、予想不可能な値が返されてきます。イメージ的にはこんな感じです。

hash("Osaka") → "adhasidaslfu9374534ugfosfuoa"
hash("Esaka")→ "dasduaifuncskdfaslkjdfa34329"

ハッシュ関数においては、cat関数のように出力した値から入力値を求めることは、とてつもないほどの労力がかる計算量を必要とします。

固定長の値

固定長の値とは、文字列の長さがどのように異なっていても、常に一定の長さの文字列にするという意味です。例では2つの引数の文字列の数は異なりますが、同じ14桁の文字列が返っています。イメージ的にはこんな感じです。

hash("Osaka-prefecture") → "12daoucnalssaa"
hash("Osaka-city") → "vsdfysodfasf99"

ちなみにビットコインでは”SHA2-256″というアルゴリズムが用いられていて、入力値がどのようなサイズ(1KB・1MB・1GBなど)でも常に16進数表記の64桁の数値になると決められています。

異なるデータを16進数表記の64桁の数値に収めると、偶然にも同じ数値が返されることも起こり得ます。ただその可能性はゼロに等しいと考えて良いでしょう。

ナンス値とは

ナンス値とは”Number used once = Nonce“のことで、一度限りで使い捨てる数字のことを表します。

新しいブロックを作るときにマイナーは直前のブロックに記録されているハッシュ値から、「ある一定条件」に基づいた数値を求めなければなりません。「ある一定条件」とは、次のブロックのハッシュ値の先頭に「一定以上のゼロ」が続けらるようにすることを指します。この一定条件を満たすために必要な数値がナンス値です。

ビットコインのマイニング(採掘)とは具体的には、このナンス値を求めることを指します。新しいブロックのナンス値を求めるためには膨大な計算量が必要で、その報酬としてマイナーにビットコインが与えられます。

ブロックチェーンの仕組み

blockchain_after_bitcoin_2

ブロックチェーンとはブロックが鎖状につながれていくことですが、もちろん物理的につながれているというわけではありません。時間の経過にしたがってブロックが作成され、ナンス値という数字でつながれていく様子があたかも鎖状のように表現されるため「ブロックチェーン」と呼称されています。