@@ -10,10 +10,8 @@ def perform
1010 cell_deps_attrs = Set . new
1111 contract_roles = Hash . new { |hash , key | hash [ key ] = { } }
1212
13- # 加载未分析的依赖数据
1413 dependencies = load_unanalyzed_dependencies
1514
16- # 按事务分组并逐组处理
1715 dependencies . each do |ckb_transaction_id , cell_deps |
1816 ckb_transaction = CkbTransaction . find ( ckb_transaction_id )
1917 lock_scripts , type_scripts = analyze_scripts ( ckb_transaction )
@@ -29,61 +27,62 @@ def perform
2927 )
3028 end
3129
32- # 持久化数据
3330 save_cell_deps_out_points ( cell_deps_out_points_attrs )
3431 save_contracts ( contract_attrs , contract_roles )
3532 save_cell_dependencies ( cell_deps_attrs )
3633 end
3734
3835 private
3936
40- # 加载未分析的依赖数据
4137 def load_unanalyzed_dependencies
4238 CellDependency . where ( contract_analyzed : false ) .
4339 where . not ( block_number : nil ) .
4440 limit ( 200 ) .
4541 group_by ( &:ckb_transaction_id )
4642 end
4743
48- # 分析脚本
4944 def analyze_scripts ( ckb_transaction )
5045 lock_scripts = { }
5146 type_scripts = { }
5247
5348 cell_outputs = ckb_transaction . cell_outputs . includes ( :type_script ) . to_a
5449 cell_inputs = ckb_transaction . cell_inputs . includes ( :previous_cell_output ) . map ( &:previous_cell_output )
5550
56- ( cell_inputs + cell_outputs ) . each do |cell |
51+ cell_inputs . each do |cell |
5752 lock_scripts [ cell . lock_script . code_hash ] = cell . lock_script . hash_type
5853 if cell . type_script
5954 type_scripts [ cell . type_script . code_hash ] = cell . type_script . hash_type
6055 end
6156 end
57+ cell_outputs . each do |cell |
58+ if cell . type_script
59+ type_scripts [ cell . type_script . code_hash ] = cell . type_script . hash_type
60+ end
61+ end
6262
6363 [ lock_scripts , type_scripts ]
6464 end
6565
66- # 处理每个依赖
6766 def process_cell_dependencies ( cell_deps , lock_scripts , type_scripts , out_points_attrs , contract_attrs , cell_deps_attrs , contract_roles )
6867 cell_deps . each do |cell_dep |
68+ is_used =
69+ case cell_dep . dep_type
70+ when "code"
71+ process_code_dep ( cell_dep , lock_scripts , type_scripts , out_points_attrs , contract_attrs , contract_roles )
72+ when "dep_group"
73+ process_dep_group ( cell_dep , lock_scripts , type_scripts , out_points_attrs , contract_attrs , contract_roles )
74+ end
75+
6976 cell_deps_attrs << {
7077 contract_analyzed : true ,
78+ is_used :,
7179 ckb_transaction_id : cell_dep . ckb_transaction_id ,
7280 contract_cell_id : cell_dep . contract_cell_id ,
7381 dep_type : cell_dep . dep_type ,
7482 }
75- next if Contract . joins ( :cell_deps_out_points ) . where ( cell_deps_out_points : { contract_cell_id : cell_dep . contract_cell_id } ) . exists?
76-
77- case cell_dep . dep_type
78- when "code"
79- process_code_dep ( cell_dep , lock_scripts , type_scripts , out_points_attrs , contract_attrs , contract_roles )
80- when "dep_group"
81- process_dep_group ( cell_dep , lock_scripts , type_scripts , out_points_attrs , contract_attrs , contract_roles )
82- end
8383 end
8484 end
8585
86- # 处理 "code" 类型依赖
8786 def process_code_dep ( cell_dep , lock_scripts , type_scripts , out_points_attrs , contract_attrs , contract_roles )
8887 cell_output = cell_dep . cell_output
8988 out_points_attrs << {
@@ -96,15 +95,18 @@ def process_code_dep(cell_dep, lock_scripts, type_scripts, out_points_attrs, con
9695 update_contract_roles ( cell_output , lock_scripts , type_scripts , contract_roles )
9796
9897 if contract_roles [ cell_output . id ] [ :is_lock_script ] || contract_roles [ cell_output . id ] [ :is_type_script ]
99- contract_attrs << build_contract_attr ( cell_output , lock_scripts , type_scripts )
98+ contract_attrs << build_contract_attr ( cell_output )
99+ true
100+ else
101+ false
100102 end
101103 end
102104
103- # 处理 "dep_group" 类型依赖
104105 def process_dep_group ( cell_dep , lock_scripts , type_scripts , out_points_attrs , contract_attrs , contract_roles )
105106 mid_cell = cell_dep . cell_output
106107 binary_data = mid_cell . binary_data
107108 out_points_count = binary_data [ 0 , 4 ] . unpack1 ( "L<" )
109+ is_used = false
108110
109111 0 . upto ( out_points_count - 1 ) do |i |
110112 part_tx_hash , cell_index = binary_data [ 4 + i * 36 , 36 ] . unpack ( "H64L<" )
@@ -121,12 +123,13 @@ def process_dep_group(cell_dep, lock_scripts, type_scripts, out_points_attrs, co
121123 update_contract_roles ( cell_output , lock_scripts , type_scripts , contract_roles )
122124
123125 if contract_roles [ cell_output . id ] [ :is_lock_script ] || contract_roles [ cell_output . id ] [ :is_type_script ]
124- contract_attrs << build_contract_attr ( cell_output , lock_scripts , type_scripts )
126+ contract_attrs << build_contract_attr ( cell_output )
127+ is_used = is_used || true
125128 end
126129 end
130+ is_used
127131 end
128132
129- # 更新 contract_roles
130133 def update_contract_roles ( cell_output , lock_scripts , type_scripts , contract_roles )
131134 is_lock_script = ( lock_scripts [ cell_output . data_hash ] || lock_scripts [ cell_output . type_script &.script_hash ] ) . present?
132135 is_type_script = ( type_scripts [ cell_output . data_hash ] || type_scripts [ cell_output . type_script &.script_hash ] ) . present?
@@ -137,8 +140,7 @@ def update_contract_roles(cell_output, lock_scripts, type_scripts, contract_role
137140 contract_roles [ cell_output . id ] [ :hash_type ] ||= data_type
138141 end
139142
140- # 构建单个合约属性
141- def build_contract_attr ( cell_output , _lock_scripts , _type_scripts )
143+ def build_contract_attr ( cell_output )
142144 {
143145 type_hash : cell_output . type_script &.script_hash ,
144146 data_hash : cell_output . data_hash ,
@@ -147,7 +149,6 @@ def build_contract_attr(cell_output, _lock_scripts, _type_scripts)
147149 }
148150 end
149151
150- # 保存数据
151152 def save_cell_deps_out_points ( attrs )
152153 CellDepsOutPoint . upsert_all ( attrs . to_a , unique_by : %i[ contract_cell_id deployed_cell_output_id ] ) if attrs . any?
153154 end
@@ -160,6 +161,6 @@ def save_contracts(attrs, roles)
160161 end
161162
162163 def save_cell_dependencies ( attrs )
163- CellDependency . upsert_all ( attrs . to_a , unique_by : %i[ ckb_transaction_id contract_cell_id dep_type ] , update_only : : contract_analyzed) if attrs . any?
164+ CellDependency . upsert_all ( attrs . to_a , unique_by : %i[ ckb_transaction_id contract_cell_id dep_type ] , update_only : %i[ contract_analyzed is_used ] ) if attrs . any?
164165 end
165166end
0 commit comments