wallet2: fix bulletproof cold signing

Cold signing was always using Borromean range proofs, causing
a larger tx, and an incorrect fee
This commit is contained in:
moneromooo-monero 2018-06-07 12:28:23 +01:00
parent 8a7b3ff138
commit d7a6b72c15
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
2 changed files with 11 additions and 5 deletions

View File

@ -4788,11 +4788,10 @@ bool wallet2::sign_tx(unsigned_tx_set &exported_txs, const std::string &signed_f
LOG_PRINT_L1(" " << (n+1) << ": " << sd.sources.size() << " inputs, ring size " << sd.sources[0].outputs.size()); LOG_PRINT_L1(" " << (n+1) << ": " << sd.sources.size() << " inputs, ring size " << sd.sources[0].outputs.size());
signed_txes.ptx.push_back(pending_tx()); signed_txes.ptx.push_back(pending_tx());
tools::wallet2::pending_tx &ptx = signed_txes.ptx.back(); tools::wallet2::pending_tx &ptx = signed_txes.ptx.back();
bool bulletproof = sd.use_rct && !ptx.tx.rct_signatures.p.bulletproofs.empty();
crypto::secret_key tx_key; crypto::secret_key tx_key;
std::vector<crypto::secret_key> additional_tx_keys; std::vector<crypto::secret_key> additional_tx_keys;
rct::multisig_out msout; rct::multisig_out msout;
bool r = cryptonote::construct_tx_and_get_tx_key(m_account.get_keys(), m_subaddresses, sd.sources, sd.splitted_dsts, sd.change_dts.addr, sd.extra, ptx.tx, sd.unlock_time, tx_key, additional_tx_keys, sd.use_rct, bulletproof, m_multisig ? &msout : NULL); bool r = cryptonote::construct_tx_and_get_tx_key(m_account.get_keys(), m_subaddresses, sd.sources, sd.splitted_dsts, sd.change_dts.addr, sd.extra, ptx.tx, sd.unlock_time, tx_key, additional_tx_keys, sd.use_rct, sd.use_bulletproofs, m_multisig ? &msout : NULL);
THROW_WALLET_EXCEPTION_IF(!r, error::tx_not_constructed, sd.sources, sd.splitted_dsts, sd.unlock_time, m_nettype); THROW_WALLET_EXCEPTION_IF(!r, error::tx_not_constructed, sd.sources, sd.splitted_dsts, sd.unlock_time, m_nettype);
// we don't test tx size, because we don't know the current limit, due to not having a blockchain, // we don't test tx size, because we don't know the current limit, due to not having a blockchain,
// and it's a bit pointless to fail there anyway, since it'd be a (good) guess only. We sign anyway, // and it's a bit pointless to fail there anyway, since it'd be a (good) guess only. We sign anyway,
@ -5168,8 +5167,7 @@ bool wallet2::sign_multisig_tx(multisig_tx_set &exported_txs, std::vector<crypto
cryptonote::transaction tx; cryptonote::transaction tx;
rct::multisig_out msout = ptx.multisig_sigs.front().msout; rct::multisig_out msout = ptx.multisig_sigs.front().msout;
auto sources = sd.sources; auto sources = sd.sources;
const bool bulletproof = sd.use_rct && (ptx.tx.rct_signatures.type == rct::RCTTypeFullBulletproof || ptx.tx.rct_signatures.type == rct::RCTTypeSimpleBulletproof); bool r = cryptonote::construct_tx_with_tx_key(m_account.get_keys(), m_subaddresses, sources, sd.splitted_dsts, ptx.change_dts.addr, sd.extra, tx, sd.unlock_time, ptx.tx_key, ptx.additional_tx_keys, sd.use_rct, sd.use_bulletproofs, &msout, false);
bool r = cryptonote::construct_tx_with_tx_key(m_account.get_keys(), m_subaddresses, sources, sd.splitted_dsts, ptx.change_dts.addr, sd.extra, tx, sd.unlock_time, ptx.tx_key, ptx.additional_tx_keys, sd.use_rct, bulletproof, &msout, false);
THROW_WALLET_EXCEPTION_IF(!r, error::tx_not_constructed, sd.sources, sd.splitted_dsts, sd.unlock_time, m_nettype); THROW_WALLET_EXCEPTION_IF(!r, error::tx_not_constructed, sd.sources, sd.splitted_dsts, sd.unlock_time, m_nettype);
THROW_WALLET_EXCEPTION_IF(get_transaction_prefix_hash (tx) != get_transaction_prefix_hash(ptx.tx), THROW_WALLET_EXCEPTION_IF(get_transaction_prefix_hash (tx) != get_transaction_prefix_hash(ptx.tx),
@ -6472,6 +6470,7 @@ void wallet2::transfer_selected(const std::vector<cryptonote::tx_destination_ent
ptx.construction_data.extra = tx.extra; ptx.construction_data.extra = tx.extra;
ptx.construction_data.unlock_time = unlock_time; ptx.construction_data.unlock_time = unlock_time;
ptx.construction_data.use_rct = false; ptx.construction_data.use_rct = false;
ptx.construction_data.use_bulletproofs = false;
ptx.construction_data.dests = dsts; ptx.construction_data.dests = dsts;
// record which subaddress indices are being used as inputs // record which subaddress indices are being used as inputs
ptx.construction_data.subaddr_account = subaddr_account; ptx.construction_data.subaddr_account = subaddr_account;
@ -6727,6 +6726,7 @@ void wallet2::transfer_selected_rct(std::vector<cryptonote::tx_destination_entry
ptx.construction_data.extra = tx.extra; ptx.construction_data.extra = tx.extra;
ptx.construction_data.unlock_time = unlock_time; ptx.construction_data.unlock_time = unlock_time;
ptx.construction_data.use_rct = true; ptx.construction_data.use_rct = true;
ptx.construction_data.use_bulletproofs = !tx.rct_signatures.p.bulletproofs.empty();
ptx.construction_data.dests = dsts; ptx.construction_data.dests = dsts;
// record which subaddress indices are being used as inputs // record which subaddress indices are being used as inputs
ptx.construction_data.subaddr_account = subaddr_account; ptx.construction_data.subaddr_account = subaddr_account;

View File

@ -320,6 +320,7 @@ namespace tools
std::vector<uint8_t> extra; std::vector<uint8_t> extra;
uint64_t unlock_time; uint64_t unlock_time;
bool use_rct; bool use_rct;
bool use_bulletproofs;
std::vector<cryptonote::tx_destination_entry> dests; // original setup, does not include change std::vector<cryptonote::tx_destination_entry> dests; // original setup, does not include change
uint32_t subaddr_account; // subaddress account of your wallet to be used in this transfer uint32_t subaddr_account; // subaddress account of your wallet to be used in this transfer
std::set<uint32_t> subaddr_indices; // set of address indices used as inputs in this transfer std::set<uint32_t> subaddr_indices; // set of address indices used as inputs in this transfer
@ -332,6 +333,7 @@ namespace tools
FIELD(extra) FIELD(extra)
FIELD(unlock_time) FIELD(unlock_time)
FIELD(use_rct) FIELD(use_rct)
FIELD(use_bulletproofs)
FIELD(dests) FIELD(dests)
FIELD(subaddr_account) FIELD(subaddr_account)
FIELD(subaddr_indices) FIELD(subaddr_indices)
@ -1248,7 +1250,7 @@ BOOST_CLASS_VERSION(tools::wallet2::address_book_row, 17)
BOOST_CLASS_VERSION(tools::wallet2::reserve_proof_entry, 0) BOOST_CLASS_VERSION(tools::wallet2::reserve_proof_entry, 0)
BOOST_CLASS_VERSION(tools::wallet2::unsigned_tx_set, 0) BOOST_CLASS_VERSION(tools::wallet2::unsigned_tx_set, 0)
BOOST_CLASS_VERSION(tools::wallet2::signed_tx_set, 0) BOOST_CLASS_VERSION(tools::wallet2::signed_tx_set, 0)
BOOST_CLASS_VERSION(tools::wallet2::tx_construction_data, 2) BOOST_CLASS_VERSION(tools::wallet2::tx_construction_data, 3)
BOOST_CLASS_VERSION(tools::wallet2::pending_tx, 3) BOOST_CLASS_VERSION(tools::wallet2::pending_tx, 3)
BOOST_CLASS_VERSION(tools::wallet2::multisig_sig, 0) BOOST_CLASS_VERSION(tools::wallet2::multisig_sig, 0)
@ -1595,6 +1597,9 @@ namespace boost
if (ver < 2) if (ver < 2)
return; return;
a & x.selected_transfers; a & x.selected_transfers;
if (ver < 3)
return;
a & x.use_bulletproofs;
} }
template <class Archive> template <class Archive>
@ -1880,6 +1885,7 @@ namespace tools
ptx.construction_data.extra = tx.extra; ptx.construction_data.extra = tx.extra;
ptx.construction_data.unlock_time = unlock_time; ptx.construction_data.unlock_time = unlock_time;
ptx.construction_data.use_rct = false; ptx.construction_data.use_rct = false;
ptx.construction_data.use_bulletproofs = false;
ptx.construction_data.dests = dsts; ptx.construction_data.dests = dsts;
// record which subaddress indices are being used as inputs // record which subaddress indices are being used as inputs
ptx.construction_data.subaddr_account = subaddr_account; ptx.construction_data.subaddr_account = subaddr_account;