class VChainClient::BlockchainConnection

Public Class Methods

new(config) click to toggle source
# File lib/vchain_client/blockchain_connection.rb, line 9
def initialize(config)
  @config = config

  @log = Log4r::Logger["vchain_client"]
end

Public Instance Methods

getTx(txid) click to toggle source
# File lib/vchain_client/blockchain_connection.rb, line 15
  def getTx(txid)

if @log.debug?
  @log.debug("[BlockchainConnection.getTx] input:")
  @log.debug("-> txid: #{txid}")
end

          adapters = []

if !@config.key?("blockchain_adapters")
  raise "There are no blockchain_adapters in config"
end

          config_adapters = @config["blockchain_adapters"]

if config_adapters.length <= 0
  raise "There are no blockchain_adapters in config"
end

          config_adapters.each { |adapter_config|

  begin
                   
    adapter = VChainClient::BlockchainAdapterFactory.getAdapter(adapter_config["type"], adapter_config, @config)

  rescue => e
    if @log.error?
      @log.error("[BlockchainConnection.getTx] BlockchainAdapterFactory.getAdapter raised exception:")
      @log.error("#{e.class}, #{e.message}")
      @log.error("-> txid: #{txid}")
      @log.error("--> type: "+ adapter_config["type"])
    end

    raise e
  end

                  if adapter != nil
                          
    adapters.push(adapter)

  else 
    if @log.error?
      @log.error("[BlockchainConnection.getTx] failed to init BlockchainAdapter")
      @log.error("-> txid: #{txid}")
      @log.error("--> type: "+ adapter_config["type"])
    end
                  end
          }

          if adapters.length > 0

  prev_size = nil
  prev_block_hash = nil
  prev_block_timestamp = nil
  prev_op_return = nil

  adapters.each { |adapter|

    tx = nil

    begin

                            tx = adapter.getTx(txid)

    rescue => e
      if @log.error?
        @log.error("[BlockchainConnection.getTx] adapter.getTx raised exception:")
        @log.error("#{e.class}, #{e.message}")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

      raise e
    end

                          if tx == nil
      if @log.error?
        @log.error("[BlockchainConnection.getTx] failed to get tx")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

                                  return nil
                          end

                          if !tx.key?("block_hash")
      if @log.error?
        @log.error("[BlockchainConnection.getTx] no 'block_hash' field")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

                                  return nil
                          end

                          if !tx.key?("block_timestamp")
      if @log.error?
        @log.error("[BlockchainConnection.getTx] no 'block_timestamp' field")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

                                  return nil
                          end

                          if tx["block_hash"] == nil || tx["block_hash"] == ""
      if @log.error?
        @log.error("[BlockchainConnection.getTx] 'block_hash' field is empty")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

                                  return nil
                          end

                            size = tx["size"]
                            block_hash = tx["block_hash"]
                            block_timestamp = tx["block_timestamp"]
                            op_return = tx["op_return"]

                            if prev_size != nil && prev_size != size
      if @log.error?
        @log.error("[BlockchainConnection.getTx] size mismatch")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

      return nil
                            end

    if prev_block_hash != nil && prev_block_hash != block_hash
      if @log.error?
        @log.error("[BlockchainConnection.getTx] block_hash mismatch")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

      return nil
    end

    if prev_block_timestamp != nil && prev_block_timestamp != block_timestamp
      if @log.error?
        @log.error("[BlockchainConnection.getTx] block_timestamp mismatch")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

      return nil
    end

    if prev_op_return != nil && prev_op_return != op_return
      if @log.error?
        @log.error("[BlockchainConnection.getTx] op_return mismatch")
        @log.error("-> txid: #{txid}")
        @log.error("--> txid: #{txid}")
        @log.error("--> adapter: "+ adapter.getName())
      end

      return nil
    end

    prev_size = size
    prev_block_hash = block_hash
    prev_block_timestamp = block_timestamp
    prev_op_return = op_return
                  }

  return {
    "block_hash"      => prev_block_hash,
    "block_timestamp" => prev_block_timestamp,
    "op_return"       => prev_op_return
                          }

else
  raise "There are no initialized blockchain_adapters"
          end

          return nil
  end