bcwallet.rb でブロック同期をファイルに保存している仕組み

技術メモ

bcwallet.rbではブロックチェーンの同期でファイル保存している箇所は詳しく見ていく。

ブロック同期を保存している実装

@data という ruby オブジェクトを @data_file_name ファイルに Marshal.dump を使って保存している。

class Blockchain
 :
 :
  def save_data
    open(@data_file_name, 'wb') do |file|
      Marshal.dump @data, file
    end
  end

@data はというと

  def init_data(keys_hash)
    @data = { blocks: {}, txs: {}, last_height: 0, keys_hash: keys_hash }
  end

こんな感じ。blocksだったりhashだったりここに保存されている。
そして、実際にblocksを保存しているのは、

https://github.com/peryaudo/bcwallet/blob/master/bcwallet.rb#L1164

  def dispatch_merkleblock(message)
    @received_data += 1

    @blockchain.blocks[message[:hash]] = message

    # Described in Blockchain#is_young_block.
    # It supposes that blocks are sent in its height order. Don't try this in production code.
    unless @blockchain.is_young_block(message[:hash])
      @last_hash = { timestamp: message[:timestamp], hash: message[:hash] }
    end

    @requested_data  @blockchain.last_height
      @blockchain.save_data
      return true
    end

2. send_transaction

transactionをこちらから投げる場合。最初のブロック同期時にはsend_transactionは投げなさそう。
transactionを作成していないのと、getdataコマンド受信していない限り

https://github.com/peryaudo/bcwallet/blob/master/bcwallet.rb#L1094

  def send_transaction
    @message.write(@socket, @created_transaction)

    @socket.flush

    sleep 30

    @blockchain.txs[@created_transaction[:hash]] = @created_transaction

    @blockchain.save_data
  end

3. dispatch_version 時にファイル保存

handshake の最初にversion情報をなげるが、その際にファイル保存。
https://github.com/peryaudo/bcwallet/blob/master/bcwallet.rb#L1128

  def dispatch_version(message)
# This is handshake process:

# Local -- version -> Remote
# Local Remote
# Local

Sponsored Link

ビットコイン(Bitcoin)、イーサリアム(Ethereum)、リップル(Ripple)、ネム(NEM)などの仮想通貨を買うならコインチェックがおすすめです。

※アプリは指値売買ができず手数料が高いので、アプリをダウンロードするのではなくメール&パスワード登録へ!まずは5万円ほど入金して仮想通貨とブロックチェーンの世界を楽しんでください!

ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


miningpoolhub
miningpoolhubのAPIを使って自動スイッチングを試してみる in ethOS

* アイキャッチの男性は、Flicker上のライセンスフリーの画像ひっぱってきているだけで、本文とま …

NEM
[memo] NEMを送金しようとするとFAILURE_TIMESTAMP_TOO_FAR_IN_FUTUREが出る

Docker上のコンテナで、NEM-libraryを使ってmosaicの送金を試していたところ FA …

NEM
NEMのテストネットワークで独自通貨を試す

NEMアプリケーションを作る際にテストネットワークでのテスト非常に重要になってきます。 このため今回 …