mirror of
https://github.com/monero-project/monero.git
synced 2026-06-12 19:11:36 -07:00
wallet: remove output blackballing
This commit is contained in:
@@ -57,13 +57,6 @@ static int compare_hash32(const MDB_val *a, const MDB_val *b)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int compare_uint64(const MDB_val *a, const MDB_val *b)
|
||||
{
|
||||
const uint64_t va = *(const uint64_t*) a->mv_data;
|
||||
const uint64_t vb = *(const uint64_t*) b->mv_data;
|
||||
return va < vb ? -1 : va > vb;
|
||||
}
|
||||
|
||||
static std::string compress_ring(const std::vector<uint64_t> &ring, uint64_t tag)
|
||||
{
|
||||
std::string s;
|
||||
@@ -201,8 +194,6 @@ static size_t get_ring_data_size(size_t n_entries)
|
||||
return n_entries * (32 + 1024); // highball 1kB for the ring data to make sure
|
||||
}
|
||||
|
||||
enum { BLACKBALL_BLACKBALL, BLACKBALL_UNBLACKBALL, BLACKBALL_QUERY, BLACKBALL_CLEAR};
|
||||
|
||||
namespace tools
|
||||
{
|
||||
|
||||
@@ -234,10 +225,6 @@ ringdb::ringdb(std::string filename, const std::string &genesis):
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to open LMDB dbi: " + std::string(mdb_strerror(dbr)));
|
||||
mdb_set_compare(txn, dbi_rings, compare_hash32);
|
||||
|
||||
dbr = mdb_dbi_open(txn, ("blackballs2-" + genesis).c_str(), MDB_CREATE | MDB_INTEGERKEY | MDB_DUPSORT | MDB_DUPFIXED, &dbi_blackballs);
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to open LMDB dbi: " + std::string(mdb_strerror(dbr)));
|
||||
mdb_set_dupsort(txn, dbi_blackballs, compare_uint64);
|
||||
|
||||
dbr = mdb_txn_commit(txn);
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to commit txn creating/opening database: " + std::string(mdb_strerror(dbr)));
|
||||
tx_active = false;
|
||||
@@ -253,7 +240,6 @@ void ringdb::close()
|
||||
if (env)
|
||||
{
|
||||
mdb_dbi_close(env, dbi_rings);
|
||||
mdb_dbi_close(env, dbi_blackballs);
|
||||
mdb_env_close(env);
|
||||
env = NULL;
|
||||
}
|
||||
@@ -439,103 +425,4 @@ bool ringdb::set_ring(const crypto::chacha_key &chacha_key, const crypto::key_im
|
||||
return set_rings(chacha_key, rings, relative);
|
||||
}
|
||||
|
||||
bool ringdb::blackball_worker(const std::vector<std::pair<uint64_t, uint64_t>> &outputs, int op)
|
||||
{
|
||||
MDB_txn *txn;
|
||||
MDB_cursor *cursor;
|
||||
int dbr;
|
||||
bool tx_active = false;
|
||||
bool ret = true;
|
||||
|
||||
THROW_WALLET_EXCEPTION_IF(outputs.size() > 1 && op == BLACKBALL_QUERY, tools::error::wallet_internal_error, "Blackball query only makes sense for a single output");
|
||||
|
||||
dbr = resize_env(env, filename.c_str(), 32 * 2 * outputs.size()); // a pubkey, and some slack
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to set env map size: " + std::string(mdb_strerror(dbr)));
|
||||
dbr = mdb_txn_begin(env, NULL, 0, &txn);
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to create LMDB transaction: " + std::string(mdb_strerror(dbr)));
|
||||
epee::misc_utils::auto_scope_leave_caller txn_dtor = epee::misc_utils::create_scope_leave_handler([&](){if (tx_active) mdb_txn_abort(txn);});
|
||||
tx_active = true;
|
||||
|
||||
dbr = mdb_cursor_open(txn, dbi_blackballs, &cursor);
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to create cursor for blackballs table: " + std::string(mdb_strerror(dbr)));
|
||||
|
||||
MDB_val key, data;
|
||||
for (const std::pair<uint64_t, uint64_t> &output: outputs)
|
||||
{
|
||||
key.mv_data = (void*)&output.first;
|
||||
key.mv_size = sizeof(output.first);
|
||||
data.mv_data = (void*)&output.second;
|
||||
data.mv_size = sizeof(output.second);
|
||||
|
||||
switch (op)
|
||||
{
|
||||
case BLACKBALL_BLACKBALL:
|
||||
MDEBUG("Marking output " << output.first << "/" << output.second << " as spent");
|
||||
dbr = mdb_cursor_put(cursor, &key, &data, MDB_NODUPDATA);
|
||||
if (dbr == MDB_KEYEXIST)
|
||||
dbr = 0;
|
||||
break;
|
||||
case BLACKBALL_UNBLACKBALL:
|
||||
MDEBUG("Marking output " << output.first << "/" << output.second << " as unspent");
|
||||
dbr = mdb_cursor_get(cursor, &key, &data, MDB_GET_BOTH);
|
||||
if (dbr == 0)
|
||||
dbr = mdb_cursor_del(cursor, 0);
|
||||
break;
|
||||
case BLACKBALL_QUERY:
|
||||
dbr = mdb_cursor_get(cursor, &key, &data, MDB_GET_BOTH);
|
||||
THROW_WALLET_EXCEPTION_IF(dbr && dbr != MDB_NOTFOUND, tools::error::wallet_internal_error, "Failed to lookup in blackballs table: " + std::string(mdb_strerror(dbr)));
|
||||
ret = dbr != MDB_NOTFOUND;
|
||||
if (dbr == MDB_NOTFOUND)
|
||||
dbr = 0;
|
||||
break;
|
||||
case BLACKBALL_CLEAR:
|
||||
break;
|
||||
default:
|
||||
THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, "Invalid blackball op");
|
||||
}
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to query blackballs table: " + std::string(mdb_strerror(dbr)));
|
||||
}
|
||||
|
||||
mdb_cursor_close(cursor);
|
||||
|
||||
if (op == BLACKBALL_CLEAR)
|
||||
{
|
||||
dbr = mdb_drop(txn, dbi_blackballs, 0);
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to clear blackballs table: " + std::string(mdb_strerror(dbr)));
|
||||
}
|
||||
|
||||
dbr = mdb_txn_commit(txn);
|
||||
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to commit txn blackballing output to database: " + std::string(mdb_strerror(dbr)));
|
||||
tx_active = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool ringdb::blackball(const std::vector<std::pair<uint64_t, uint64_t>> &outputs)
|
||||
{
|
||||
return blackball_worker(outputs, BLACKBALL_BLACKBALL);
|
||||
}
|
||||
|
||||
bool ringdb::blackball(const std::pair<uint64_t, uint64_t> &output)
|
||||
{
|
||||
std::vector<std::pair<uint64_t, uint64_t>> outputs(1, output);
|
||||
return blackball_worker(outputs, BLACKBALL_BLACKBALL);
|
||||
}
|
||||
|
||||
bool ringdb::unblackball(const std::pair<uint64_t, uint64_t> &output)
|
||||
{
|
||||
std::vector<std::pair<uint64_t, uint64_t>> outputs(1, output);
|
||||
return blackball_worker(outputs, BLACKBALL_UNBLACKBALL);
|
||||
}
|
||||
|
||||
bool ringdb::blackballed(const std::pair<uint64_t, uint64_t> &output)
|
||||
{
|
||||
std::vector<std::pair<uint64_t, uint64_t>> outputs(1, output);
|
||||
return blackball_worker(outputs, BLACKBALL_QUERY);
|
||||
}
|
||||
|
||||
bool ringdb::clear_blackballs()
|
||||
{
|
||||
return blackball_worker(std::vector<std::pair<uint64_t, uint64_t>>(), BLACKBALL_CLEAR);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user