mirror of
https://codeberg.org/anoncontributorxmr/monero.git
synced 2024-11-12 22:23:28 +01:00
Merge pull request #5446
7d79222f
daemon: remove debug info (moneromooo-monero)8fec0f98
functional_tests: add sweep_single test (moneromooo-monero)9880d61b
wallet_rpc_server: remove unused code (moneromooo-monero)8a61b33d
rpc: omit irrelevant fields for pool txes in gettransactions (moneromooo-monero)56508524
rpc: add relayed in get_transaction output (moneromooo-monero)82e510f1
rpc: set default log category in core_rpc_server.h (moneromooo-monero)
This commit is contained in:
commit
f376cd5605
@ -2205,7 +2205,7 @@ bool t_rpc_command_executor::prune_blockchain()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tools::success_msg_writer() << "Blockchain pruned: seed " << epee::string_tools::to_string_hex(res.pruning_seed);
|
tools::success_msg_writer() << "Blockchain pruned";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -575,7 +575,7 @@ namespace cryptonote
|
|||||||
// try the pool for any missing txes
|
// try the pool for any missing txes
|
||||||
size_t found_in_pool = 0;
|
size_t found_in_pool = 0;
|
||||||
std::unordered_set<crypto::hash> pool_tx_hashes;
|
std::unordered_set<crypto::hash> pool_tx_hashes;
|
||||||
std::unordered_map<crypto::hash, bool> double_spend_seen;
|
std::unordered_map<crypto::hash, tx_info> per_tx_pool_tx_info;
|
||||||
if (!missed_txs.empty())
|
if (!missed_txs.empty())
|
||||||
{
|
{
|
||||||
std::vector<tx_info> pool_tx_info;
|
std::vector<tx_info> pool_tx_info;
|
||||||
@ -630,7 +630,7 @@ namespace cryptonote
|
|||||||
{
|
{
|
||||||
if (ti.id_hash == hash_string)
|
if (ti.id_hash == hash_string)
|
||||||
{
|
{
|
||||||
double_spend_seen.insert(std::make_pair(h, ti.double_spend_seen));
|
per_tx_pool_tx_info.insert(std::make_pair(h, ti));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -716,14 +716,17 @@ namespace cryptonote
|
|||||||
if (e.in_pool)
|
if (e.in_pool)
|
||||||
{
|
{
|
||||||
e.block_height = e.block_timestamp = std::numeric_limits<uint64_t>::max();
|
e.block_height = e.block_timestamp = std::numeric_limits<uint64_t>::max();
|
||||||
if (double_spend_seen.find(tx_hash) != double_spend_seen.end())
|
auto it = per_tx_pool_tx_info.find(tx_hash);
|
||||||
|
if (it != per_tx_pool_tx_info.end())
|
||||||
{
|
{
|
||||||
e.double_spend_seen = double_spend_seen[tx_hash];
|
e.double_spend_seen = it->second.double_spend_seen;
|
||||||
|
e.relayed = it->second.relayed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MERROR("Failed to determine double spend status for " << tx_hash);
|
MERROR("Failed to determine pool info for " << tx_hash);
|
||||||
e.double_spend_seen = false;
|
e.double_spend_seen = false;
|
||||||
|
e.relayed = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -731,6 +734,7 @@ namespace cryptonote
|
|||||||
e.block_height = m_core.get_blockchain_storage().get_db().get_tx_block_height(tx_hash);
|
e.block_height = m_core.get_blockchain_storage().get_db().get_tx_block_height(tx_hash);
|
||||||
e.block_timestamp = m_core.get_blockchain_storage().get_db().get_block_timestamp(e.block_height);
|
e.block_timestamp = m_core.get_blockchain_storage().get_db().get_block_timestamp(e.block_height);
|
||||||
e.double_spend_seen = false;
|
e.double_spend_seen = false;
|
||||||
|
e.relayed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill up old style responses too, in case an old wallet asks
|
// fill up old style responses too, in case an old wallet asks
|
||||||
|
@ -40,6 +40,9 @@
|
|||||||
#include "p2p/net_node.h"
|
#include "p2p/net_node.h"
|
||||||
#include "cryptonote_protocol/cryptonote_protocol_handler.h"
|
#include "cryptonote_protocol/cryptonote_protocol_handler.h"
|
||||||
|
|
||||||
|
#undef MONERO_DEFAULT_LOG_CATEGORY
|
||||||
|
#define MONERO_DEFAULT_LOG_CATEGORY "daemon.rpc"
|
||||||
|
|
||||||
// yes, epee doesn't properly use its full namespace when calling its
|
// yes, epee doesn't properly use its full namespace when calling its
|
||||||
// functions from macros. *sigh*
|
// functions from macros. *sigh*
|
||||||
using namespace epee;
|
using namespace epee;
|
||||||
|
@ -364,6 +364,7 @@ namespace cryptonote
|
|||||||
uint64_t block_height;
|
uint64_t block_height;
|
||||||
uint64_t block_timestamp;
|
uint64_t block_timestamp;
|
||||||
std::vector<uint64_t> output_indices;
|
std::vector<uint64_t> output_indices;
|
||||||
|
bool relayed;
|
||||||
|
|
||||||
BEGIN_KV_SERIALIZE_MAP()
|
BEGIN_KV_SERIALIZE_MAP()
|
||||||
KV_SERIALIZE(tx_hash)
|
KV_SERIALIZE(tx_hash)
|
||||||
@ -374,9 +375,16 @@ namespace cryptonote
|
|||||||
KV_SERIALIZE(as_json)
|
KV_SERIALIZE(as_json)
|
||||||
KV_SERIALIZE(in_pool)
|
KV_SERIALIZE(in_pool)
|
||||||
KV_SERIALIZE(double_spend_seen)
|
KV_SERIALIZE(double_spend_seen)
|
||||||
KV_SERIALIZE(block_height)
|
if (!this_ref.in_pool)
|
||||||
KV_SERIALIZE(block_timestamp)
|
{
|
||||||
KV_SERIALIZE(output_indices)
|
KV_SERIALIZE(block_height)
|
||||||
|
KV_SERIALIZE(block_timestamp)
|
||||||
|
KV_SERIALIZE(output_indices)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KV_SERIALIZE(relayed)
|
||||||
|
}
|
||||||
END_KV_SERIALIZE_MAP()
|
END_KV_SERIALIZE_MAP()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1842,11 +1842,7 @@ namespace tools
|
|||||||
{
|
{
|
||||||
if (req.account_index != td.m_subaddr_index.major || (!req.subaddr_indices.empty() && req.subaddr_indices.count(td.m_subaddr_index.minor) == 0))
|
if (req.account_index != td.m_subaddr_index.major || (!req.subaddr_indices.empty() && req.subaddr_indices.count(td.m_subaddr_index.minor) == 0))
|
||||||
continue;
|
continue;
|
||||||
if (!transfers_found)
|
transfers_found = true;
|
||||||
{
|
|
||||||
transfers_found = true;
|
|
||||||
}
|
|
||||||
auto txBlob = t_serializable_object_to_blob(td.m_tx);
|
|
||||||
wallet_rpc::transfer_details rpc_transfers;
|
wallet_rpc::transfer_details rpc_transfers;
|
||||||
rpc_transfers.amount = td.amount();
|
rpc_transfers.amount = td.amount();
|
||||||
rpc_transfers.spent = td.m_spent;
|
rpc_transfers.spent = td.m_spent;
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
import json
|
||||||
|
|
||||||
"""Test simple transfers
|
"""Test simple transfers
|
||||||
"""
|
"""
|
||||||
@ -43,6 +44,7 @@ class TransferTest():
|
|||||||
self.transfer()
|
self.transfer()
|
||||||
self.check_get_bulk_payments()
|
self.check_get_bulk_payments()
|
||||||
self.check_double_spend_detection()
|
self.check_double_spend_detection()
|
||||||
|
self.sweep_single()
|
||||||
|
|
||||||
def create(self):
|
def create(self):
|
||||||
print 'Creating wallets'
|
print 'Creating wallets'
|
||||||
@ -569,6 +571,54 @@ class TransferTest():
|
|||||||
assert tx.in_pool
|
assert tx.in_pool
|
||||||
assert tx.double_spend_seen
|
assert tx.double_spend_seen
|
||||||
|
|
||||||
|
def sweep_single(self):
|
||||||
|
daemon = Daemon()
|
||||||
|
|
||||||
|
print("Sending single output")
|
||||||
|
|
||||||
|
daemon.generateblocks('42ey1afDFnn4886T7196doS9GPMzexD9gXpsZJDwVjeRVdFCSoHnv7KPbBeGpzJBzHRCAs9UxqeoyFQMYbqSWYTfJJQAWDm', 1)
|
||||||
|
self.wallet[0].refresh()
|
||||||
|
res = self.wallet[0].incoming_transfers(transfer_type = 'available')
|
||||||
|
for t in res.transfers:
|
||||||
|
assert not t.spent
|
||||||
|
assert len(res.transfers) > 8 # we mined a lot
|
||||||
|
index = 8
|
||||||
|
assert not res.transfers[index].spent
|
||||||
|
assert res.transfers[index].amount > 0
|
||||||
|
ki = res.transfers[index].key_image
|
||||||
|
amount = res.transfers[index].amount
|
||||||
|
daemon.generateblocks('42ey1afDFnn4886T7196doS9GPMzexD9gXpsZJDwVjeRVdFCSoHnv7KPbBeGpzJBzHRCAs9UxqeoyFQMYbqSWYTfJJQAWDm', 10) # ensure unlocked
|
||||||
|
self.wallet[0].refresh()
|
||||||
|
res = self.wallet[0].get_balance()
|
||||||
|
balance = res.balance
|
||||||
|
res = self.wallet[0].incoming_transfers(transfer_type = 'all')
|
||||||
|
res = self.wallet[0].sweep_single('44Kbx4sJ7JDRDV5aAhLJzQCjDz2ViLRduE3ijDZu3osWKBjMGkV1XPk4pfDUMqt1Aiezvephdqm6YD19GKFD9ZcXVUTp6BW', key_image = ki)
|
||||||
|
assert len(res.tx_hash) == 64
|
||||||
|
tx_hash = res.tx_hash
|
||||||
|
daemon.generateblocks('44Kbx4sJ7JDRDV5aAhLJzQCjDz2ViLRduE3ijDZu3osWKBjMGkV1XPk4pfDUMqt1Aiezvephdqm6YD19GKFD9ZcXVUTp6BW', 1)
|
||||||
|
self.wallet[0].refresh()
|
||||||
|
res = self.wallet[0].get_balance()
|
||||||
|
new_balance = res.balance
|
||||||
|
res = daemon.get_transactions([tx_hash], decode_as_json = True)
|
||||||
|
assert len(res.txs) == 1
|
||||||
|
tx = res.txs[0]
|
||||||
|
assert tx.tx_hash == tx_hash
|
||||||
|
assert not tx.in_pool
|
||||||
|
assert len(tx.as_json) > 0
|
||||||
|
try:
|
||||||
|
j = json.loads(tx.as_json)
|
||||||
|
except:
|
||||||
|
j = None
|
||||||
|
assert j
|
||||||
|
assert new_balance == balance - amount
|
||||||
|
assert len(j['vin']) == 1
|
||||||
|
assert j['vin'][0]['key']['k_image'] == ki
|
||||||
|
self.wallet[0].refresh()
|
||||||
|
res = self.wallet[0].incoming_transfers(transfer_type = 'available')
|
||||||
|
assert len([t for t in res.transfers if t.key_image == ki]) == 0
|
||||||
|
res = self.wallet[0].incoming_transfers(transfer_type = 'unavailable')
|
||||||
|
assert len([t for t in res.transfers if t.key_image == ki]) == 1
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
TransferTest().run_test()
|
TransferTest().run_test()
|
||||||
|
@ -184,6 +184,27 @@ class Wallet(object):
|
|||||||
}
|
}
|
||||||
return self.rpc.send_json_rpc_request(sweep_all)
|
return self.rpc.send_json_rpc_request(sweep_all)
|
||||||
|
|
||||||
|
def sweep_single(self, address = '', priority = 0, ring_size = 0, outputs = 1, unlock_time = 0, payment_id = '', get_tx_keys = False, key_image = "", do_not_relay = False, get_tx_hex = False, get_tx_metadata = False):
|
||||||
|
sweep_single = {
|
||||||
|
'method': 'sweep_single',
|
||||||
|
'params' : {
|
||||||
|
'address' : address,
|
||||||
|
'priority' : priority,
|
||||||
|
'ring_size' : ring_size,
|
||||||
|
'outputs' : outputs,
|
||||||
|
'unlock_time' : unlock_time,
|
||||||
|
'payment_id' : payment_id,
|
||||||
|
'get_tx_keys' : get_tx_keys,
|
||||||
|
'key_image' : key_image,
|
||||||
|
'do_not_relay' : do_not_relay,
|
||||||
|
'get_tx_hex' : get_tx_hex,
|
||||||
|
'get_tx_metadata' : get_tx_metadata,
|
||||||
|
},
|
||||||
|
'jsonrpc': '2.0',
|
||||||
|
'id': '0'
|
||||||
|
}
|
||||||
|
return self.rpc.send_json_rpc_request(sweep_single)
|
||||||
|
|
||||||
def get_address(self, account_index = 0, subaddresses = []):
|
def get_address(self, account_index = 0, subaddresses = []):
|
||||||
get_address = {
|
get_address = {
|
||||||
'method': 'get_address',
|
'method': 'get_address',
|
||||||
|
Loading…
Reference in New Issue
Block a user