Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Introduce inherent digests#2466

Merged
gavofyork merged 81 commits intomasterfrom
demi-babe-progress
May 29, 2019
Merged

Introduce inherent digests#2466
gavofyork merged 81 commits intomasterfrom
demi-babe-progress

Conversation

@Demi-Marie
Copy link
Contributor

@Demi-Marie Demi-Marie commented May 3, 2019

What This Is

Inherent digests are digests that are provided to the runtime by the consensus algorithm. They are inherent because the runtime trusts them implicitly, although the consensus algorithm does verify them.

This PR passes the digests in the header to the runtime via initialize_block. It does not, however, provide any means for runtimes to actually use the information. This will be provided later.

Changes to digest items

The DigestItem::Seal variant had been deprecated in an earlier PR. This PR removes the deprecation, and changes it to contain ConsensusEngineId and a SealSignature. It also adds the variant DigestItem::PreRuntime for pre-runtime digests.

A consequence of these changes is that the following invariants must be upheld:

  • Runtimes MUST NOT produce a DigestItem::Seal or DigestItem::PreRuntime. Only consensus engines can produce these varients.
  • Consensus engines MUST NOT produce any variants other than DigestItem::Seal or DigestItem::PreRuntime. Furthermore, there MUST be exactly one DigestItem::Seal per combination of block and consensus engine, and they must come after all other digests.
  • The SRML reserves DigestItem::ChangesTreeRoot for itself. Runtimes that use the SRML MUST NOT produce any DigestItem variant except DigestItem::AuthoritiesChange and DigestItem::Consensus.

These invarients are currently not checked. However, I plan on improving the API to catch violations of them at compile-time, by making illegal states unrepresentable.

Backwards compatibility

There isn’t any. Versions of Substrate that include this PR are 100% incompatible with versions that came before. Attempting to combine incompatible versions will result in blocks failing to import.

If necessary, I can include read-only backwards-compatibility support. This will allow nodes including this PR to import blocks generated by older nodes, but not create blocks that can be imported by older nodes.

Cargo.lock changes

Much of the changes are to Cargo.lock files, as some of the code depends on newer versions of dependencies. Reverting these dependencies is trivial, but I believe that upgrading dependencies is a good thing, so that Substrate can take advantage of upstream bug-fixes. This is especially true of libraries like ring, which do not do any backports at all.

Fixes #2232

@gavofyork gavofyork added the A0-please_review Pull request needs code review. label May 4, 2019
Demi-Marie added 2 commits May 4, 2019 19:08
All tests pass. There are still limitations:

1. The runtime strips out inherent digests, so BABE must re-add them.
2. The test runtime checks that it can re-compute all digests.  It
   can’t, so I had to comment out that test.
Demi-Marie added 3 commits May 6, 2019 09:50
Seals were not imported correctly: the pre-digest was imported twice,
instead of both it and the seal being imported.  Also, other parts of
the code did not compile due to incomplete refactoring.
@Demi-Marie Demi-Marie requested review from andresilva, gnunicorn and rphmeier and removed request for ascjones, sorpaas and tomusdrw May 6, 2019 15:52
@rphmeier rphmeier added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels May 9, 2019
Copy link
Contributor Author

@Demi-Marie Demi-Marie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review addressed.

authorities: &[Public],
threshold: u64,
) -> Result<CheckedHeader<B::Header, DigestItemFor<B>>, String>
) -> Result<CheckedHeader<B::Header, (DigestItemFor<B>, DigestItemFor<B>)>, String>
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That said, I believe that would belong in a separate PR.

@gavofyork
Copy link
Member

Some conflicts. If there's nothing left, it'd be good to get this merged. Feel free to bother some reviewers about it.

Copy link
Contributor

@andresilva andresilva left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor nits.

@andresilva
Copy link
Contributor

This will break the flaming fir network, I'm not sure whether we should have some backwards-compatibility support (just to import old seals), or whether we should reset flaming fir after we deploy this. I don't have a very strong opinion on it, but I also don't want us to spend too much effort dealing with backwards compatibility on flaming fir (the idea of the network is to run master with no stability guarantees).

Demi-Marie and others added 8 commits May 28, 2019 13:52
Reformatting

Co-Authored-By: André Silva <andre.beat@gmail.com>
Also, remove some needless unsafe code.
With the removal of the deprecated `Seal` variant, these are not needed.
RLS did not tell me that I hadn’t fixed `babe/lib.rs`, so I missed it.
@gavofyork
Copy link
Member

i'm fine with reseting it.

@gavofyork gavofyork merged commit 6e253c8 into master May 29, 2019
@gavofyork gavofyork deleted the demi-babe-progress branch May 29, 2019 12:13
Demi-Marie added a commit that referenced this pull request Jun 1, 2019
MTDK1 pushed a commit to bdevux/substrate that referenced this pull request Jul 10, 2019
* Introduce inherent digests

* Implement inherent digests

* fix silly error

* Implementation of inherent digests in BABE

All tests pass. There are still limitations:

1. The runtime strips out inherent digests, so BABE must re-add them.
2. The test runtime checks that it can re-compute all digests.  It
   can’t, so I had to comment out that test.

* Fix compilation and seal import

Seals were not imported correctly: the pre-digest was imported twice,
instead of both it and the seal being imported.  Also, other parts of
the code did not compile due to incomplete refactoring.

* Remove bogus assertion

* Fix testsuite compilation

* Remove unused import

* Fix compiler diagnostics

* Add inherent digest parameters to block constructors

This enforces that inherent digests are added first.

* Fixup Cargo.lock

* Fix build errors

* Re-add an incorrectly removed import

* Bump primitive-types version

* Update Cargo.lock

* Refactoring

* Use inherent digests for AuRa

They do reach the runtime, but get stripped.  I have not figured out
where.

* Fix compilation errors

* Fix compilation errors due to incorrect types

* Fix whitespace

Suggested-by: Tomasz Drwiega <tomasz@parity.io>

* Add preamble

Suggested-by: Tomasz Drwiega <tomasz@parity.io>

* Fix silly compile error

* Refactor pre-digest finding code into a separate function

* Remove unwanted assertion

It is too likely to bring down the entire blockchain.

Suggested-by: Tomasz Drwiega <tomasz@parity.io>

* Use `find_pre_digest` after runtime, too

Also, use `Member` trait rather than rolling our own requirements.

Suggested-by: Tomasz Drwiega <tomasz@parity.io>

* Fix various warnings

mostly due to upgrading the dependency on `error_chain`.

* Pre-digests nearly complete

This nearly completes the implementation of pre-runtime digests.

* `Seal2` → `Seal` and fix test suite

* Try to fix the storage error

* Try to fix storage (again)

* Fix tests

* Hopefully finish pre-runtime digests

The key is to pass *only* the pre-runtime digests to the runtime.  The
others must be stripped out by `initialize_block`.

* Fix silly typo

* Fix another silly mistake

* Remove unnecessary filtering of BABE pre-digests

We no longer get duplicate BABE pre-digests, so if they appear, the
header should be rejected outright.

* Update Cargo.lock files

* Reformatting

* Fix silly typo in inherent digest code

Also, revert `error.rs` files that contained calls to the `error_chain!`
macro.

* Try to keep the runtime from stripping pre-digests

Currently runs into the “Storage root must match that calculated”
assertion.

* Don’t compute storage root until storage changes are done.

Also, fix a compilation error.

* Fix compile-time error

* Fix compilation errors

* Fix more compile errors

* Hopefully it compiles this time…

* Fix compilation and add docs

* Prevent BABE from adding duplicate pre-runtime digests

Found by comparing with the AuRa code.  I also did some refactoring.

* Respond to review and fix some warnings

* Delete some dead code introduced earlier

* More dead code goes away

* `ref mut` → `&mut`

* Respond to review and fix some warnings

* Fix compilation error

* Remove unneeded `HashT` type parameter

Suggested-by: Robert Habermeier <robert@parity.io>

* Remove spurious #[allow(deprecated)]

* Document inherent digest parameter to `build_block`

* Delete `Simple` trait

It wasn’t needed

* delete wrongly added files

* Fix trait bounds

* Digest serialization tests

I also did some reformatting and cleanup.

* Apply suggestions from code review

Reformatting

Co-Authored-By: André Silva <andre.beat@gmail.com>

* Swap two arguments to `propose` and `propose_with`

Also, remove some needless unsafe code.

* Remove bogus `#![allow(deprecated)]` annotations

With the removal of the deprecated `Seal` variant, these are not needed.

* Add a missing `#[allow(deprecated)]` in the AuRa tests

* Fix silly compile error

* Fix silly compiler error

RLS did not tell me that I hadn’t fixed `babe/lib.rs`, so I missed it.

* Fixes made automatically by Cargo
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

A0-please_review Pull request needs code review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Inherent Digests (or, how to get the block author in runtime in a general way)

10 participants