serai/coins/monero/wallet/polyseed/src/lib.rs

477 lines
14 KiB
Rust
Raw Normal View History

Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![doc = include_str!("../README.md")]
#![deny(missing_docs)]
#![cfg_attr(not(feature = "std"), no_std)]
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
use core::fmt;
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
use std_shims::{sync::OnceLock, string::String, collections::HashMap};
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
#[cfg(feature = "std")]
use std::time::{SystemTime, UNIX_EPOCH};
use subtle::ConstantTimeEq;
use zeroize::{Zeroize, Zeroizing, ZeroizeOnDrop};
use rand_core::{RngCore, CryptoRng};
use sha3::Sha3_256;
use pbkdf2::pbkdf2_hmac;
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
#[cfg(test)]
mod tests;
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
// Features
const FEATURE_BITS: u8 = 5;
#[allow(dead_code)]
const INTERNAL_FEATURES: u8 = 2;
const USER_FEATURES: u8 = 3;
const USER_FEATURES_MASK: u8 = (1 << USER_FEATURES) - 1;
const ENCRYPTED_MASK: u8 = 1 << 4;
const RESERVED_FEATURES_MASK: u8 = ((1 << FEATURE_BITS) - 1) ^ ENCRYPTED_MASK;
fn user_features(features: u8) -> u8 {
features & USER_FEATURES_MASK
}
fn polyseed_features_supported(features: u8) -> bool {
(features & RESERVED_FEATURES_MASK) == 0
}
// Dates
const DATE_BITS: u8 = 10;
const DATE_MASK: u16 = (1u16 << DATE_BITS) - 1;
const POLYSEED_EPOCH: u64 = 1635768000; // 1st November 2021 12:00 UTC
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
const TIME_STEP: u64 = 2629746; // 30.436875 days = 1/12 of the Gregorian year
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
// After ~85 years, this will roll over.
fn birthday_encode(time: u64) -> u16 {
u16::try_from((time.saturating_sub(POLYSEED_EPOCH) / TIME_STEP) & u64::from(DATE_MASK))
.expect("value masked by 2**10 - 1 didn't fit into a u16")
}
fn birthday_decode(birthday: u16) -> u64 {
POLYSEED_EPOCH + (u64::from(birthday) * TIME_STEP)
}
// Polyseed parameters
const SECRET_BITS: usize = 150;
const BITS_PER_BYTE: usize = 8;
const SECRET_SIZE: usize = SECRET_BITS.div_ceil(BITS_PER_BYTE); // 19
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
const CLEAR_BITS: usize = (SECRET_SIZE * BITS_PER_BYTE) - SECRET_BITS; // 2
// Polyseed calls this CLEAR_MASK and has a very complicated formula for this fundamental
// equivalency
2023-12-17 01:54:24 +00:00
#[allow(clippy::cast_possible_truncation)]
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
const LAST_BYTE_SECRET_BITS_MASK: u8 = ((1 << (BITS_PER_BYTE - CLEAR_BITS)) - 1) as u8;
const SECRET_BITS_PER_WORD: usize = 10;
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
// The amount of words in a seed.
const POLYSEED_LENGTH: usize = 16;
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
// Amount of characters each word must have if trimmed
pub(crate) const PREFIX_LEN: usize = 4;
const POLY_NUM_CHECK_DIGITS: usize = 1;
const DATA_WORDS: usize = POLYSEED_LENGTH - POLY_NUM_CHECK_DIGITS;
// Polynomial
const GF_BITS: usize = 11;
const POLYSEED_MUL2_TABLE: [u16; 8] = [5, 7, 1, 3, 13, 15, 9, 11];
type Poly = [u16; POLYSEED_LENGTH];
fn elem_mul2(x: u16) -> u16 {
if x < 1024 {
return 2 * x;
}
POLYSEED_MUL2_TABLE[usize::from(x % 8)] + (16 * ((x - 1024) / 8))
}
fn poly_eval(poly: &Poly) -> u16 {
// Horner's method at x = 2
let mut result = poly[POLYSEED_LENGTH - 1];
for i in (0 .. (POLYSEED_LENGTH - 1)).rev() {
result = elem_mul2(result) ^ poly[i];
}
result
}
// Key gen parameters
const POLYSEED_SALT: &[u8] = b"POLYSEED key";
const POLYSEED_KEYGEN_ITERATIONS: u32 = 10000;
// Polyseed technically supports multiple coins, and the value for Monero is 0
// See: https://github.com/tevador/polyseed/blob/master/include/polyseed.h#L58
const COIN: u16 = 0;
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// An error when working with a Polyseed.
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
#[cfg_attr(feature = "std", derive(thiserror::Error))]
pub enum PolyseedError {
/// The seed was invalid.
#[cfg_attr(feature = "std", error("invalid seed"))]
InvalidSeed,
/// The entropy was invalid.
#[cfg_attr(feature = "std", error("invalid entropy"))]
InvalidEntropy,
/// The checksum did not match the data.
#[cfg_attr(feature = "std", error("invalid checksum"))]
InvalidChecksum,
/// Unsupported feature bits were set.
#[cfg_attr(feature = "std", error("unsupported features"))]
UnsupportedFeatures,
}
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
/// Language options for Polyseed.
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Zeroize)]
pub enum Language {
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// English language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
English,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// Spanish language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
Spanish,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// French language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
French,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// Italian language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
Italian,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// Japanese language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
Japanese,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// Korean language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
Korean,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// Czech language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
Czech,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// Portuguese language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
Portuguese,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// Simplified Chinese language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
ChineseSimplified,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// Traditional Chinese language option.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
ChineseTraditional,
}
struct WordList {
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
words: &'static [&'static str],
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
has_prefix: bool,
has_accent: bool,
}
impl WordList {
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
fn new(words: &'static [&'static str], has_prefix: bool, has_accent: bool) -> WordList {
let res = WordList { words, has_prefix, has_accent };
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
// This is needed for a later unwrap to not fails
assert!(words.len() < usize::from(u16::MAX));
res
}
}
static LANGUAGES_CELL: OnceLock<HashMap<Language, WordList>> = OnceLock::new();
#[allow(non_snake_case)]
fn LANGUAGES() -> &'static HashMap<Language, WordList> {
LANGUAGES_CELL.get_or_init(|| {
HashMap::from([
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
(Language::Czech, WordList::new(include!("./words/cs.rs"), true, false)),
(Language::French, WordList::new(include!("./words/fr.rs"), true, true)),
(Language::Korean, WordList::new(include!("./words/ko.rs"), false, false)),
(Language::English, WordList::new(include!("./words/en.rs"), true, false)),
(Language::Italian, WordList::new(include!("./words/it.rs"), true, false)),
(Language::Spanish, WordList::new(include!("./words/es.rs"), true, true)),
(Language::Japanese, WordList::new(include!("./words/ja.rs"), false, false)),
(Language::Portuguese, WordList::new(include!("./words/pt.rs"), true, false)),
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
(
Language::ChineseSimplified,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
WordList::new(include!("./words/zh_simplified.rs"), false, false),
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
),
(
Language::ChineseTraditional,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
WordList::new(include!("./words/zh_traditional.rs"), false, false),
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
),
])
})
}
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// A Polyseed.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
pub struct Polyseed {
language: Language,
features: u8,
birthday: u16,
entropy: Zeroizing<[u8; 32]>,
checksum: u16,
}
impl fmt::Debug for Polyseed {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Polyseed").finish_non_exhaustive()
}
}
fn valid_entropy(entropy: &Zeroizing<[u8; 32]>) -> bool {
// Last byte of the entropy should only use certain bits
let mut res =
entropy[SECRET_SIZE - 1].ct_eq(&(entropy[SECRET_SIZE - 1] & LAST_BYTE_SECRET_BITS_MASK));
// Last 13 bytes of the buffer should be unused
for b in SECRET_SIZE .. entropy.len() {
res &= entropy[b].ct_eq(&0);
}
res.into()
}
impl Polyseed {
// TODO: Clean this
fn to_poly(&self) -> Poly {
let mut extra_bits = u32::from(FEATURE_BITS + DATE_BITS);
let extra_val = (u16::from(self.features) << DATE_BITS) | self.birthday;
let mut entropy_idx = 0;
let mut secret_bits = BITS_PER_BYTE;
let mut seed_rem_bits = SECRET_BITS - BITS_PER_BYTE;
let mut poly = [0; POLYSEED_LENGTH];
for i in 0 .. DATA_WORDS {
extra_bits -= 1;
let mut word_bits = 0;
let mut word_val = 0;
while word_bits < SECRET_BITS_PER_WORD {
if secret_bits == 0 {
entropy_idx += 1;
secret_bits = seed_rem_bits.min(BITS_PER_BYTE);
seed_rem_bits -= secret_bits;
}
let chunk_bits = secret_bits.min(SECRET_BITS_PER_WORD - word_bits);
secret_bits -= chunk_bits;
word_bits += chunk_bits;
word_val <<= chunk_bits;
word_val |=
(u16::from(self.entropy[entropy_idx]) >> secret_bits) & ((1u16 << chunk_bits) - 1);
}
word_val <<= 1;
word_val |= (extra_val >> extra_bits) & 1;
poly[POLY_NUM_CHECK_DIGITS + i] = word_val;
}
poly
}
fn from_internal(
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
language: Language,
masked_features: u8,
encoded_birthday: u16,
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
entropy: Zeroizing<[u8; 32]>,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
) -> Result<Polyseed, PolyseedError> {
if !polyseed_features_supported(masked_features) {
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
Err(PolyseedError::UnsupportedFeatures)?;
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
}
if !valid_entropy(&entropy) {
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
Err(PolyseedError::InvalidEntropy)?;
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
}
let mut res = Polyseed {
language,
birthday: encoded_birthday,
features: masked_features,
entropy,
checksum: 0,
};
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
res.checksum = poly_eval(&res.to_poly());
Ok(res)
}
/// Create a new `Polyseed` with specific internals.
///
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// `birthday` is defined in seconds since the epoch.
pub fn from(
language: Language,
features: u8,
birthday: u64,
entropy: Zeroizing<[u8; 32]>,
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
) -> Result<Polyseed, PolyseedError> {
Self::from_internal(language, user_features(features), birthday_encode(birthday), entropy)
}
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
/// Create a new `Polyseed`.
///
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// This uses the system's time for the birthday, if available, else 0.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
pub fn new<R: RngCore + CryptoRng>(rng: &mut R, language: Language) -> Polyseed {
// Get the birthday
#[cfg(feature = "std")]
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
let birthday =
SystemTime::now().duration_since(UNIX_EPOCH).unwrap_or(core::time::Duration::ZERO).as_secs();
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
#[cfg(not(feature = "std"))]
let birthday = 0;
// Derive entropy
let mut entropy = Zeroizing::new([0; 32]);
rng.fill_bytes(entropy.as_mut());
entropy[SECRET_SIZE ..].fill(0);
entropy[SECRET_SIZE - 1] &= LAST_BYTE_SECRET_BITS_MASK;
Self::from(language, 0, birthday, entropy).unwrap()
}
/// Create a new `Polyseed` from a String.
#[allow(clippy::needless_pass_by_value)]
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
pub fn from_string(lang: Language, seed: Zeroizing<String>) -> Result<Polyseed, PolyseedError> {
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
// Decode the seed into its polynomial coefficients
let mut poly = [0; POLYSEED_LENGTH];
// Validate words are in the lang word list
let lang_word_list: &WordList = &LANGUAGES()[&lang];
for (i, word) in seed.split_whitespace().enumerate() {
// Find the word's index
fn check_if_matches<S: AsRef<str>, I: Iterator<Item = S>>(
has_prefix: bool,
mut lang_words: I,
word: &str,
) -> Option<usize> {
if has_prefix {
// Get the position of the word within the iterator
// Doesn't use starts_with and some words are substrs of others, leading to false
// positives
let mut get_position = || {
lang_words.position(|lang_word| {
let mut lang_word = lang_word.as_ref().chars();
let mut word = word.chars();
let mut res = true;
for _ in 0 .. PREFIX_LEN {
res &= lang_word.next() == word.next();
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
}
res
})
2023-08-01 04:47:36 +00:00
};
let res = get_position();
// If another word has this prefix, don't call it a match
if get_position().is_some() {
return None;
}
res
} else {
lang_words.position(|lang_word| lang_word.as_ref() == word)
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
}
}
let Some(coeff) = (if lang_word_list.has_accent {
let ascii = |word: &str| word.chars().filter(char::is_ascii).collect::<String>();
check_if_matches(
lang_word_list.has_prefix,
lang_word_list.words.iter().map(|lang_word| ascii(lang_word)),
&ascii(word),
)
} else {
check_if_matches(lang_word_list.has_prefix, lang_word_list.words.iter(), word)
}) else {
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
Err(PolyseedError::InvalidSeed)?
};
// WordList asserts the word list length is less than u16::MAX
poly[i] = u16::try_from(coeff).expect("coeff exceeded u16");
}
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
// xor out the coin
poly[POLY_NUM_CHECK_DIGITS] ^= COIN;
// Validate the checksum
if poly_eval(&poly) != 0 {
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
Err(PolyseedError::InvalidChecksum)?;
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
}
// Convert the polynomial into entropy
let mut entropy = Zeroizing::new([0; 32]);
let mut extra = 0;
let mut entropy_idx = 0;
let mut entropy_bits = 0;
let checksum = poly[0];
for mut word_val in poly.into_iter().skip(POLY_NUM_CHECK_DIGITS) {
// Parse the bottom bit, which is one of the bits of extra
// This iterates for less than 16 iters, meaning this won't drop any bits
extra <<= 1;
extra |= word_val & 1;
word_val >>= 1;
// 10 bits per word creates a [8, 2], [6, 4], [4, 6], [2, 8] cycle
// 15 % 4 is 3, leaving 2 bits off, and 152 (19 * 8) - 2 is 150, the amount of bits in the
// secret
let mut word_bits = GF_BITS - 1;
while word_bits > 0 {
if entropy_bits == BITS_PER_BYTE {
entropy_idx += 1;
entropy_bits = 0;
}
let chunk_bits = word_bits.min(BITS_PER_BYTE - entropy_bits);
word_bits -= chunk_bits;
let chunk_mask = (1u16 << chunk_bits) - 1;
if chunk_bits < BITS_PER_BYTE {
entropy[entropy_idx] <<= chunk_bits;
}
entropy[entropy_idx] |=
u8::try_from((word_val >> word_bits) & chunk_mask).expect("chunk exceeded u8");
entropy_bits += chunk_bits;
}
}
let birthday = extra & DATE_MASK;
// extra is contained to u16, and DATE_BITS > 8
let features =
u8::try_from(extra >> DATE_BITS).expect("couldn't convert extra >> DATE_BITS to u8");
let res = Self::from_internal(lang, features, birthday, entropy);
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
if let Ok(res) = res.as_ref() {
debug_assert_eq!(res.checksum, checksum);
}
res
}
/// When this seed was created, defined in seconds since the epoch.
pub fn birthday(&self) -> u64 {
birthday_decode(self.birthday)
}
/// This seed's features.
pub fn features(&self) -> u8 {
self.features
}
/// This seed's entropy.
pub fn entropy(&self) -> &Zeroizing<[u8; 32]> {
&self.entropy
}
/// The key derived from this seed.
pub fn key(&self) -> Zeroizing<[u8; 32]> {
let mut key = Zeroizing::new([0; 32]);
pbkdf2_hmac::<Sha3_256>(
self.entropy.as_slice(),
POLYSEED_SALT,
POLYSEED_KEYGEN_ITERATIONS,
key.as_mut(),
);
key
}
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
/// The String representation of this seed.
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
pub fn to_string(&self) -> Zeroizing<String> {
// Encode the polynomial with the existing checksum
let mut poly = self.to_poly();
poly[0] = self.checksum;
// Embed the coin
poly[POLY_NUM_CHECK_DIGITS] ^= COIN;
// Output words
let mut seed = Zeroizing::new(String::new());
let words = &LANGUAGES()[&self.language].words;
for i in 0 .. poly.len() {
Clean the Monero lib for auditing (#577) * Remove unsafe creation of dalek_ff_group::EdwardsPoint in BP+ * Rename Bulletproofs to Bulletproof, since they are a single Bulletproof Also bifurcates prove with prove_plus, and adds a few documentation items. * Make CLSAG signing private Also adds a bit more documentation and does a bit more tidying. * Remove the distribution cache It's a notable bandwidth/performance improvement, yet it's not ready. We need a dedicated Distribution struct which is managed by the wallet and passed in. While we can do that now, it's not currently worth the effort. * Tidy Borromean/MLSAG a tad * Remove experimental feature from monero-serai * Move amount_decryption into EncryptedAmount::decrypt * Various RingCT doc comments * Begin crate smashing * Further documentation, start shoring up API boundaries of existing crates * Document and clean clsag * Add a dedicated send/recv CLSAG mask struct Abstracts the types used internally. Also moves the tests from monero-serai to monero-clsag. * Smash out monero-bulletproofs Removes usage of dalek-ff-group/multiexp for curve25519-dalek. Makes compiling in the generators an optional feature. Adds a structured batch verifier which should be notably more performant. Documentation and clean up still necessary. * Correct no-std builds for monero-clsag and monero-bulletproofs * Tidy and document monero-bulletproofs I still don't like the impl of the original Bulletproofs... * Error if missing documentation * Smash out MLSAG * Smash out Borromean * Tidy up monero-serai as a meta crate * Smash out RPC, wallet * Document the RPC * Improve docs a bit * Move Protocol to monero-wallet * Incomplete work on using Option to remove panic cases * Finish documenting monero-serai * Remove TODO on reading pseudo_outs for AggregateMlsagBorromean * Only read transactions with one Input::Gen or all Input::ToKey Also adds a helper to fetch a transaction's prefix. * Smash out polyseed * Smash out seed * Get the repo to compile again * Smash out Monero addresses * Document cargo features Credit to @hinto-janai for adding such sections to their work on documenting monero-serai in #568. * Fix deserializing v2 miner transactions * Rewrite monero-wallet's send code I have yet to redo the multisig code and the builder. This should be much cleaner, albeit slower due to redoing work. This compiles with clippy --all-features. I have to finish the multisig/builder for --all-targets to work (and start updating the rest of Serai). * Add SignableTransaction Read/Write * Restore Monero multisig TX code * Correct invalid RPC type def in monero-rpc * Update monero-wallet tests to compile Some are _consistently_ failing due to the inputs we attempt to spend being too young. I'm unsure what's up with that. Most seem to pass _consistently_, implying it's not a random issue yet some configuration/env aspect. * Clean and document monero-address * Sync rest of repo with monero-serai changes * Represent height/block number as a u32 * Diversify ViewPair/Scanner into ViewPair/GuaranteedViewPair and Scanner/GuaranteedScanner Also cleans the Scanner impl. * Remove non-small-order view key bound Guaranteed addresses are in fact guaranteed even with this due to prefixing key images causing zeroing the ECDH to not zero the shared key. * Finish documenting monero-serai * Correct imports for no-std * Remove possible panic in monero-serai on systems < 32 bits This was done by requiring the system's usize can represent a certain number. * Restore the reserialize chain binary * fmt, machete, GH CI * Correct misc TODOs in monero-serai * Have Monero test runner evaluate an Eventuality for all signed TXs * Fix a pair of bugs in the decoy tests Unfortunately, this test is still failing. * Fix remaining bugs in monero-wallet tests * Reject torsioned spend keys to ensure we can spend the outputs we scan * Tidy inlined epee code in the RPC * Correct the accidental swap of stagenet/testnet address bytes * Remove unused dep from processor * Handle Monero fee logic properly in the processor * Document v2 TX/RCT output relation assumed when scanning * Adjust how we mine the initial blocks due to some CI test failures * Fix weight estimation for RctType::ClsagBulletproof TXs * Again increase the amount of blocks we mine prior to running tests * Correct the if check about when to mine blocks on start Finally fixes the lack of decoy candidates failures in CI. * Run Monero on Debian, even for internal testnets Change made due to a segfault incurred when locally testing. https://github.com/monero-project/monero/issues/9141 for the upstream. * Don't attempt running tests on the verify-chain binary Adds a minimum XMR fee to the processor and runs fmt. * Increase minimum Monero fee in processor I'm truly unsure why this is required right now. * Distinguish fee from necessary_fee in monero-wallet If there's no change, the fee is difference of the inputs to the outputs. The prior code wouldn't check that amount is greater than or equal to the necessary fee, and returning the would-be change amount as the fee isn't necessarily helpful. Now the fee is validated in such cases and the necessary fee is returned, enabling operating off of that. * Restore minimum Monero fee from develop
2024-07-07 10:57:18 +00:00
seed.push_str(words[usize::from(poly[i])]);
add polyseed support (#257) * add polyseed support * fix pr comments * fix tests * Embed the mempool into the Blockchain * Plan scheduled payments whenever outputs are received The scheduler prior waited for the next series of payments to be added. * Replace Tendermint step with sync_block Step moved a step forward after an externally synced/added block. This created a race condition to add the block between the sync process and the Tendermint machine. Now that the block routes through Tendermint, there is no such race condition. * Finish binding Tendermint into Tributary and define a Tributary master object * Add correction the last commit missed * Add DoS limits to tributary and require provided transactions be ordered * Fix the scheduler from dropping UTXOs when there weren't any payments * Documentation and cargo update * Add a dedicated db crate with a basic DB trait It's needed by the processor and tributary (coordinator). * Add a DB to Tributary Adds support for reloading most of the blockchain. * Reloaded provided transactions from the disk Also resolves a race condition by asserting provided transactions must be unique, allowing them to be safely provided multiple times. * must_use annotations on DbTxn * Support reloading the mempool from disk * Add a NewSet event to validator-sets Updates to the latest serai-dex/substrate due to depending on 10ccaca0eb498a2316bbf627d419b29b1a75933a. * Add basic getters to tributary * cargo update * Update to the latest subxt Writes a custom unsigned extrinic creator due to subxt having an internal error with the scale metadata. While the code in our scope increased, it's much more ergonomic to our usage. We may end up rewriting most of subxt, eventually. * Make unsigned private due to unsafe calling potential * Start defining the coordinator * Merge AckBlock with Burns Offers greater efficiency while reducing concerns re: atomicity. * Correct processor flow to have the coordinator decide signing set/re-attempts The signing set should be the first group to submit preprocesses to Tributary. Re-attempts shouldn't be once every 30s, yet n blocks since the last relevant message. Removes the use of an async task/channel in the signer (and Substrate signer). Also removes the need to be able to get the time from a coin's block, which was a fragile system marked with a TODO already. * cargo +nightly fmt * cargo update Since p256 now pulls in an extra crate with this update, the {k,p}256 imports disable default-features to prevent growing the tree. * Support extracting timestamps from blocks * Make progres on handling NewSet events Further bones out the coordinator. * Resolve #245 * Have InInstructions track the latest block for a network in storage * Fill out code for the rest of the Substrate events * Clean up the Substrate block processing code * Rename transaction file to tributary, add function for genesis * Add a processor API to the coordinator * Add extensive commentary on mutable to the processor's main file Clearly establishes why consistency is guaranteed from a Rust borrow-checker mindset. While there are plenty of... 'violations', they're clearly explained. Hopefully, this method of thinking helps promote/ensure consistency in the future. * Move ConfirmKeyPair from key_gen to substrate Clarifies the emitter and accordingly why its mutations are justified. * Remove BatchSigned SubstrateBlock's provision of the most recently acknowledged block has equivalent information with the same latency. Accordingly, there's no need for it. * Add note to processor_messages * Use a single txn for an entire coordinator message Removes direct DB accesses whre possible. Documents the safety of the rest. Does uncover one case of unsafety not previously noted. * cargo update to remove usage of yanked crate * Clarify safety of Scanner::block_number and KeyGen::keys * Tweak ConfirmKeyPair to alleviate database requirements of coordinator * Use an enum for Coin/NetworkId It originally wasn't an enum so software which had yet to update before an integration wouldn't error (as now enums are strictly typed). The strict typing is preferable though. * Code a method to determine the activation block before any block has consensus [0; 32] is a magic for no block has been set yet due to this being the first key pair. If [0; 32] is the latest finalized block, the processor determines an activation block based on timestamps. This doesn't use an Option for ergonomic reasons. * automate whitespace & trimming test cases * Save keys by their tweaked group_key Keys are referred to by their tweaked versions. If a tweak was needed, keys would fail to confirm. * Use crypto-bigint's reduction in ed448 Achieves feasible performance in the ed448 which makes it potentially viable for real world usage. Accordingly prepares a new release, updating the README. * Move the entirety of ed448 to Residue, offering a further 2-4x speedup * Resolve #68 Notably speeds up monero-serai's build and CLSAG performance. * Make MainDB into SubstrateDB * Initial Tributary handling * Add additional checks to key_gen/sign There is the ability to cause state bloat by flooding Tributary. KeyGen/Sign specifically shouldn't allow bloat since we check the commitments/preprocesses/shares for validity. Accordingly, any invalid data (such as bloat) should be detected. It was posssible to place bloat after the valid data. Doing so would be considered a valid KeyGen/Sign message, yet could add up to 50k kB per sign. * Apply DKG TX handling code to all sign TXs The existing code was almost entirely applicable. It just needed to be scoped with an ID. While the handle function is now a bit convoluted, I don't see a better option. * Split FinalizedBlock into ExternalBlock and SeraiBlock Also re-arranges their orders. * Add support for multiple orderings in Provided Necessary as our Tributary chains needed to agree when a Serai block has occurred, and when a Monero block has occurred. Since those could happen at the same time, some validators may put SeraiBlock before ExternalBlock and vice versa, causing a chain halt. Now they can have distinct ordering queues. * Slash on unrecognized ID * ExternalBlock handler * Add a SubstrateBlockAck message to the processor When a Substrate block occurs, the coordinator is expected to emit SubstrateBlock. This causes the processor to begin a variety of plans. The processor now emits SubstrateBlockAck, explicitly listing all plan IDs, before starting signing. This lets the coordinator provide a SubstrateBlock transaction, and with it, recognize all plan IDs as valid. Prior, we would've had to have a spotty algorithm based upon the upcoming Preprocess messages, or if we immediately provided the SubstrateBlock transaction, then wait for the processor to inform us of the contained plans. This creates an explicitly proper async flow not reliant on waiting for data availability. Alternatively, we could've replaced Preprocess with (Block, Vec<Preprocess>). This would've been more efficient, yet also clunky due to the multiple usages of the Preprocess message. * Route the SubstrateBlock message, which is the last Tributary transaction type * Add recent bloat checks added to signer to substrate_signer as well * Add no_std support to transcript, dalek-ff-group, ed448, ciphersuite, multiexp, schnorr, and monero-generators transcript, dalek-ff-group, ed449, and ciphersuite are all usable with no_std alone. The rest additionally require alloc. Part of #279. * Add a test to the coordinator for running a Tributary Impls a LocalP2p for testing. Moves rebroadcasting into Tendermint, since it's what knows if a message is fully valid + original. Removes TributarySpec::validators() HashMap, as its non-determinism caused different instances to have different round robin schedules. It was already prior moved to a Vec for this issue, so I'm unsure why this remnant existed. Also renames the GH no-std workflow from the prior commit. * Add a test for Tributary Further fleshes out the Tributary testing code. * Test handling of DKG commitments transactions * Add Transaction::sign. While I don't love the introduction of empty_signed, it's practically fine. * Tributary test wait_for_tx_inclusion function * Additionally test DKGShares * Handle adding new Tributaries Removes last_block as an argument from Tendermint. It now loads from the DB as needed. While slightly less performant, it's easiest and should be fine. * Reload Tributaries add_active_tributary writes the spec to disk before it returns, so even if the VecDeque it pushes to isn't popped, the tributary will still be loaded on boot. * Start handling P2P messages This defines the tart of a very complex series of locks I'm really unhappy with. At the same time, there's not immediately a better solution. This also should work without issue. * Clarify Arc RwLocks and sleeps in coordinator * Send a heartbeat message when a Tributary falls behind * cargo fmt * cargo update * Move json word lists to rs Allows building the seed code without serde_json. * Break coordinator main into multiple functions Also moves from std::sync::RwLock to tokio::sync::RwLock to prevent wasting cycles on spinning. * Remove reliance on a blockchain read lock from block/commit * Implement Tributary syncing Also adds a forwards-lookup to the Tributary blockchain. * Don't return from sync_block until the Tendermint machine returns if it's valid or not We had a race condition where'd we be informed of blocks 1 .. 3, and immediately add 1 .. 3. Because we immediately tried to add 2 after 1, it'd fail since the tip was still the genesis, yet 2 needs the tip to be 1. Adding a channel, while ugly, was the simplest way to accomplish this. Also has any added block be broadcasted. Else there's a race condition where a node which syncs up to the most recent block does so, yet fails to add the next block when it's committed to. * Test handle_p2p and Tributary syncing Includes bug fixes. * Tweak tests workflow * Add a TributaryReader which doesn't require a borrow to operate Reduces lock contention. Additionally changes block_key to include the genesis. While not technically needed, the lack of genesis introduced a side effect where any Tributary on the the database could return the block of any other Tributary. While that wasn't a security issue, returning it suggested it was on-chain when it wasn't. This may have been usable to create issues. * Document panic in FROST * Document a pair of panics requiring 256 GB of RAM/4 GB of a context * Add a UID function to messages When we receive messages, we're provided with a message ID we can use to prevent handling an item multiple times. That doesn't prevent us from *sending* an item multiple times though. Thanks to the UID system, we can now not send if already present. Alternatively, we can remove the ordered message ID for just the UID, allowing duplicates to be sent without issue, and handled on the receiving end. * Initial code to handle messages from processors * Document the processor/tributary/coordinator/serai flow * Have Coordinator MainDb take a mutable borrow * Update to substrate polkadot-v0.9.42 * Correct error message in ff-group-tests * Update to May's nightly Doesn't use the PR due to the needed changes. * Support arbitrary RPC providers in monero-serai Sets a clean path for no-std premised RPCs (buffers to an external RPC impl)/ Tor-based RPCs/client-side load balancing/... * Correct processor's handling of the new Monero RPC code * Correct Serai Dockerfile * Publish ExternablBlock/SubstrateBlock, delay *Preprocess until ID acknowledged Adds a channel for the Tributary scanner to communicate when an ID has been acknowledged. * Rename uid to intent * Use U448 for Ed448 instead of U512 * Spawn a new async task for each block message This probably should be done with n-long lived tasks, one per Tributary. While this may not be suitably performant long-term (potential DoS vector), this at least resolves the halting concerns. * Move the coordinator to a n-processor design * Ensure Tributary commits are minimal * Properly get genesis for a Processor message * Create a vote transaction upon GeneratedKeyPair * Remove TODO about code de-duplication It's infeasible to write a macro/function there. Does add a type alias which makes things cleaner. * Have coordinator publish batches to Substrate * Implement MuSig key aggregation into DKG Isn't spec compliant due to the lack of a spec to be compliant too. Slight deviation from the paper by using a unique list instead of a multiset. Closes #186, progresses #277. * Correct 2/3rds definitions throughout the codebase The prior formula failed for some values, such as 20. 20 / 3 = 6, * 2 = 12, + 1 = 13. 13 is 65%, not >= 67. * cargo update Resolves a yanked crate and removes some duplicated dependencies. * Add a dedicated function to get a MuSig key * Do the minimal amount of work for dkg to compile under no-std The Substrate runtime requires access to the MuSig key aggregation function. \#279 related. * Use a MuSig signature to publish validator set key pairs to Serai The processor/coordinator flow still has to be rewritten. * Correct various no_std definitions * Add a context to MuSig key aggregation * Use proper messages for ValidatorSets/InInstructions pallet Provides a DST, and associated metadata as beneficial. Also utilizes MuSig's context to session-bind. Since set_keys_messages also binds to set, this is semi-redundant, yet that's appreciated. * Remove signed Substrate TXs from Coordinator * Only scan v2 Monero TXs * Fix for prior commit * Ensure canonical points in the cross-group DLEq proof * Fix incorrect sig_hash generation sig_hash was used as a challenge. challenges should be of the form H(R, A, m). These sig hashes were solely H(A, m), allowing trivial forgeries. * cargo update Resolves an openssl advisory and nets ~-8 crates. * Build no-std tests with RISC-V 32 IMAC Turns out wasm still has std, making it suboptimal to use here. * Pin setup-protoc to v2.0.0 * Update to substrate polkadot-v0.9.43 * fix tributary sync test * Slight terminology correction in sync test Also correct a mistake from merging the most recent polkadot version. * Update nightly * Replace lazy_static with OnceLock inside monero-serai lazy_static, if no_std environments were used, effectively required always using spin locks. This resolves the ergonomics of that while adopting Rust std code. no_std does still use a spin based solution. Theoretically, we could use atomics, yet writing our own Mutex wasn't a priority. * no-std support for monero-serai (#311) * Move monero-serai from std to std-shims, where possible * no-std fixes * Make the HttpRpc its own feature, thiserror only on std * Drop monero-rs's epee for a homegrown one We only need it for a single function. While I tried jeffro's, it didn't work out of the box, had three unimplemented!s, and is no where near viable for no_std. Fixes #182, though should be further tested. * no-std monero-serai * Allow base58-monero via git * cargo fmt * Represent RCT amounts with None, not 0. Fixes #282. Does allow any v1 TXs which exist, and v2 miner-TXs, to specify Some(0). As far as I can tell, both were/are theoreitcally possible. * Add a message queue This is intended to be a reliable transport between the processors and coordinator. Since it'll be intranet only, it's written as never fail. Primarily needs testing and a proper ID. * cargo update Resolves https://github.com/serai-dex/serai/security/dependabot/29 * Correct deny.toml with inclusion of message-queue * Update nightly * std-shims: six `Read` for &[u8] * Use serai- prefixes on Serai-specific packages Fixes deny.toml, also runs a minor cargo update shrinking the tree. * Update monero-tests workflow to new name for the processor * Correct depends for processor-messages * Disable Rust caching We hit the cache limit after just one or two builds, making it infeasible. * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml * Monero: support for legacy transactions (#308) * add mlsag * fix last commit * fix miner v1 txs * fix non-miner v1 txs * add borromean + fix mlsag * add block hash calculations * fix for the jokester that added unreduced scalars to the borromean signature of 2368d846e671bf79a1f84c6d3af9f0bfe296f043f50cf17ae5e485384a53707b * Add Borromean range proof verifying functionality * Add MLSAG verifying functionality * fmt & clippy :) * update MLSAG, ss2_elements will always be 2 * Add MgSig proving * Tidy block.rs * Tidy Borromean, fix bugs in last commit, replace todo! with unreachable! * Mark legacy EcdhInfo amount decryption as experimental * Correct comments * Write a new impl of the merkle algorithm This one tries to be understandable. * Only pull in things only needed for experimental when experimental * Stop caching the Monero block hash now in processor that we have Block::hash * Corrections for recent processor commit * Use a clearer algorithm for the merkle Should also be more efficient due to not shifting as often. * Tidy Mlsag * Remove verify_rct_* from Mlsag Both methods were ports from Monero, overtly specific without clear documentation. They need to be added back in, with documentation, or included in a node which provides the necessary further context for them to be naturally understandable. * Move mlsag/mod.rs to mlsag.rs This should only be a folder if it has multiple files. * Replace EcdhInfo terminology The ECDH encrypted the amount, yet this struct contained the encrypted amount, not some ECDH. Also corrects the types on the original EcdhInfo struct. * Correct handling of commitment masks when scanning * Route read_array through read_raw_vec * Misc lint * Make a proper RctType enum No longer caches RctType in the RctSignatures as well. * Replace Vec<Bulletproofs> with Bulletproofs Monero uses aggregated range proofs, so there's only ever one Bulletproof. This is enforced with a consensus rule as well, making this safe. As for why Monero uses a vec, it's probably due to the lack of variadic typing used. Its effectively an Option for them, yet we don't need an Option since we do have variadic typing (enums). * Add necessary checks to Eventuality re: supported protocols * Fix for block 202612 and fix merkel root calculations * MLSAG (de)serialisation fix ss_2_elements will not always be 2 as rct type 1 transactions are not enforced to have one input * Revert "MLSAG (de)serialisation fix" This reverts commit 5e710e0c96658092c6ecfe5e4ea5a9c3dbee3ab3. here it checks number of MGs == number of inputs: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/cryptonote_core/tx_verification_utils.cpp#L60-59 and here it checks for RctTypeFull number of MGs == 1: https://github.com/monero-project/monero/blob/0a1eaf26f9dd6b762c2582ee12603b2a4671c735/src/ringct/rctSigs.cpp#L1325 so number of inputs == 1 so ss_2_elements == 2 * update `MlsagAggregate` comment * cargo update Resolves a yanked crate * Move location of serai-client in Cargo.toml --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> * Fix the known issue with the DSA I wrote it to only select TXs with a timelock, not only TXs which are unlocked. This most likely explains why it so heavily selected coinbases. Also moves an InternalError which would've never been hit on mainnet, yet technically isn't an invariant, to only exist when cfg(test). * Add a bin to download a chain, over RPC, reserializing and hashing every item Parallelized. Doesn't check the deserialization is correct. Does use distinct, persistent HTTP clients. * Correct how Monero integration tests are run * Support multiple RPCs in the reserialize_chain bin * Don't call get_height every block * Modify get_transactions to split requests as to not hit the restricted RPC limits * Meaningful changes from aggressive-clippy I do want to enable a few specific lints, yet aggressive-clippy as a whole isn't worthwhile. * Extend reserialize_chain with CLSAG/BP(+) verification * Remove spammy println from reserialize_chain * Update reserialize_chain for v1 and migration TXs Also always marks 0-amount inputs as RCT due to impossibility of non-RCT 0-amount outputs. * Only deserialize RctSignatures where's there at least one input This is only enforced by the Monero protocol due to a single check the mixRing isn't empty in get_pre_mlsag_hash. The value in ensuring there's a least one input is to ensure the safety of our rct_type functions, which determines the RctType based off structural analysis (specifically, input data if MlsagBorromean). rct_type was technically safe without this. A 0-input transaction would be mis-classified as RctFull/MlsagAggregate, which would then make the RctSignatures invalid for being RctFull (requiring exactly one input) yet not having inputs, meaning an invalid RctSignatures would be mis-classified yet still invalid. This just removes the risk of mis-classification in the first place, tightening the library's safety. * docs/Getting Started.md: cargo build --release --all-features * Fix the known instance of #295 * Bind RocksDB into serai-db * Split up tests in CI to avoid node storage limits * Corrections to prior commit * Again I called git commit --amend without calling git add . again :( * Update the flow for completed signing processes Now, an on-chain transaction exists. This resolves some ambiguities and provides greater coordination. * Clean Polyseed code * Final tweaks * Correct no-std builds for Polyseed * Again correct no-std --------- Co-authored-by: Luke Parker <lukeparker5132@gmail.com> Co-authored-by: GitHub Actions <unknown> Co-authored-by: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Co-authored-by: Boog900 <108027008+Boog900@users.noreply.github.com> Co-authored-by: Steven Chang <stevenchang5000@gmail.com>
2023-07-16 11:25:17 +00:00
if i < poly.len() - 1 {
seed.push(' ');
}
}
seed
}
}