aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_basic/cryptonote_boost_serialization.h (unfollow)
AgeCommit message (Collapse)AuthorFilesLines
2022-04-18Add view tags to outputs to reduce wallet scanning timej-berman1-1/+12
Implements view tags as proposed by @UkoeHB in MRL issue https://github.com/monero-project/research-lab/issues/73 At tx construction, the sender adds a 1-byte view tag to each output. The view tag is derived from the sender-receiver shared secret. When scanning for outputs, the receiver can check the view tag for a match, in order to reduce scanning time. When the view tag does not match, the wallet avoids the more expensive EC operations when deriving the output public key using the shared secret.
2022-04-05plug bulletproofs plus into consensusmoneromooo-monero1-5/+27
2022-03-04Copyright: Update to 2022mj-xmr1-1/+1
2020-08-27Integrate CLSAGs into moneromoneromooo-monero1-5/+22
They are allowed from v12, and MLSAGs are rejected from v13.
2020-08-17replace most boost serialization with existing monero serializationmoneromooo-monero1-1/+0
This reduces the attack surface for data that can come from malicious sources (exported output and key images, multisig transactions...) since the monero serialization is already exposed to the outside, and the boost lib we were using had a few known crashers. For interoperability, a new load-deprecated-formats wallet setting is added (off by default). This allows loading boost format data if there is no alternative. It will likely go at some point, along with the ability to load those. Notably, the peer lists file still uses the boost serialization code, as the data it stores is define in epee, while the new serialization code is in monero, and migrating it was fairly hairy. Since this file is local and not obtained from anyone else, the marginal risk is minimal, but it could be migrated later if needed. Some tests and tools also do, this will stay as is for now.
2020-05-06Update copyright year to 2020SomaticFanatic1-1/+1
Update copyright year to 2020
2019-05-01fix wide difficulty conversion with some versions of boostmoneromooo-monero1-2/+2
2019-03-24Make difficulty 128 bit instead of 64 bitmoneromooo-monero1-0/+29
Based on Boolberry work by: jahrsg <jahr@jahr.me> cr.zoidberg <crypto.zoidberg@gmail.com>
2019-03-21wallet: fix offline signing calling a daemon RPCmoneromooo-monero1-0/+7
2019-03-05Update 2019 copyrightbinaryFate1-1/+1
2019-02-03ringct: fix v1 ecdhInfo serializationmoneromooo-monero1-15/+2
The change made for v2 broke v1, and we have no way to know which version we're serializing here. However, since we don't actually care about space savings in this case, we continue serialiazing both mask and amount.
2019-01-22ringct: remove unused senderPk from ecdhTuplemoneromooo-monero1-1/+0
This was an early ringct field, which was never used in production
2019-01-22ringct: the commitment mask is now deterministicmoneromooo-monero1-1/+4
saves space in the tx and is safe Found by knaccc
2019-01-22ringct: encode 8 byte amount, saving 24 bytes per outputmoneromooo-monero1-1/+11
Found by knaccc
2019-01-22add a bulletproof version, new bulletproof type, and rct configmoneromooo-monero1-3/+3
This makes it easier to modify the bulletproof format
2018-09-11Bulletproof aggregated verification and testsmoneromooo-monero1-3/+3
Also constrains bulletproofs to simple rct, for simplicity
2018-01-31ringct: pseudoOuts moved to prunable in the simple bulletproof casemoneromooo-monero1-2/+6
Saves 64 bytes non prunable data per typical tx This breaks v7 consensus, will require a testnet reorg from v6
2018-01-26Update 2018 copyrightxmr-eric1-1/+1
2017-12-17Add N/N multisig tx generation and signingmoneromooo-monero1-0/+15
Scheme by luigi1111: Multisig for RingCT on Monero 2 of 2 User A (coordinator): Spendkey b,B Viewkey a,A (shared) User B: Spendkey c,C Viewkey a,A (shared) Public Address: C+B, A Both have their own watch only wallet via C+B, a A will coordinate spending process (though B could easily as well, coordinator is more needed for more participants) A and B watch for incoming outputs B creates "half" key images for discovered output D: I2_D = (Hs(aR)+c) * Hp(D) B also creates 1.5 random keypairs (one scalar and 2 pubkeys; one on base G and one on base Hp(D)) for each output, storing the scalar(k) (linked to D), and sending the pubkeys with I2_D. A also creates "half" key images: I1_D = (Hs(aR)+b) * Hp(D) Then I_D = I1_D + I2_D Having I_D allows A to check spent status of course, but more importantly allows A to actually build a transaction prefix (and thus transaction). A builds the transaction until most of the way through MLSAG_Gen, adding the 2 pubkeys (per input) provided with I2_D to his own generated ones where they are needed (secret row L, R). At this point, A has a mostly completed transaction (but with an invalid/incomplete signature). A sends over the tx and includes r, which allows B (with the recipient's address) to verify the destination and amount (by reconstructing the stealth address and decoding ecdhInfo). B then finishes the signature by computing ss[secret_index][0] = ss[secret_index][0] + k - cc[secret_index]*c (secret indices need to be passed as well). B can then broadcast the tx, or send it back to A for broadcasting. Once B has completed the signing (and verified the tx to be valid), he can add the full I_D to his cache, allowing him to verify spent status as well. NOTE: A and B *must* present key A and B to each other with a valid signature proving they know a and b respectively. Otherwise, trickery like the following becomes possible: A creates viewkey a,A, spendkey b,B, and sends a,A,B to B. B creates a fake key C = zG - B. B sends C back to A. The combined spendkey C+B then equals zG, allowing B to spend funds at any time! The signature fixes this, because B does not know a c corresponding to C (and thus can't produce a signature). 2 of 3 User A (coordinator) Shared viewkey a,A "spendkey" j,J User B "spendkey" k,K User C "spendkey" m,M A collects K and M from B and C B collects J and M from A and C C collects J and K from A and B A computes N = nG, n = Hs(jK) A computes O = oG, o = Hs(jM) B anc C compute P = pG, p = Hs(kM) || Hs(mK) B and C can also compute N and O respectively if they wish to be able to coordinate Address: N+O+P, A The rest follows as above. The coordinator possesses 2 of 3 needed keys; he can get the other needed part of the signature/key images from either of the other two. Alternatively, if secure communication exists between parties: A gives j to B B gives k to C C gives m to A Address: J+K+M, A 3 of 3 Identical to 2 of 2, except the coordinator must collect the key images from both of the others. The transaction must also be passed an additional hop: A -> B -> C (or A -> C -> B), who can then broadcast it or send it back to A. N-1 of N Generally the same as 2 of 3, except participants need to be arranged in a ring to pass their keys around (using either the secure or insecure method). For example (ignoring viewkey so letters line up): [4 of 5] User: spendkey A: a B: b C: c D: d E: e a -> B, b -> C, c -> D, d -> E, e -> A Order of signing does not matter, it just must reach n-1 users. A "remaining keys" list must be passed around with the transaction so the signers know if they should use 1 or both keys. Collecting key image parts becomes a little messy, but basically every wallet sends over both of their parts with a tag for each. Thia way the coordinating wallet can keep track of which images have been added and which wallet they come from. Reasoning: 1. The key images must be added only once (coordinator will get key images for key a from both A and B, he must add only one to get the proper key actual key image) 2. The coordinator must keep track of which helper pubkeys came from which wallet (discussed in 2 of 2 section). The coordinator must choose only one set to use, then include his choice in the "remaining keys" list so the other wallets know which of their keys to use. You can generalize it further to N-2 of N or even M of N, but I'm not sure there's legitimate demand to justify the complexity. It might also be straightforward enough to support with minimal changes from N-1 format. You basically just give each user additional keys for each additional "-1" you desire. N-2 would be 3 keys per user, N-3 4 keys, etc. The process is somewhat cumbersome: To create a N/N multisig wallet: - each participant creates a normal wallet - each participant runs "prepare_multisig", and sends the resulting string to every other participant - each participant runs "make_multisig N A B C D...", with N being the threshold and A B C D... being the strings received from other participants (the threshold must currently equal N) As txes are received, participants' wallets will need to synchronize so that those new outputs may be spent: - each participant runs "export_multisig FILENAME", and sends the FILENAME file to every other participant - each participant runs "import_multisig A B C D...", with A B C D... being the filenames received from other participants Then, a transaction may be initiated: - one of the participants runs "transfer ADDRESS AMOUNT" - this partly signed transaction will be written to the "multisig_monero_tx" file - the initiator sends this file to another participant - that other participant runs "sign_multisig multisig_monero_tx" - the resulting transaction is written to the "multisig_monero_tx" file again - if the threshold was not reached, the file must be sent to another participant, until enough have signed - the last participant to sign runs "submit_multisig multisig_monero_tx" to relay the transaction to the Monero network
2017-12-08add bulletproofs from v7 on testnetmoneromooo-monero1-4/+4
2017-12-08integrate bulletproofs into moneromoneromooo-monero1-0/+21
2017-10-07Subaddresseskenshi841-0/+5
2017-02-21update copyright year, fix occasional lack of newline at line endRiccardo Spagni1-1/+1
2017-02-08extract some basic code from libcryptonote_core into libcryptonote_basickenshi841-0/+0
2017-01-22Remove boost/foreach.cpp includesMiguel Herranz1-1/+0
2016-12-20also use portable serializer for boost_serialization_helper.h and ↵kenshi841-1/+0
net_node.inl, completely adandon boost/archive/binary_oarchive.hpp
2016-12-16added experimental boost::archive::portable_binary_{i|o}archivekenshi841-2/+6
2016-12-04ringct: switch to Borromean signaturesShen Noether1-4/+4
2016-09-14rct: rework serialization to avoid storing vector sizesmoneromooo-monero1-2/+14
2016-08-28New "Halfway RingCT" outputs for coinbase transactionsmoneromooo-monero1-0/+4
When RingCT is enabled, outputs from coinbase transactions are created as a single output, and stored as RingCT output, with a fake mask. Their amount is not hidden on the blockchain itself, but they are then able to be used as fake inputs in a RingCT ring. Since the output amounts are hidden, their "dustiness" is not an obstacle anymore to mixing, and this makes the coinbase transactions a lot smaller, as well as helping the TXO set to grow more slowly. Also add a new "Null" type of rct signature, which decreases the size required when no signatures are to be stored, as in a coinbase tx.
2016-08-28rct: rework v2 txes into prunable and non prunable datamoneromooo-monero1-5/+18
Nothing is pruned, but this allows easier changes later.
2016-08-28rct: change the simple flag to a typemoneromooo-monero1-4/+6
for future expansion
2016-08-28rct: avoid the need for the last II elementShen Noether1-10/+3
This element is used in the generation of the MLSAG, but isn't needed in verification. Also misc changes in the cryptonote code to match, by mooo.
2016-08-28wallet: do not store signatures in the wallet cachemoneromooo-monero1-0/+10
Saves some substantial space. Also avoid calculating tx hashes we don't need.
2016-08-28rct: do not serialize senderPk - it is not used anymoremoneromooo-monero1-1/+1
2016-08-28rct: do not serialize public keys in outPkmoneromooo-monero1-1/+22
They can be reconstructed from vout
2016-08-28integrate simple rct apimoneromooo-monero1-14/+7
2016-08-28ringct: "simple" ringct variantShen Noether1-0/+13
Allows the fake outs to be in different positions for each ring. For rct inputs only.
2016-08-28ringct: do not serialize what can be reconstructedmoneromooo-monero1-4/+14
The mixRing (output keys and commitments) and II fields (key images) can be reconstructed from vin data. This saves some modest amount of space in the tx.
2016-08-28add rct to the protocolmoneromooo-monero1-1/+4
It is not yet constrained to a fork, so don't use on the real network or you'll be orphaned or rejected.
2016-08-28make rct tx serialization workmoneromooo-monero1-0/+56
It may be suboptimal, but it's a pain to have to rebuild everything when some of this changes. Also, no clue why there seems to be two different code paths for serializing a tx...
2015-12-31updated copyright yearRiccardo Spagni1-1/+1
2015-01-02year updated in licenseRiccardo Spagni1-1/+1
2014-07-23License updated to BSD 3-clausefluffypony1-3/+29
2014-03-03moved all stuff to githubAntonio Juarez1-0/+143