From 22a61ce1c25f4b77a29f64c8a00e9b67e7ec8aef Mon Sep 17 00:00:00 2001 From: Rabbit Date: Wed, 31 Jul 2024 08:56:29 +0800 Subject: [PATCH 1/2] chore: update bitcoin vout binding status (#2104) --- .../api/v2/bitcoin_vouts_controller.rb | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/v2/bitcoin_vouts_controller.rb b/app/controllers/api/v2/bitcoin_vouts_controller.rb index 7e4566b63..5bf271efd 100644 --- a/app/controllers/api/v2/bitcoin_vouts_controller.rb +++ b/app/controllers/api/v2/bitcoin_vouts_controller.rb @@ -16,19 +16,18 @@ def verify bitcoin_vouts = BitcoinVout.includes(:bitcoin_transaction). where(bitcoin_transactions: { txid: previous_vout["txid"] }, bitcoin_vouts: { index: previous_vout["index"], op_return: false }) - bitcoin_vouts.each do |vout| - next if vout.unbound? || vout.normal? - next unless vout.cell_output - status = - if vout.cell_output.dead? - "normal" - elsif vout.cell_output == cell_output - "binding" - else - "unbound" - end - vout.update(consumed_by:, status:) + related_cell_outputs = bitcoin_vouts.map(&:cell_output).compact + if related_cell_outputs.all?(&:live?) + bitcoin_vouts.update_all(status: "binding") + else + bitcoin_vouts.each do |vout| + next unless vout.cell_output + next if vout.normal? || vout.unbound? + + status = vout.cell_output.dead? ? "normal" : "unbound" + vout.update(consumed_by:, status:) + end end head :no_content From d532a81bf95c48950e4cb7fcba3cd2cccf5933d7 Mon Sep 17 00:00:00 2001 From: Rabbit Date: Thu, 1 Aug 2024 11:49:09 +0800 Subject: [PATCH 2/2] fix: force encode spore cluster data (#2108) --- app/utils/ckb_utils.rb | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/app/utils/ckb_utils.rb b/app/utils/ckb_utils.rb index 38c555b08..1bce9c67e 100644 --- a/app/utils/ckb_utils.rb +++ b/app/utils/ckb_utils.rb @@ -614,15 +614,27 @@ def self.hexes_to_bins_sql(hex_strings) end def self.parse_spore_cluster_data(hex_data) - data = hex_data.slice(2..-1) - name_offset = [data.slice(8, 8)].pack("H*").unpack1("l") * 2 - description_offset = [data.slice(16, 8)].pack("H*").unpack1("l") * 2 - name = [data.slice(name_offset + 8..description_offset - 1)].pack("H*") - description = [data.slice(description_offset + 8..-1)].pack("H*") - name = "#{name[0, 97]}..." if name.length > 100 - { name:, description: } - rescue StandardError => _e - { name: nil, description: nil } + safe_encode = Proc.new do |str| + str.force_encoding("UTF-8").encode("UTF-8", invalid: :replace, undef: :replace, replace: "") + rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError + "" + end + + begin + data = hex_data.slice(2..-1) + name_offset = [data.slice(8, 8)].pack("H*").unpack1("l") * 2 + description_offset = [data.slice(16, 8)].pack("H*").unpack1("l") * 2 + name = [data.slice(name_offset + 8..description_offset - 1)].pack("H*") + description = [data.slice(description_offset + 8..-1)].pack("H*") + name = "#{name[0, 97]}..." if name.length > 100 + name = safe_encode.call(name) + description = safe_encode.call(description) + + { name:, description: } + rescue StandardError => e + puts "Error parsing spore cluster data: #{e.message}" + { name: nil, description: nil } + end end def self.parse_spore_cell_data(hex_data)