この記事は
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で調べてみてください。
続く