//tips
//ブロックチェーンアプリ作成
組成内容に深く突っ込むことなく、オリジナルの仮想通貨が簡単に作れてしまったので、ブロックチェーンアプリをunityで作成しながら仕組みを学んでいくことにする。
https://medium.com/coinmonks/unity-engine-metamask-wallet-6797d4699e45
https://github.com/Nethereum/Unity3dSimpleSampleNet461
Unityで新たなprojectを作成。
Infraで新規登録。
https://infura.io/dashboard
同じアカウントに送付しようとしたらTransfer transaction hashはきちんと出るもののether scanには取引履歴が表示されなかった。
Transfer transaction hash:0xe098faa8be2325fb76842233bf630d2aab82fe40aca6ba82370d23d6f127dff1
UnityEngine.Debug:Log(Object)
<TransferEther>d__15:MoveNext() (at Assets/Unity3dSimpleSampleNet461-master/Assets/EtherTransferCoroutinesUnityWebRequest.cs:72)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
https://etherscan.io/
別のデモアカウントも作成してそちらへの送付で試してみる。ropstenのネットワーク版のether scanを使用していなかったのが問題であったよう。
しっかりイーサリアムの送金をunityで実行できた。
https://ropsten.etherscan.io/
ここからはどのような仕組みで実行できているのかをスクリプトを通して確認していく。
まず、今回unityを通したイーサリアム送金システムの構築に登場した主体を確認し、それらが本来のブロックチェーンの動きのどの部分を担っているのかを読み解く部分から始めていく。
・UnityUI+script
・Metamask:個人のイーサリアムwallet
https://metamask.io/
・infura:unityからの取引指示はinfraを経由してmetamask間の取引が実行される
https://infura.io/dashboard
・ether scan:取引記録の監視とコントラクトの承認
https://etherscan.io/login
仮想通貨の流れはTCPの流れとかなり似ているように感じているので、そちらをどう似ているのかを明確にしていく。
ブロックチェーン:
ブロックと呼ばれるデータを連結したデータ群で樹形図のような構造になる。ここで取引情報の記録と決定を行う。
ブロックの中にはtransaction取引情報が格納されており、「誰から誰へいくら」という情報が含まれる。これはunityのUI/インスペクターで記入した内容に該当する。
ここではinfraの背後にあるイーサリアムのブロックチェーンに渡す用のtransactionデータをunityのスクリプトとして記載していそうなことがわかってくる。
また、transactionは一対一ではなく一対多数にも対応しており、そのまま一つのブロックに一対多への支払いを記録できる。
ブロックはその一対多数のtransactionをさらに複数格納することができる形をとっている。
マイニングする際にはブロックに含まれるtransactionの中身に自分への支払い組み込むことでマイニング報酬を確定する。
現在4年ごとにブロックを作成した報酬が半額となるよう取り決められている。
ハッシュ:
データの要約を作ることができる暗号技術
ether scanでコントラクト内容をハッシュ化して検査していた。
ブロックにはtransactionだけではなく直前のブロックの要約も含まれる。この要約をハッシュが担う。ハッシュは元データとは完全に異なる形を取るため、ハッシュから元のデータを知ることが難しく、データを少し変更するだけでもハッシュ値が大きく変わるため改竄も防ぐことができる。
ブロックに含まれる使い捨てで自由に設定できるノンスnonce(43億種類程度)が狙い通りのハッシュを作る鍵になりやすい。というのもtransaction部分は自由に変更できないため。
ハッシュの目標値は運営側から提示され、設定されるため、その目標値以下のハッシュに辿り着くまでに使用せざるを得ない時間がプルーフオブワークとなる。
ここからブロック生成者はtransactionを渡され、よーいどんでブロック生成競争を始め最初に目標ハッシュ値以下のハッシュを作れた生成者が競争に勝利し、無事にそのtransactionをかいたブロック生成者となれるという仕組みなのではないかと窺える。
ビットコインの場合は、3*10^22程度のハッシュ計算が必要な問題をtransactionから作り、マイニング参加者は秒間5*10^19程度の計算能力で対応しており、その結果10分前後で1ブロックが生成される流れとなっている。
プルーフオブワーク:
改竄を防ぐためブロックの生成にわざと時間をかけさせる仕組み。
ブロックチェーンの改ざんが難しいのは、改ざんしたブロックの後続に続く全てのブロックも改竄しなければならないこと、一つのブロックを改ざんするためにかかる時間が莫大であることがある。
もしマイナーにより同時にブロックが作成された場合は、ブロックの分岐が発生するが、その後に続くブロックの長い方がより労力をかけたので正しいとされ、分岐が修正される仕組みがある。
追加された新しいブロックはネットワークを使って全ての参加者に送信されるので、最長かどうかは判断がつくことになる。
この分岐により破棄されたブロックに含まれるマイニング報酬も破棄しなければならない。
電子署名:
電子媒体上での本人確認機能
コインを支払うためには、支払いを行う人がそのコインを使用する権利を持っているかを確認する必要がある。
これは署名と検証という手続きを持ち、
署名:サインする手続き
検証:サインが本人のものか検証する手続き
署名の部分では、秘密鍵を用いて、電子文書のハッシュを秘密鍵を用いて暗号化したものが電子署名となる。
検証では、署名者が発行している公開鍵を用いて電子署名を復号する。この復号によって得られたハッシュと実際の電子文書から作成したハッシュが一致していたら本人とみなされる。
なので正しい秘密鍵と公開鍵のペアを使用していないときちんと検証での最終ハッシュが復号できない。
公開鍵暗号方式:
通信の秘匿など電子署名を実現するための条件。
Metamaskで秘密鍵作成を行なった。
コインを誰かに支払うには、新しい所有者の情報と古い所有者が署名を行い、旧所有者の秘密鍵を用いて、電子署名を行う。この電子署名はtransactionに含まれる。この支払いが正当であるかどうかは誰でも調べられ、支払いコインには旧所有者の公開鍵がついており、transactionには電子署名がついているので、それらで身元を改められる。
万が一エラーが出た場合はそのtransactionは放置され、ブロックに永遠に組み込まれないことになる。
公開鍵は単にアドレスと呼ばれる数値で記載される。どちらの鍵も一回きりの使い捨てとなっている。
Peer to Peer:
個人間ネットワーク
ブロックチェーンの情報は参加者全員が保有している。新たにネットワークに参加した人はすでに持っている人に通信して、その参加者からコピーを送信してもらうことになる。
infuraにてmetamaskの個人wallet間で取引を可能にしている。