bool leveldb_chain_keeper::remove_address(leveldb::WriteBatch& batch, const script& output_script, const output_point& outpoint) { payment_address address; if (!extract(address, output_script)) return false; data_chunk raw_address = create_address_key(address); BITCOIN_ASSERT(!raw_address.empty()); data_chunk outpoint_value = create_spent_key(outpoint); bool is_found = false; leveldb_iterator it(address_iterator(db_.addr, raw_address)); for (; valid_address_iterator(it, raw_address); it->Next()) { if (slice_to_output_point(it->value()) != outpoint) continue; // We found the address entry we were looking for. BITCOIN_ASSERT(!is_found); is_found = true; // Put changes into batch finally. batch.Delete(it->key()); break; } BITCOIN_ASSERT(it->status().ok()); if (!is_found) return false; return true; }
bool remove_credit(leveldb::WriteBatch& batch, const transaction_output_type& output, const output_point& outpoint) { payment_address address; // Not a Bitcoin address so skip this output. if (!extract(address, output.script)) return true; data_chunk addr_key = create_address_key(address, outpoint); batch.Delete(slice(addr_key)); return true; }
bool bdb_common::add_address(txn_guard_ptr txn, const script& output_script, const message::output_point& outpoint) { data_chunk raw_address = create_address_key(output_script); if (raw_address.empty()) return true; readable_data_type address_key, output_value; address_key.set(raw_address); output_value.set(create_spent_key(outpoint)); if (db_address_->put(txn->get(), address_key.get(), output_value.get(), 0) != 0) return false; return true; }
bool add_credit(leveldb::WriteBatch& batch, const payment_address& address, uint64_t output_value, const output_point& outpoint, uint32_t block_height) { data_chunk addr_key = create_address_key(address, outpoint); // outpoint, value, block_height data_chunk row_info(36 + 8 + 4); auto serial = make_serializer(row_info.begin()); // outpoint serial.write_hash(outpoint.hash); serial.write_4_bytes(outpoint.index); // value serial.write_8_bytes(output_value); // block_height serial.write_4_bytes(block_height); BITCOIN_ASSERT( std::distance(row_info.begin(), serial.iterator()) == 36 + 8 + 4); batch.Put(slice(addr_key), slice(row_info)); return true; }
bool add_debit(leveldb::WriteBatch& batch, const transaction_input_type& input, const input_point& inpoint, uint32_t block_height) { payment_address address; // Not a Bitcoin address so skip this output. if (!extract(address, input.script)) return true; data_chunk addr_key = create_address_key(address, input.previous_output); // inpoint data_chunk row_info(36 + 4); auto serial = make_serializer(row_info.begin()); // inpoint serial.write_hash(inpoint.hash); serial.write_4_bytes(inpoint.index); // block_height serial.write_4_bytes(block_height); BITCOIN_ASSERT( std::distance(row_info.begin(), serial.iterator()) == 36 + 4); batch.Put(slice(addr_key), slice(row_info)); return true; }