👤あらまし
今回は先に自分が高校2年生のときに作成いたしました、ブロックチェーンにつきまして、技術的な解説を行いたいと思います。本プログラムのリポジトリはこちらになります。
尚、時折リファクタリングも進めておりましたが、コードは4年以上前に書き始めたものですので、多少複雑な実装になっている場合があります。
📄見出し
- アドレスの生成
- 台帳管理
- 二重支払い防止
- PoW
- DNS seed(p2pの仕組み)
🪪アドレスの生成
今回のプロジェクトでのアドレスの生成は、まず秘密鍵より、secp256k1という暗号カーブを使用し、公開鍵が算出されますそちらをbase64エンコードし、x,yの2点をセパレータ文字(§)でくっつけることで生成しています。ex.
diDlHSAnRbhW0W/ZgaxIy3NMZotIfmvprv9knHdaYt0=§QLfieDPDeAJ8jUs3y02CrdtDd2AnSXqONb9HQiEskbQ=
現在開発を進めている後継プロジェクトでは、ロックアンロックスクリプトの導入によりこのアドレスの大幅な省略を検討しています。
📒台帳管理
今回のプロジェクトでの大まかな台帳管理について解説していきます。本プロジェクトでは台帳管理のアルゴリズムに、アカウント型の台帳管理を用いています。UTXO型より、単純な実装になっております。
具体的には、先程生成したアドレスのセパレータ前の文字列をキーとし、残額を記録するようになっています。
⚠二重支払い防止
今回のブロックチェーン取引に関わらず、バッチ処理的なプロセスが含まれていると発生する危険性がある二重支払いを本プログラムでは同ブロック内で一時的に計算中のブロックごとに仮想的なアカウント台帳を作成し、受け取った取引のコストと比較し、残額が足りているのかチェックを行うように致しました。そのため、受け取った順にトランザクションプールに追加されていき、残額が足りなくなる取引が送られてきた場合はそのトランザクションを破棄するようになっています。
💣PoW
今回のプロジェクトではマイニングアルゴリズムには単純かつ、マイニングに参加するハードルが低いPOWを使用しています。一時cudaによる高速化を考え、設計も行いましたが、sha256の計算部分のアルゴリズムを書くのに時間がかかり、途中で断念しました。
一応検討してみた設計としては、ノードから、認証済みの取引リストを取得し、それをcudaスレッド分コピーしたベクトルを作成し、専用メモリにおいて、ここからcudaスレッドでnonceを各担当区域の取引のnonce部分に差し込み、sha256を計算。
それぞれ、引数で渡されたdifficultyと比較を行い、もしマイニングに成功していればインデックスを、そうでなければ-1を変数に入れ、
そして、ホストメモリにその値とベクトルをコピーし、判定を行うというものです。
🌐DNS Seed(p2pの仕組み)
一般的なブロックチェーンの根幹を担うp2pネットワークについて調べる際、疑問となる部分が、ネットワークへの参加方法だと思います。私も、今回のブロックチェーンを作り始めるまで疑問に思っており、想像しにくいものでした。
p2pでは中央となるサーバーがないのにどうやって参加するのか?と作成前は思っておりました。
ブロックチェーンを作る上でのベストプラクティスとしては、おそらく、掲示板などでそれぞれのノードがそれぞれのアドレスを公開することで、接続先が単一障害点となることを防げますが、ビットコインと本ブロックチェーンではデフォルトではDNS seedを使用しています。
具体的には、DNSシードのドメインを取得し(もしくは取得済みのドメインのサブドメインを使う)、そのAレコードに信頼できるノードのIPアドレスのリストを登録します。
そしてノードはノード自身にハードコードされたDNSシードのドメインからAレコードを問い合わせ、そこからいくつかを選び、接続します。
DNSもDNSのキャッシュサーバなどで分散されているので単一障害点が発生しないようになっています。
🙂終わりに
今回は就職活動を始めるに当たり、私が高校2年生で作成いたしましたブロックチェーン を用いた仮想通貨の技術的解説を行いました。現在取り組んでいる後継プロジェクトでは、よりモダンなjson-RPCやwebAPIなどをその他のブロックチェーンとの連携に使えるPoAの企業ユース向けのブロックチェーンを作成しています。