nervosnetwork / ckb-sdk-rust

Rust SDK for Nervos CKB
MIT License
20 stars 29 forks source link

[BUG Fix] Deadlock issue of InputIterator #113

Closed xcshuan closed 4 months ago

xcshuan commented 5 months ago
 loop {
    if let Some(lock_script) = self.lock_scripts.last() {
        let mut query = CellQueryOptions::new_lock(lock_script.clone());
        query.script_search_mode = Some(SearchMode::Exact);
        if let Some(type_script) = &self.type_script {
            query.secondary_script = Some(type_script.clone());
        } else {
            query.secondary_script_len_range = Some(ValueRangeOption::new_exact(0));
            query.data_len_range = Some(ValueRangeOption::new_exact(0));
        };
        let (live_cells, _capacity) =
            self.cell_collector.collect_live_cells(&query, true)?;
        if live_cells.is_empty() {
            self.lock_scripts.pop();
        } else {
            self.buffer_inputs = live_cells
                .into_iter()
                .rev() // reverse the iter, so that the first cell will be consumed while pop
                .map(|live_cell| TransactionInput::new(live_cell, 0))
                .collect();
            break;
        }
    }
}

When self.lock_scripts is empty, this loop will dead lock.