Other Heuristics

BlockSci supports various heuristics for matching transactions or blocks with certain unique properties. This module is a work in progress and will be cleaned up over time. This API should be considered totally unstable between versions.

blocksci.heuristics.address_deanon_txes(chain: blocksci.Blockchain, start: int, end: int) → List[blocksci.Tx]

Return a list of all the transactions in the blockchain for which is_address_deanon returns true

blocksci.heuristics.change_over_txes(chain: blocksci.Blockchain, start: int, end: int) → List[blocksci.Tx]

Return a list of transactions in the blockchain for which is_change_over returns true

blocksci.heuristics.coinjoin_txes(chain: blocksci.Blockchain, start: int, end: int) → List[blocksci.Tx]

Returns a list of all transactions in the blockchain that might be JoinMarket coinjoin transactions

blocksci.heuristics.fifo_tainted_outputs(output: blocksci.Output, tainted_value: int) → List[Tuple[blocksci.Output, int]]

Returns the list of current UTXOs FIFO tainted by this output

blocksci.heuristics.haircut_tainted_outputs(output: blocksci.Output, tainted_value: int) → List[Tuple[blocksci.Output, int]]

Returns the list of current UTXOs haircut tainted by this output

blocksci.heuristics.is_address_deanon(tx: blocksci.Tx) → bool

Returns true if this transaction’s change address is deanonymized by the address types involved

blocksci.heuristics.is_change_over(tx: blocksci.Tx) → bool

Returns true if this transaction contained all inputs of one address type and all outputs of a different type

blocksci.heuristics.is_coinjoin(tx: blocksci.Tx) → bool

Uses basic structural features to quickly decide whether this transaction might be a JoinMarket coinjoin transaction

blocksci.heuristics.is_definite_coinjoin(tx: blocksci.Tx, min_base_fee: int, percentage_fee: float, max_depth: int=0) → blocksci.heuristics.CoinJoinResult

This function uses subset matching in order to determine whether this transaction is a JoinMarket coinjoin. If maxDepth != 0, it limits the total number of possible subsets the algorithm will check.

blocksci.heuristics.is_keyset_change(tx: blocksci.Tx) → bool

Returns true if this transaction contains distinct addresses which share some of the same keys, indicating that the access control structure has changed

blocksci.heuristics.keyset_change_txes(chain: blocksci.Blockchain, start: int, end: int) → List[blocksci.Tx]

Return a list of transaction in the blockchain for which is_keyset_change returns true

blocksci.heuristics.poison_tainted_outputs(output: blocksci.Output, tainted_value: int) → List[Tuple[blocksci.Output, int]]

Returns the list of current UTXOs poison tainted by this output

blocksci.heuristics.possible_coinjoin_txes(chain: blocksci.Blockchain, min_base_fee: int, percentage_fee: float, max_depth: int=0) → Tuple[List[blocksci.Tx], List[blocksci.Tx]]

Returns a list of all transactions in the blockchain that might be coinjoin transactions