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