ブロックチェーンの基本的な処理を理解する Part1

カテゴリ:IT

コメント(0) / この記事のURL

ビットコインのソースはGitHubで公開されていますが、
結構膨大でとっかかりなしに読んでいくのは難しそうです…。
いろいろ探していると、ブロックチェーンの作り方を親切に解説してくれている以下の記事を見つけたので、
処理の流れを理解するところから始めようと思います。
自分もこんな風に人に参考にしてもらえる記事を書きたいもんですね。

ブロックチェーンを作ることで学ぶ ~ブロックチェーンがどのように動いているのか学ぶ最速の方法は作ってみることだ~

記事ではPythonで紹介されているようなので、
C#で書き直してみようと思ったら、GitHubに既にC#のコードが上がっていました。

以下のサイトからZIPファイルをダウンロードして、CSharpディレクトリをVisual Studioで起動します。
dvf/blockchain

最低限の機能のため、プログラムもシンプルです。
プロジェクトに含まれる主要なファイルは以下の5つ。

・BlockChain.cs … ブロックチェーン本体
・Block.cs … マイニングした際にブロックチェーンに追加するブロック
・Node.cs … ブロックチェーンを共有する利用者のIPアドレス
・Transaction.cs … 取引履歴
・WebServer.cs … ブロックチェーンにアクセスするための簡易Webサーバ

プログラム起動時、ブロックチェーン(BlockChain.cs)を作成します。
この時、最初の1個のブロック(ジェネシスブロック)を自動的に生成します。



ブロックは連番、生成日時、取引履歴、Proof、1つ前のブロックのハッシュを持ちます。
最初の1個のブロックの場合は、取引はまだないため取引履歴は空、Proofと1つ前のブロックのハッシュも固定値です。
Proofは前回紹介した、マイニングの処理によって求めた1つ前のブロックの計算結果を格納するものになります。



public class Block
{
public int Index { get; set; } // 連番
public DateTime Timestamp { get; set; } // 生成日時
public List<Transaction> Transactions { get; set; } // 取引履歴
public int Proof { get; set; } // Proof
public string PreviousHash { get; set; } // 1つ前のブロックのハッシュ

public override string ToString()
{
return $"{Index} [{Timestamp.ToString("yyyy-MM-dd HH:mm:ss")}] Proof: {Proof} | PrevHash: {PreviousHash} | Trx: {Transactions.Count}";
}
}

作成されたブロックチェーンに対しての処理は、すべて簡易Webサーバーを通じて行います。
本プログラムで、簡易Webサーバーに用意されているコマンドは以下の5つ。



// マイニングする
//GET: http://localhost:12345/mine

// 取引履歴を追加する
//POST: http://localhost:12345/transactions/new

// 現在のブロックチェーン全体を表示する
//GET: http://localhost:12345/chain

// 新しいノードを追加する(ブロックチェーンを検証する利用者として参加する)
//POST: http://localhost:12345/nodes/register

// ブロックチェーン検証処理
// 登録されているノードのうち、一番長いブロックチェーンがあれば自身のチェーンを置き換える
//GET: http://localhost:12345/nodes/resolve

ブロックチェーンは取引を行うための仕組みなので、
transactions/newを実行して、以下の取引履歴(Transactions.cs)を追加します。
取引履歴には、取引金額と、送金先、送金元が含まれます。



public class Transaction
{
public int Amount { get; set; } // 取引金額
public string Recipient { get; set; } // 送金先
public string Sender { get; set; } // 送金元
}

取引履歴を複数回登録すると、以下のようなイメージになります。




これらの取引を承認するため、次にmineを実行して、マイニングを行います。
Dさんがマイニングを行い、一番早くプルーフオブワークの計算の答えを見つけたとすると、以下のようになります。




Dさんがマイニングに成功した時、計算結果(Proof)と前回のブロックのハッシュ(あるデータをハッシュ関数という計算式に通した時に得られる値)を持つ新しいブロックが作られます。
ブロックのTransactionsには、前回のブロック生成からこれまでの間に追加された取引履歴が追加されます。
また、この時マイニングに成功したDさんへの報酬も、取引履歴に追加されます。


※次回に続く


■ 関連記事 ---------------------------
2018/3/1 ビットコインを学ぶ


コメント(0) / この記事のURL