Jan 01, 1-2 PM (3)
Jan 01, 2-3 PM (3)
Jan 01, 3-4 PM (4)
Jan 01, 4-5 PM (3)
Jan 01, 5-6 PM (3)
Jan 01, 6-7 PM (6)
Jan 01, 7-8 PM (11)
Jan 01, 8-9 PM (2)
Jan 01, 9-10 PM (12)
Jan 01, 10-11 PM (19)
Jan 01, 11-12 AM (11)
Jan 02, 12-1 AM (0)
Jan 02, 1-2 AM (1)
Jan 02, 2-3 AM (5)
Jan 02, 3-4 AM (3)
Jan 02, 4-5 AM (1)
Jan 02, 5-6 AM (1)
Jan 02, 6-7 AM (1)
Jan 02, 7-8 AM (13)
Jan 02, 8-9 AM (20)
Jan 02, 9-10 AM (20)
Jan 02, 10-11 AM (12)
Jan 02, 11-12 PM (6)
Jan 02, 12-1 PM (14)
Jan 02, 1-2 PM (3)
Jan 02, 2-3 PM (16)
Jan 02, 3-4 PM (30)
Jan 02, 4-5 PM (54)
Jan 02, 5-6 PM (10)
Jan 02, 6-7 PM (15)
Jan 02, 7-8 PM (7)
Jan 02, 8-9 PM (10)
Jan 02, 9-10 PM (1)
Jan 02, 10-11 PM (19)
Jan 02, 11-12 AM (12)
Jan 03, 12-1 AM (1)
Jan 03, 1-2 AM (2)
Jan 03, 2-3 AM (1)
Jan 03, 3-4 AM (1)
Jan 03, 4-5 AM (1)
Jan 03, 5-6 AM (1)
Jan 03, 6-7 AM (1)
Jan 03, 7-8 AM (5)
Jan 03, 8-9 AM (1)
Jan 03, 9-10 AM (7)
Jan 03, 10-11 AM (1)
Jan 03, 11-12 PM (1)
Jan 03, 12-1 PM (2)
Jan 03, 1-2 PM (4)
Jan 03, 2-3 PM (7)
Jan 03, 3-4 PM (10)
Jan 03, 4-5 PM (10)
Jan 03, 5-6 PM (2)
Jan 03, 6-7 PM (0)
Jan 03, 7-8 PM (2)
Jan 03, 8-9 PM (1)
Jan 03, 9-10 PM (1)
Jan 03, 10-11 PM (31)
Jan 03, 11-12 AM (25)
Jan 04, 12-1 AM (10)
Jan 04, 1-2 AM (1)
Jan 04, 2-3 AM (0)
Jan 04, 3-4 AM (4)
Jan 04, 4-5 AM (3)
Jan 04, 5-6 AM (0)
Jan 04, 6-7 AM (0)
Jan 04, 7-8 AM (0)
Jan 04, 8-9 AM (1)
Jan 04, 9-10 AM (1)
Jan 04, 10-11 AM (0)
Jan 04, 11-12 PM (4)
Jan 04, 12-1 PM (6)
Jan 04, 1-2 PM (0)
Jan 04, 2-3 PM (0)
Jan 04, 3-4 PM (2)
Jan 04, 4-5 PM (0)
Jan 04, 5-6 PM (0)
Jan 04, 6-7 PM (0)
Jan 04, 7-8 PM (1)
Jan 04, 8-9 PM (0)
Jan 04, 9-10 PM (2)
Jan 04, 10-11 PM (22)
Jan 04, 11-12 AM (16)
Jan 05, 12-1 AM (0)
Jan 05, 1-2 AM (3)
Jan 05, 2-3 AM (6)
Jan 05, 3-4 AM (4)
Jan 05, 4-5 AM (8)
Jan 05, 5-6 AM (7)
Jan 05, 6-7 AM (4)
Jan 05, 7-8 AM (11)
Jan 05, 8-9 AM (15)
Jan 05, 9-10 AM (25)
Jan 05, 10-11 AM (32)
Jan 05, 11-12 PM (15)
Jan 05, 12-1 PM (21)
Jan 05, 1-2 PM (16)
Jan 05, 2-3 PM (28)
Jan 05, 3-4 PM (19)
Jan 05, 4-5 PM (16)
Jan 05, 5-6 PM (6)
Jan 05, 6-7 PM (5)
Jan 05, 7-8 PM (10)
Jan 05, 8-9 PM (12)
Jan 05, 9-10 PM (16)
Jan 05, 10-11 PM (39)
Jan 05, 11-12 AM (54)
Jan 06, 12-1 AM (10)
Jan 06, 1-2 AM (7)
Jan 06, 2-3 AM (16)
Jan 06, 3-4 AM (10)
Jan 06, 4-5 AM (20)
Jan 06, 5-6 AM (5)
Jan 06, 6-7 AM (8)
Jan 06, 7-8 AM (10)
Jan 06, 8-9 AM (37)
Jan 06, 9-10 AM (10)
Jan 06, 10-11 AM (17)
Jan 06, 11-12 PM (9)
Jan 06, 12-1 PM (10)
Jan 06, 1-2 PM (13)
Jan 06, 2-3 PM (16)
Jan 06, 3-4 PM (14)
Jan 06, 4-5 PM (26)
Jan 06, 5-6 PM (23)
Jan 06, 6-7 PM (40)
Jan 06, 7-8 PM (14)
Jan 06, 8-9 PM (21)
Jan 06, 9-10 PM (12)
Jan 06, 10-11 PM (74)
Jan 06, 11-12 AM (29)
Jan 07, 12-1 AM (17)
Jan 07, 1-2 AM (10)
Jan 07, 2-3 AM (11)
Jan 07, 3-4 AM (33)
Jan 07, 4-5 AM (6)
Jan 07, 5-6 AM (0)
Jan 07, 6-7 AM (1)
Jan 07, 7-8 AM (15)
Jan 07, 8-9 AM (26)
Jan 07, 9-10 AM (33)
Jan 07, 10-11 AM (21)
Jan 07, 11-12 PM (28)
Jan 07, 12-1 PM (52)
Jan 07, 1-2 PM (67)
Jan 07, 2-3 PM (30)
Jan 07, 3-4 PM (44)
Jan 07, 4-5 PM (45)
Jan 07, 5-6 PM (23)
Jan 07, 6-7 PM (16)
Jan 07, 7-8 PM (28)
Jan 07, 8-9 PM (11)
Jan 07, 9-10 PM (11)
Jan 07, 10-11 PM (33)
Jan 07, 11-12 AM (20)
Jan 08, 12-1 AM (3)
Jan 08, 1-2 AM (18)
Jan 08, 2-3 AM (2)
Jan 08, 3-4 AM (12)
Jan 08, 4-5 AM (7)
Jan 08, 5-6 AM (4)
Jan 08, 6-7 AM (7)
Jan 08, 7-8 AM (9)
Jan 08, 8-9 AM (22)
Jan 08, 9-10 AM (18)
Jan 08, 10-11 AM (23)
Jan 08, 11-12 PM (32)
Jan 08, 12-1 PM (19)
Jan 08, 1-2 PM (2)
2,124 commits this week Jan 01, 2026 - Jan 08, 2026
feat: Builder image (#495)
* feat: Master-builder image

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Init workflow

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Remove builder workflow from my feature branch

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Change builder workflow

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Clean up

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Fix

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Try to push

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Small improvements

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Debug

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Debug

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Fix empty line

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Test Trivy

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Revert

Signed-off-by: Evgeniy Dikevich <[email protected]>

* Schedule build

Signed-off-by: Evgeniy Dikevich <[email protected]>

---------

Signed-off-by: Evgeniy Dikevich <[email protected]>
Co-authored-by: Oleksandr Prokhorenko <[email protected]>
Add pure Peras Voting rules
This PR implements the Peras voting rules in a pure fashion. That is,
given a PerasVotingView (which needs to be constructed in an impure
context), they determine purely if a node is allowed to vote or not in a
given round w.r.t. the voting rules from the CIP-0140. See:

https://github.com/cardano-foundation/CIPs/blob/master/CIP-0140/README.md#rules-for-voting-in-a-round

(Note that this is orthogonal from the committee selection: both
conditions need to be satisfied before a node is able to cast a vote in
a give round.)

Notably, our implementation needs to cover the somewhat special case of
deciding whether to start voting at genesis. The problem arises due to
the lack of a latestCertSeen to enable the "voting path" of the rules.
While the CIP uses a specially-defined cert0, our implementation encodes
this case via nullable certificate behind a WithOrigin.

In addition, this PR implements conformance tests against a simpler model
implemented directly over Bools. In the future, this model could be
reified from the Agda spec. Notably, we need to remark that, because VR-1A
is evaluated first, then:

  * VR-1A => !VR-2A

So, this case can't be covered by the test suite in a consistent way.
To hopefully convince you of this, we can show that VR-1A~True and
VR-2A~True leads to a contradiction. Using the following definitions:

  * r: current round (>=0)
  * C: round of the latest certificate seen (>=0)
  * R: Peras ignorance rounds (>0)

We have:

  * VR-1A := r + 1 == C
  * VR-2A := C + R <= r

If we replace C from VR-1A into VR-2A, we get:

  * r + 1 + R <= r

Since R>0:

  * 1 + R > 1

Therefore, we have:

  * r + 1 + R > r + 1 > r

And we conclude that:

  * C + R > r

Thus, !VR-2A, which is a contradiction.

With this in mind, the currently selected generation sizes and frequencies
lead to the following coverage of our testing property:

ouroboros-consensus
  Peras
    Peras voting rules
      isPerasVotingAllowed: OK (0.45s)
        +++ OK, passed 100000 tests.

        Actual result (100000 in total):
        33.708% VoteReason(VR-2A and VR-2B)
        32.242% NoVoteReason(VR-1A or VR-2B)
        30.538% NoVoteReason(VR-1A or VR-2A)
         1.871% VoteReason(VR-1A and VR-1B)
         1.641% NoVoteReason(VR-1B or VR-2A)

        Should vote according to model (100000 in total):
        64.421% False
        35.579% True

        VR-(1A|1B|2A|2B) (100000 in total):
        19.213% (False,True,True,True)
        18.595% (False,True,True,False)
        14.495% (False,False,True,True)
        13.647% (False,False,True,False)
         7.992% (False,True,False,False)
         7.835% (False,False,False,False)
         7.365% (False,False,False,True)
         7.346% (False,True,False,True)
         1.017% (True,True,False,False)
         0.860% (True,False,False,False)
         0.854% (True,True,False,True)
         0.781% (True,False,False,True)

        VR-1A (100000 in total):
        96.488% False
         3.512% True

        VR-1B (100000 in total):
        55.017% True
        44.983% False

        VR-2A (100000 in total):
        65.950% True
        34.050% False

        VR-2B (100000 in total):
        50.054% True
        49.946% False

Co-authored-by: Agustin Mista <[email protected]>
Co-authored-by: Alexander Esgen <[email protected]>
Co-authored-by: Georgy Lukyanov <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Nicolas BACQUEY <[email protected]>
Bound the input queue to provide back pressure
This was resolving an issue where (likely for another reason), rapidly
submitted transactions required re-enqeueing of ReqTx inputs.

Hypothesis: When the input queue was not bounded, another bounded
queue (in Hydra.Logging) was creating delays leading to the re-enqeued
retrying of applying transactions start to fail (because they time out).

It is not known why the chain of transactions we used (see hydra-cluster
bench) was even requiring the re-enqeuing in the first place though.