getblocksの挙動を引き続き追う

技術メモ

さぁー、今日も元気に bcwallet.rb の 同期問題いくぞー。

以下ソースをみると最後のブロック同期のときも対応している風に見える。
# new keys are added since the last synchronization
っていう部分

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

class Blockchain
  def initialize(keys, data_file_name)
    @data_file_name = data_file_name

    keys_hash = Key.hash256(keys.collect { |key, _| key }.sort.join)

    init_data(keys_hash)
    load_data

    # new keys are added since the last synchronization
    init_data(keys_hash) if @data[:keys_hash] != keys_hash
  end

じゃぁ、このinitializeで渡されているkeysはというと・・・

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

class Network
  attr_reader :status, :data

  # 
  # keys = { name => ECDSA key objects }
  #
  def initialize(keys, data_file_name)
    @message = Message.new

    @keys = keys

    @blockchain = Blockchain.new(@keys, data_file_name)

Networkを作るときに渡されて

class BCWallet
  :
  :
  def init_network
    @network = Network.new(@keys, @data_file_name)
  end
  :
  :
  def balance
    $stderr.print "loading data ...r"

    init_network
    wait_for_sync

    if confirm_send(name, to, amount)
 :
 :

balanceコマンドを受信したときに同期(init_work)が開始される・・・と。
ん、、、keys渡していないな。
ほかのinit_networkの箇所でも1度もkeys渡していない。

一応ソースで記載はあるけど、実際対応されていない??

んー、keysに注目するのやめるか。。。今はまだよくわからん。

last_hashが更新される箇所で、ログ出しておいて

  def dispatch_merkleblock(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] }
      p @last_hash   ★★★★★★★★★★★★★★★ ここ!!!!
      sleep 1
    end
     :

一度プログラムを動かす。そうすると、last_hashログが取れる。
その後、再度プログラムを動かす場合のlast_hashをいじるため以下のように修正。

  def calc_last_hash
    # These hashes are genesis blocks' ones.
    # last_hash = { timestamp: 0,
    #               hash: [IS_TESTNET ?
    #                 '000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943' :
    #                 '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f'].pack('H*').reverse }
    last_hash = { timestamp: 1296689281, hash: 'xA6+xC0xC0x8AxFCx1Dx12xE6xC6xA7xEBJFLx84x81x90xACx0EDx12=_xA6:x9ExE2x00x00x00x00'}

これで、試してみたら

2017-05-27 12:28:49 getblocks 1 to end limit 500 from peer=147

から

2017-05-27 12:28:49 getblocks 1 to 4341785c3039785c3138785c3438785c4c464a4245785c3741785c3643785c36 limit 500 from peer=147

に変わったが、なんで 1 to の箇所の 1 が変わらず、end が 434・・・に変わってしまったのかよくわからず。

いやー、、、もう時間かかるけど bitcoind のソースをステップデバッグできる環境を構築して、bitcoind, wallet同時にデバッグするか。
拉致があかない。
勉強にもなるし、次回からbitcoindのデバッグ環境を整えることにまず専念しよう。

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

コメントを残す

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

CAPTCHA


仮想通貨全般
TendermintをDocker使って起動してみる

以前、勉強会に行ってきた際にTendermintの事を聞いて ブロックチェーンプロトコルが実装できる …

仮想通貨全般
Bitcoinのdifficultyを決めるnBitsを理解する

マイニングする際の理解を深めようと思い、マイニング難易度(difficulty)を決めるnBitsに …

仮想通貨全般
EOS Night Meetupにいってきた

今回は、以前からEOSに興味があったので EOS Night Meetupにいってきました。 暗号通 …