Skip to content
  1. Jun 04, 2021
  2. Jun 03, 2021
  3. Jun 01, 2021
  4. May 31, 2021
  5. May 29, 2021
  6. May 28, 2021
    • Shawn Tabrizi's avatar
      Simple `MaxBoundedLen` Implementations (#8793) · 444d4e20
      Shawn Tabrizi authored
      
      
      * implement max_values + storages info
      
      * some formatting + doc
      
      * sudo sanity check
      
      * timestamp
      
      * assets (not working)
      
      * fix assets
      
      * impl for proxy
      
      * update balances
      
      * rename StoragesInfo -> PalletStorageInfo
      
      * merge both StorageInfoTrait and PalletStorageInfo
      
      I think it is more future proof. In the future some storage could make
      use of multiple prefix. Like one to store how much value has been
      inserted, etc...
      
      * Update frame/support/procedural/src/storage/parse.rs
      
      Co-authored-by: default avatarPeter Goodspeed-Niklaus <[email protected]>
      
      * Update frame/support/procedural/src/storage/storage_struct.rs
      
      Co-authored-by: default avatarPeter Goodspeed-Niklaus <[email protected]>
      
      * Fix max_size using hasher information
      
      hasher now expose `max_len` which allows to computes their maximum len.
      For hasher without concatenation, it is the size of the hash part,
      for hasher with concatenation, it is the size of the hash part + max
      encoded len of the key.
      
      * fix tests
      
      * fix ui tests
      
      * Move `MaxBoundedLen` into its own crate (#8814)
      
      * move MaxEncodedLen into its own crate
      
      * remove MaxEncodedLen impl from frame-support
      
      * add to assets and balances
      
      * try more fixes
      
      * fix compile
      
      Co-authored-by: default avatarShawn Tabrizi <[email protected]>
      
      * nits
      
      * fix compile
      
      * line width
      
      * fix max-values-macro merge
      
      * Add some derive, needed for test and other purpose
      
      * use weak bounded vec in some cases
      
      * Update lib.rs
      
      * move max-encoded-len crate
      
      * fix
      
      * remove app crypto for now
      
      * width
      
      * Revert "remove app crypto for now"
      
      This reverts commit 73623e9933d50648e0e7fe90b6171a8e45d7f5a2.
      
      * unused variable
      
      * more unused variables
      
      * more fixes
      
      * Add #[max_encoded_len_crate(...)] helper attribute
      
      The purpose of this attribute is to reduce the surface area of
      max_encoded_len changes. Crates deriving `MaxEncodedLen` do not
      need to add it to `Cargo.toml`; they can instead just do
      
      ```rust
      \#[derive(Encode, MaxEncodedLen)]
      \#[max_encoded_len_crate(frame_support::max_encoded_len)]
      struct Example;
      ```
      
      * fix a ui test
      
      * use #[max_encoded_len_crate(...)] helper in app_crypto
      
      * remove max_encoded_len import where not necessary
      
      * update lockfile
      
      * fix ui test
      
      * ui
      
      * newline
      
      * fix merge
      
      * try fix ui again
      
      * Update max-encoded-len/derive/src/lib.rs
      
      Co-authored-by: default avatarPeter Goodspeed-Niklaus <[email protected]>
      
      * extract generate_crate_access_2018
      
      * Update lib.rs
      
      * compiler isnt smart enough
      
      Co-authored-by: default avatarthiolliere <[email protected]>
      Co-authored-by: default avatarPeter Goodspeed-Niklaus <[email protected]>
      Co-authored-by: default avatarPeter Goodspeed-Niklaus <[email protected]>
      444d4e20
    • Alexander Theißen's avatar
  7. May 27, 2021
  8. May 26, 2021
  9. May 25, 2021
    • Denis_P's avatar
      Fix stderr in new Rust nightly (#8904) · 2928e428
      Denis_P authored
      * CI: revert me
      
      * fix stderr
      
      * CI: revert me
      
      * typo
      
      * more stderr fixes
      
      * Revert "CI: revert me"
      
      This reverts commit 5f47effc4965fa5c0c2a6ed92e434a6adb6b1dce.
      
      * Revert "CI: revert me"
      
      This reverts commit 7f785660c797b703dd36272cbe313056dd7a1858.
      2928e428
    • Frederik Schulz's avatar
      Removes unnecessary blank impl for Backend (#8897) · ad76ac79
      Frederik Schulz authored
      * Removes unnecessary blank impl for Backend
      
      This commit removes a from my perspective unneccessary implementation
      for &T which implement Backend.
      
      The current implementation exists (again from my perspective) solely
      to satisfy a methods &mut self parameters (i.e. allows to satisfy
      this for an & reference via using &mut &Backend).
      
      As all implementors use a RefCell with borrow_mut() where actually
      calling the mentioned &mut self method and then forwad to the
      {} implementation of either TrieBackend or ProvingBackend, the
      current &mut self seems to be not needed.
      
      * Fixed tests client
      ad76ac79
  10. May 21, 2021
  11. May 19, 2021
    • Bastian Köcher's avatar
      Improve `impl_opaque_keys!` (#8856) · ee726ed5
      Bastian Köcher authored
      The macro should assume less about the scope where it is being used in.
      In this case it is about not assuming that the crate where the macro is
      called in provides a `std` feature.
      ee726ed5
  12. May 18, 2021
  13. May 15, 2021
  14. May 12, 2021
    • Sergey Pepyakin's avatar
      Embed runtime version as a custom section (#8688) · 0849bcce
      Sergey Pepyakin authored
      
      
      * emit a custom section from impl_runtime_apis!
      
      This change emits a custom section from the impl_runtime_apis! proc macro.
      
      Each implemented API will result to emitting a link section `runtime_apis`.
      During linking all sections with this name will be concatenated and
      placed into the final wasm binary under the same name.
      
      * Introduce `runtime_version` proc macro
      
      This macro takes an existing `RuntimeVersion` const declaration, parses
      it and emits the version information in form of a linking section.
      Ultimately such a linking section will result into a custom wasm
      section.
      
      * Parse custom wasm section for runtime version
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarDavid <[email protected]>
      
      * Fix sc-executor integration tests
      
      * Nits
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Refactor apis section deserialization
      
      * Fix version decoding
      
      * Reuse uncompressed value for CallInWasm
      
      * Log on decompression error
      
      * Simplify if
      
      * Reexport proc-macro from sp_version
      
      * Merge ReadRuntimeVersionExt
      
      * Export `read_embedded_version`
      
      * Fix test
      
      * Simplify searching for custom section
      
      Co-authored-by: default avatarDavid <[email protected]>
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      0849bcce
    • Nikolay Volf's avatar
      update environmental (#8789) · 31c5ddc1
      Nikolay Volf authored
      31c5ddc1
  15. May 10, 2021
    • Sergey Pepyakin's avatar
      Make Allocator trait pub (#8777) · 6f9bc199
      Sergey Pepyakin authored
      We need this in order to be able to assemble more fine grained host
      function sets.
      
      E.g. we don't want to use `SubstrateHostFunctions` for PVF. We would
      better whitelist certain host functions. However, we cannot do that
      because we cannot refer to the `Allocator` runtime interface.
      
      I have not been able to find the reason why it wasn't made `pub` in the
      first place, but do not see any reason why not to.
      6f9bc199
    • Shaun Wang's avatar
      Add arithmetic dispatch errors. (#8726) · 2a38b230
      Shaun Wang authored
      * Add arithmetic dispatch errors.
      
      * Replace custom overflow errors.
      
      * Replace custom underflow and division by zero errors.
      
      * Replace overflow/underflow in token error.
      
      * Add token and arithmetic errors in dispatch error equality test.
      
      * Trigger CI.
      2a38b230
  16. May 09, 2021
  17. May 06, 2021
  18. May 05, 2021
    • Roman Proskuryakov's avatar
    • Aten's avatar
      3d259fde
    • mattrutherford's avatar
      RPC to trace execution of specified block (#7780) · 6e8957b0
      mattrutherford authored
      
      
      * Add filter reload handle
      
      * add RPC, move logging module from cli to tracing
      
      * remove dup fn
      
      * working example
      
      * Update client/rpc-api/src/system/mod.rs
      
      Co-authored-by: default avatarPierre Krieger <[email protected]>
      
      * Prefer "set" to "reload"
      
      * Re-enable the commented out features of the logger
      
      * Remove duplicate code
      
      * cleanup
      
      * unneeded lvar
      
      * Bump to latest patch release
      
      * Add new CLI option to disable log filter reloading,
      
      Move profiling CLI options to SharedParams
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Applied suggestions from reviews
      
      * Fix calls to init_logger()
      
      * Handle errors when parsing logging directives
      
      * Deny `system_setLogFilter` RPC by default
      
      * One more time
      
      * Don't ignore parse errors for log directives set via CLI or RPC
      
      * Improve docs
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Update client/cli/src/config.rs
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * fix merge errors
      
      * include default directives with system_setLogFilter RPC,
      
      implement system_rawSetLogFilter RPC to exclude defaults
      
      * docs etc...
      
      * update test
      
      * refactor: rename fn
      
      * Add a test for system_set_log_filter – NOTE: the code should likely change to return an error when bad directives are passed
      
      * Update client/cli/src/lib.rs
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Address review grumbles
      
      * Add doc note on panicking behaviour
      
      * print all invalid directives before panic
      
      * change RPCs to: addLogFilter and resetLogFilter
      
      * make CLI log directives default
      
      * add comments
      
      * restore previous behaviour to panic when hard-coded directives are invalid
      
      * change/refactor directive parsing
      
      * fix line width
      
      * add test for log filter reloading
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * finish up suggestions from code review
      
      * improve test
      
      * change expect message
      
      * change fn name
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * add docs, remove unused fn
      
      * propagate Err on invalid log directive
      
      * Update tracing-subscriber version
      
      * Improve docs for `disable_log_reloading` CLI param
      
      * WIP implementation: RPC and trace capturing
      
      * WIP
      
      * fix incorrect number of digest items
      
      * return errors
      
      * add From impl for Values, rename structs
      
      * fixes
      
      * implement option to choose targets for traces
      
      * rename fn
      
      * fix EnvFilter and add root span
      
      * fix root span
      
      * add docs, remove unnecessary traits
      
      * fix regression on parent_id introduced in a9c73113
      
      
      
      * fix line width
      
      * remove unused
      
      * include block hash, parent hash & targets in response
      
      * move types from sp-tracing into sp-rpc
      
      move block and parent hash into root of BlockTrace
      
      * switch from log::trace to tracing::trace in state-machine
      
      * use unsigned integer type to represent Ext::id in traces
      
      * ensure id is unique by implementing Subscriber
      
      tracing_subscriber::FmtSubscriber does not guarantee
      unique ids
      
      * indentation
      
      * fix typo
      
      * update types
      
      * add sp_io::storage events
      
      * Change response format
      
      - update types
      - record distinct timestamps
      - sort spans by first entered
      
      * convert to HexDisplay, refactor
      
      * Sort out fallout from merge
      
      * Update client/rpc-api/src/state/mod.rs
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Exit early unless the node runs with --rpc-methods=Unsafe
      
      * Better error handling
      
      * Use wasm-timer
      
      * revert trace alteration in `state-machine` and remove events in `sp_io::storage`
      
      Resolve in follow-up PR
      
      * Review feedback: less collects
      
      * Without Arcs
      
      * Fix span exit
      
      * typo
      
      * cleanup
      
      * Add a few debug messages to tracing module
      
      * Structure traces state-machine/ext; Dispatchable extrinsics spans not working
      
      * Correctly encode Option storage values
      
      * Remove test field for Put and Get
      
      * Try out some changes to dispatch macro
      
      * Add various log messages in dispatch
      
      * Add span dispatch span to new proc macro
      
      * Remove debug messages in dispatch
      
      * Trivial clean up
      
      * Structure remaining state-machine traces (ChangesRoot*)
      
      * Removed unnesecary tracing targets
      
      * Remove log
      
      * New cargo.lock post merge
      
      * Add logging for wasm_overrides
      
      * remove temp logs
      
      * remove temp logs
      
      * remove unused dep
      
      * remove temp logs
      
      * add logging to wasm_overrides
      
      * add logging to state_tracing
      
      * add logging for spans to substrate (includes timings)
      
      * Skip serializing some event fields; Remove most storage traces
      
      * Bring back all ext.rs traces
      
      * Do not skip bool values in events
      
      * Skip serializing span values
      
      * Serialize span values; remove some trace events in ext
      
      * Remove more trace events
      
      * Delete commented out traces
      
      * Remove all unused traces
      
      * Add event filtering
      
      * Fix typo
      
      * wip - change response types to be more efficient
      
      missing import
      
      type
      
      * Serialize struct fields as camelCase
      
      * Add back in event filtering
      
      * Remove name field from event
      
      * Sort spans by time entered
      
      * Sort spans in ASCending order
      
      * Add storage keys target param to rpc
      
      * Limit payload size; improve hash fields; include storage keys
      
      - cleanup event_key_filter
      - better block hash representation
      - limit payload size
      - cleanup based on andrews comments
      
      * Error when serialized payload is to big
      
      * Import MAX_PAYLOAD from rpc-servers
      
      * Clean up ext.rs
      
      * Misc. cleaning and comments
      
      * Strict ordering span Id; no span sort; adjust for rpc base payload
      
      * Add RPC docs to rpc-api/src/state/mod
      
      * Make params bullet points
      
      * Update primitives/rpc/src/tracing.rs
      
      * Put all tracing logic within trace
      
      * Remove attr.record in new_span
      
      * Add back value record in new_span
      
      * restore result collection in ext
      
      * Revert "Add back value record in new_span"
      
      This reverts commit baf1a735f23e5eef1bf6264adfabb788910fa661.
      
      * 🤦
      
      * more 🤦
      
      
      
      * Update docs; Try fix line width issues
      
      * Improve docs
      
      * Improve docs
      
      * Remove default key filters + add key recs to docs
      
      * Try restore old traces
      
      * Add back doc comment
      
      * Clean up newlines in ext.rs
      
      * More new line remova;
      l
      
      * Use FxHashMap
      
      * Try use EnvFilter directives for event filtering
      
      * Remove directive, filter events by fields
      
      * Use trace metadata correctly
      
      * Try EnvFilter directive with all default targets
      
      * Revert "Try EnvFilter directive with all default targets"
      
      This reverts commit 4cc6ebc721d207c3b846444174f89d45038525ac.
      
      * Clean up clippy warning
      
      * Incorporate Niklas feedback
      
      * Update trace/log macro calls to have better syntx
      
      * Use Ordering::Relaxed
      
      * Improve patch and filter doc comment
      
      * Clean up `BlockSubscriber::new`
      
      * Try optimize `BlockSubscriber::enabled`
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarDavid <[email protected]>
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarDavid <[email protected]>
      
      * Use contains_key
      
      * use heuristic for payload size
      
      * Add error tupe for client::tracing::block
      
      * Minor tweaks
      
      * Make a note about `--features with-tracing`
      
      * Add CURL example to RPC docs
      
      * Link to substrate-archibe wasm
      
      * Trivial doc clean up based on David feedback
      
      * Explicit result type name
      
      * Respect line length
      
      * Use the error
      
      * Don't print timings when spans close
      
      * Fix failing sc-rpc-api
      
      * Update  sp-tracing inner-line doc
      
      * Update client/tracing/src/block/mod.rs
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Update client/service/src/client/call_executor.rs
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Update client/service/src/client/call_executor.rs
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Update client/tracing/src/block/mod.rs
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Update client/tracing/src/block/mod.rs
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Address some review grumbles
      
      * Update primitives/state-machine/src/ext.rs
      
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      
      * Use result_encoded structure fields in ext.rs
      
      * Use value key for ext put
      
      * Add notes about tracing key names matter
      
      Co-authored-by: default avatarMatt <[email protected]>
      Co-authored-by: default avatarDavid <[email protected]>
      Co-authored-by: default avatarPierre Krieger <[email protected]>
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      Co-authored-by: default avataremostov <[email protected]>
      6e8957b0
  19. May 04, 2021
  20. May 03, 2021
    • Bastian Köcher's avatar
      Rework inherent data client side (#8526) · 2675741a
      Bastian Köcher authored
      
      
      * Lol
      
      * Yeah
      
      * Moare
      
      * adaasda
      
      * Convert AURA to new pallet macro
      
      * AURA: Switch to `CurrentSlot` instead of `LastTimestamp`
      
      This switches AURA to use `CurrentSlot` instead of `LastTimestamp`.
      
      * Add missing file
      
      * Update frame/aura/src/migrations.rs
      
      Co-authored-by: default avatarAndré Silva <[email protected]>
      
      * Remove the runtime side provide inherent code
      
      * Use correct weight
      
      * Add TODO
      
      * Remove the Inherent from AURA
      
      * 🤦
      
      
      
      * Remove unused stuff
      
      * Update primitives authorship
      
      * Fix babe inherent data provider
      
      * Fix consensus-uncles
      
      * Fix BABE
      
      * Do some further changes to authorship primitives... :D
      
      * More work
      
      * Make it compile the happy path
      
      * Make it async!
      
      * Take hash
      
      * More stuff
      
      * Hacks
      
      * Revert "Hacks"
      
      This reverts commit cfffad88668cfdebf632a59c4fbfada001ef8251.
      
      * Fix
      
      * Make `execute_block` return the final block header
      
      * Move Aura digest stuff
      
      * Make it possible to disable equivocation checking
      
      * Fix fix fix
      
      * Some refactorings
      
      * Comment
      
      * Fixes fixes fixes
      
      * More cleanups
      
      * Some love
      
      * Better love
      
      * Make slot duration being exposed as `Duration` to the outside
      
      * Some slot info love
      
      * Add `build_aura_worker` utility function
      
      * Copy copy copy
      
      * Some stuff
      
      * Start fixing pow
      
      * Fix pow
      
      * Remove some bounds
      
      * More work
      
      * Make grandpa work
      
      * Make slots use `async_trait`
      
      * Introduce `SharedData`
      
      * Add test and fix bugs
      
      * Switch to `SharedData`
      
      * Make grandpa tests working
      
      * More Babe work
      
      * Make grandpa work
      
      * Introduce `SharedData`
      
      * Add test and fix bugs
      
      * Switch to `SharedData`
      
      * Make grandpa tests working
      
      * More Babe work
      
      * Make it async
      
      * Fix fix
      
      * Use `async_trait` in sc-consensus-slots
      
      This makes the code a little bit easier to read and also expresses that
      there can always only be one call at a time to `on_slot`.
      
      * Make grandpa tests compile
      
      * More Babe tests work
      
      * Fix network test
      
      * Start fixing service test
      
      * Finish service-test
      
      * Fix sc-consensus-aura
      
      * Fix fix fix
      
      * More fixes
      
      * Make everything compile *yeah*
      
      * Make manual-seal compile
      
      * More fixes
      
      * Start fixing Aura
      
      * Fix Aura tests
      
      * Fix Babe tests
      
      * Make everything compile
      
      * Move code around and switch to async_trait
      
      * Fix Babe
      
      * Docs docs docs
      
      * Move to FRAME
      
      * Fix fix fix
      
      * Make everything compile
      
      * Last cleanups
      
      * Fix integration test
      
      * Change slot usage of the timestamp
      
      * We really need to switch to `impl-trait-for-tuples`
      
      * Update primitives/inherents/src/lib.rs
      
      Co-authored-by: default avatarAndré Silva <[email protected]>
      
      * Update primitives/inherents/src/lib.rs
      
      Co-authored-by: default avatarAndré Silva <[email protected]>
      
      * Update primitives/inherents/src/lib.rs
      
      Co-authored-by: default avatarAndré Silva <[email protected]>
      
      * Some extra logging
      
      * Remove dbg!
      
      * Update primitives/consensus/common/src/import_queue/basic_queue.rs
      
      Co-authored-by: default avatarAndré Silva <[email protected]>
      
      Co-authored-by: default avatarAndré Silva <[email protected]>
      2675741a
    • Lohann Paterno Coutinho Ferreira's avatar
      Remove Offence delay (#8414) · ffca28ba
      Lohann Paterno Coutinho Ferreira authored
      
      
      * Removed can_report api from OnOffenceHandler
      
      * Removed DeferredOffences and create a storage migration
      
      * Removed missing comments
      
      * Mock set_deferred_offences and deferred_offences methods
      
      * OnOffenceHandler::on_offence always succeed
      
      * Fix benchmark tests
      
      * Fix runtime-benchmark cfg methods
      
      * Removed 'applied' attribute from Offence event
      
      * refactor deprecated deferred offences getter
      
      * Validate if offences are submited after on_runtime_upgrade
      
      * update changelog
      
      * Remove empty lines
      
      * Fix remove_deferred_storage weights
      
      * Remove Offence::on_runtime_upgrade benchmark
      
      * Revert CHANGELOG.md update
      
      * Deprecate DeferredOffenceOf type
      
      * Update copyright
      
      Co-authored-by: default avatarKian Paimani <[email protected]>
      
      * Add migration logs
      
      Co-authored-by: default avatarKian Paimani <[email protected]>
      
      * Fix migration log
      
      * Remove unused import
      
      * Add migration tests
      
      * rustfmt
      
      * use generate_storage_alias! macro
      
      * Refactor should_resubmit_deferred_offences test
      
      * Replace spaces by tabs
      
      * Refactor should_resubmit_deferred_offences test
      
      * Removed WeightSoftLimit
      
      * Removed WeightSoftLimit from tests and mocks
      
      * Remove unused imports
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarKian Paimani <[email protected]>
      ffca28ba
    • Peter Goodspeed-Niklaus's avatar
      Refactor election solution trimming for efficiency (#8614) · c786fb21
      Peter Goodspeed-Niklaus authored
      * Refactor election solution trimming for efficiency
      
      The previous version always trimmed the `CompactOf<T>` instance,
      which was intrinsically inefficient: that's a packed data structure,
      which is naturally expensive to edit. It's much easier to edit
      the unpacked data structures: the `voters` and `assignments` lists.
      
      * rework length-trim tests to work with the new interface
      
      Test suite now compiles. Tests still don't pass because the macro
      generating the compact structure still generates `unimplemented!()`
      for the actual `compact_length_of` implementation.
      
      * simplify
      
      * add a fuzzer which can validate `Compact::encoded_size_for`
      
      The `Compact` solution type is generated distinctly for each runtime,
      and has both three type parameters and a built-in limit to the number
      of candidates that each voter can vote for. Finally, they have an
      optional `#[compact]` attribute which changes the encoding behavior.
      
      The assignment truncation algorithm we're using depends on the ability
      to efficiently and accurately determine how much space a `Compact`
      solution will take once encoded.
      
      Together, these two facts imply that simple unit tests are not
      sufficient to validate the behavior of `Compact::encoded_size_for`.
      This commit adds such a fuzzer. It is designed such that it is possible
      to add a new fuzzer to the family by simply adjusting the
      `generate_solution_type` macro invocation as desired, and making a
      few minor documentation edits.
      
      Of course, the fuzzer still fails for now: the generated implementation
      for `encoded_size_for` is still `unimplemented!()`. However, once
      the macro is updated appropriately, this fuzzer family should allow
      us to gain confidence in the correctness of the generated code.
      
      * Revert "add a fuzzer which can validate `Compact::encoded_size_for`"
      
      This reverts commit 916038790887e64217c6a46e9a6d281386762bfb.
      
      The design of `Compact::encoded_size_for` is flawed. When `#[compact]`
      mode is enabled, every integer in the dataset is encoded using run-
      length encoding. This means that it is impossible to compute the final
      length faster than actually encoding the data structure, because the
      encoded length of every field varies with the actual value stored.
      
      Given that we won't be adding that method to the trait, we won't be
      needing a fuzzer to validate its performance.
      
      * revert changes to `trait CompactSolution`
      
      If `CompactSolution::encoded_size_for` can't be implemented in the
      way that we wanted, there's no point in adding it.
      
      * WIP: restructure trim_assignments_length by actually encoding
      
      This is not as efficient as what we'd hoped for, but it should still
      be better than what it's replacing. Overall efficiency of
      `fn trim_assignments_length` is now `O(edges * lg assignments.len())`.
      
      * fix compiler errors
      
      * don't sort voters, just assignments
      
      Sorting the `voters` list causes lots of problems; an invariant that
      we need to maintain is that an index into the voters list has a stable
      meaning.
      
      Luckily, it turns out that there is no need for the assignments list
      to correspond to the voters list. That isn't an invariant, though previously
      I'd thought that it was.
      
      This simplifies things; we can just leave the voters list alone,
      and sort the assignments list the way that is convenient.
      
      * WIP: add `IndexAssignment` type to speed up repeatedly creating `Compact`
      
      Next up: `impl<'a, T> From<&'a [IndexAssignmentOf<T>]> for Compact`,
      in the proc-macro which makes `Compact`. Should be a pretty straightforward
      adaptation of `from_assignment`.
      
      * Add IndexAssignment and conversion method to CompactSolution
      
      This involves a bit of duplication of types from
      `election-provider-multi-phase`; we'll clean those up shortly.
      
      I'm not entirely happy that we had to add a `from_index_assignments`
      method to `CompactSolution`, but we couldn't define
      `trait CompactSolution: TryFrom<&'a [Self::IndexAssignment]` because
      that made trait lookup recursive, and I didn't want to propagate
      `CompactSolutionOf<T> + TryFrom<&[IndexAssignmentOf<T>]>` everywhere
      that compact solutions are specified.
      
      * use `CompactSolution::from_index_assignment` and clean up dead code
      
      * get rid of `from_index_assignments` in favor of `TryFrom`
      
      * cause `pallet-election-provider-multi-phase` tests to compile successfully
      
      Mostly that's just updating the various test functions to keep track of
      refactorings elsewhere, though in a few places we needed to refactor some
      test-only helpers as well.
      
      * fix infinite binary search loop
      
      Turns out that moving `low` and `high` into an averager function is a
      bad idea, because the averager gets copies of those values, which
      of course are never updated. Can't use mutable references, because
      we want to read them elsewhere in the code. Just compute the average
      directly; life is better that way.
      
      * fix a test failure
      
      * fix the rest of test failures
      
      * remove unguarded subtraction
      
      * fix npos-elections tests compilation
      
      * ensure we use sp_std::vec::Vec in assignments
      
      * add IndexAssignmentOf to sp_npos_elections
      
      * move miner types to `unsigned`
      
      * use stable sort
      
      * rewrap some long comments
      
      * use existing cache instead of building a dedicated stake map
      
      * generalize the TryFrom bound on CompactSolution
      
      * undo adding sp-core dependency
      
      * consume assignments to produce index_assignments
      
      * Add a test of Assignment -> IndexAssignment -> Compact
      
      * fix `IndexAssignmentOf` doc
      
      * move compact test from sp-npos-elections-compact to sp-npos-elections
      
      This means that we can put the mocking parts of that into a proper
      mock package, put the test into a test package among other tests.
      
      Having the mocking parts in a mock package enables us to create a
      benchmark (which is treated as a separate crate) import them.
      
      * rename assignments -> sorted_assignments
      
      * sort after reducing to avoid potential re-sort issues
      
      * add runtime benchmark, fix critical binary search error
      
      "Why don't you add a benchmark?", he said. "It'll be good practice,
      and can help demonstrate that this isn't blowing up the runtime."
      
      He was absolutely right.
      
      The biggest discovery is that adding a parametric benchmark means that
      you get a bunch of new test cases, for free. This is excellent, because
      those test cases uncovered a binary search bug. Fixing that simplified
      that part of the code nicely.
      
      The other nice thing you get from a parametric benchmark is data about
      what each parameter does. In this case, `f` is the size factor: what
      percent of the votes (by size) should be removed. 0 means that we should
      keep everything, 95 means that we should trim down to 5% of original size
      or less.
      
      ```
      Median Slopes Analysis
      ========
      -- Extrinsic Time --
      
      Model:
      Time ~=     3846
          + v    0.015
          + t        0
          + a    0.192
          + d        0
          + f        0
                    µs
      
      Min Squares Analysis
      ========
      -- Extrinsic Time --
      
      Data points distribution:
          v     t     a     d     f   mean µs  sigma µs       %
      <snip>
       6000  1600  3000   800     0      4385     75.87    1.7%
       6000  1600  3000   800     9      4089     46.28    1.1%
       6000  1600  3000   800    18      3793     36.45    0.9%
       6000  1600  3000   800    27      3365     41.13    1.2%
       6000  1600  3000   800    36      3096     7.498    0.2%
       6000  1600  3000   800    45      2774     17.96    0.6%
       6000  1600  3000   800    54      2057     37.94    1.8%
       6000  1600  3000   800    63      1885     2.515    0.1%
       6000  1600  3000   800    72      1591     3.203    0.2%
       6000  1600  3000   800    81      1219     25.72    2.1%
       6000  1600  3000   800    90       859     5.295    0.6%
       6000  1600  3000   800    95     684.6     2.969    0.4%
      
      Quality and confidence:
      param     error
      v         0.008
      t         0.029
      a         0.008
      d         0.044
      f         0.185
      
      Model:
      Time ~=     3957
          + v    0.009
          + t        0
          + a    0.185
          + d        0
          + f        0
                    µs
      ```
      
      What's nice about this is the clear negative correlation between
      amount removed and total time. The more we remove, the less total
      time things take.
      c786fb21
  21. Apr 23, 2021