1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

5.ビットコインの所有権とプライバシーの問題 - 非対称暗号化アプリケーション

Last updated at Posted at 2019-03-14

この記事は
https://learnblockchain.cn
を元に編集したものです。
翻訳者のTwitter Account:taro03293

この章では、Bitcoinシステムが、Bitcoinの所有権をどのように保証しているかについて説明します。

##銀行システム
まず現在の銀行のシステムについて考えてみましょう。
銀行に口座を開設するには、自分の個人情報を銀行に提供する必要があります。
銀行に自分の口座ができたとき、その口座の所有権は個人情報を渡した“自分”にあります。
誰かにお金を支払うとき、銀行は我々のリクエストに応じて、自分の口座から対象の口座へお金を振り込みます。
あなたの個人情報は自分と銀行両方がそれぞれ管理しています。

##Bitcoinシステム
では、Bitcoinは、銀行が関与していない状態で、どのように口座(アカウント)の所有権を決め、そしてどのように個人情報を守るのでしょうか。
実は、Bitcoinのアカウントはaddressで表され、個人情報はネットワーク上には表示されません。
Bitcoinにおける取引、とはあるaddressから別のaddressにBitcoinを動かすことを指します。
Bitcoinシステムで記録される取引は次のようになります。

{
    "金額を支払うaddress ":"2A39CBa2390FDe"
    "金額を受け取るaddress ":"AAC9CBa239aFcc"
    "金額":"0.2btc"
}

BitcoinシステムでBitcoinを取引する場合、addressとそれにリンクするPrivate Key(パスワードのようなもの)が必要です。

addressとPrivate Keyは非対称の関係にあります。
Private Keyをシステム的に計算(2回Hash化します)すれば、そのKeyに紐づくaddressを得ることができます。
逆にaddressからPrivate Keyを求めることはできません。

コードで表すと下記のようになります。

address: 2A39CBa2390FDe
Private Key: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal

Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal)))  -> 2A39CBa2390FDe

銀行システムの場合は、口座情報とパスワードは完全に独立しています。
よって、銀行取引する場合、口座情報、パスワード両方を検証する必要があります。

先程の取引の場合、address(2A39CBa2390FDe)のPrivate Key(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal)を持つ人だけが、この支払いを実行できます。

{
    "金額を支払うaddress ":"2A39CBa2390FDe"
    "金額を受け取るaddress ":"AAC9CBa239aFcc"
    "金額":"0.2btc"
}

##取引記録にデジタル署名をするには
取引情報から要約情報を取得するためにハッシュ化を行い、次に要約情報をデジタル署名します。
プロセスは大体次のようになります。

1.取引情報をハッシュ化して、ハッシュ値を求める

hash('
    {"金額を支払うaddress":"2A39CBa2390FDe",
    "金額を受け取るaddress":"AAC9CBa239aFcc",
    "金額":"0.2btc"
    }') -> 8aDB23CDEA6

2.Private Keyを使ってハッシュ値にデジタル署名をする

#パラメーター1はハッシュ値
#パラメーター2はPrivate Key
#sign(パラメーター1,パラメーター2)でデジタル署名を返す
sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"

デジタル署名の後、支払いノードは隣のノードに
“Address:AAC9CBa239aFccに0.2btcを送り、デジタル署名は3cdferdadgadgです。”
という内容を隣のノードに送ります。
隣のノードは、上記内容を検証した後、その情報を隣のノードに送り、最終的にネットワーク全体に上記の情報が広まります。

ノードは第一のノードから情報を受け取ったあと、デジタル署名が支払いの時に使われたPrivate Keyから生まれたものかを検証します。
もし、検証が確認出た場合、取引が有効になり、相応する金額が別の口座に記録されます。
(実際には、支払い者の残高照会の検証がさらに必要ですが、ここでは省略します)
コードで表すと下記に様になります。

#パラメーター1はデジタル署名
#パラメーター2は支払い方のAddress
#verify()でハッシュ値を返す
verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"

もし検証結果verify()と元のハッシュ値が一致していれば取引が有効になり、相応する金額が別の口座に記録されます。

if(verify("3cdferdadgadg", "2A39CBa2390FDe")
    == hash('{"支払い方のAddress":"2A39CBa2390FDe",
              "受け取り方のAddress":"AAC9CBa239aFcc",
              "金額":"0.2btc"}')) :
    # 記帳する
    # 他のノードに伝える
else:
   # 検証結果が無効の場合、何もしない

ここまででPrivate KeyとAddressとデジタル署名の関係が分かったと思います。
さらに詳しく知りたい方はそれぞれの概念についてGoogleで調べてみてください。

続く

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?