Bitcoin full node and query server

Apr 20, 2024

View in context in the libbitcoin Slack #general mirror.

evoskuil17:21
The bip30 check is is now a bit simplified and verified across the chain. No material cost to it even when implemented for all blocks.
error::error_t CLASS::unspent_duplicates(const tx_link& link,
    const context& ctx) const NOEXCEPT
{
    if (!ctx.is_enabled(system::chain::flags::bip30_rule))
        return error::success;

    const auto coinbases = to_strongs(get_tx_key(link));
    if (coinbases.empty())
        return error::integrity;

    if (is_one(coinbases.size()))
        return error::success;

    // bip30: all (but self) must be confirmed spent or dup invalid (cb only).
    size_t unspent{};
    for (const auto& cb: coinbases)
        for (index out{}; out < output_count(cb.tx); ++out)
            if (!spent_prevout(cb.tx, out) && is_one(unspent++))
                return error::unspent_coinbase_collision;

    return is_zero(unspent) ? error::integrity : error::success;
}
(edited)