----------------------------- MODULE MC_PBT ------------------------------- CONSTANT \* @type: ROUND -> PROCESS; Proposer VARIABLES \* @type: PROCESS -> ROUND; round, \* a process round number \* @type: PROCESS -> STEP; step, \* a process step \* @type: PROCESS -> DECISION; decision, \* process decision \* @type: PROCESS -> VALUE; lockedValue, \* a locked value \* @type: PROCESS -> ROUND; lockedRound, \* a locked round \* @type: PROCESS -> PROPOSAL; validValue, \* a valid value \* @type: PROCESS -> ROUND; validRound \* a valid round \* time-related variables VARIABLES \* @type: PROCESS -> TIME; localClock, \* a process local clock: Corr -> Ticks \* @type: TIME; realTime \* a reference Newtonian real time \* book-keeping variables VARIABLES \* @type: ROUND -> Set(PROPMESSAGE); msgsPropose, \* PROPOSE messages broadcast in the system, Rounds -> Messages \* @type: ROUND -> Set(PREMESSAGE); msgsPrevote, \* PREVOTE messages broadcast in the system, Rounds -> Messages \* @type: ROUND -> Set(PREMESSAGE); msgsPrecommit, \* PRECOMMIT messages broadcast in the system, Rounds -> Messages \* @type: Set(MESSAGE); evidence, \* the messages that were used by the correct processes to make transitions \* @type: ACTION; action, \* we use this variable to see which action was taken \* @type: PROCESS -> Set(PROPMESSAGE); receivedTimelyProposal, \* used to keep track when a process receives a timely VALUE message \* @type: <> -> TIME; inspectedProposal \* used to keep track when a process tries to receive a message \* Invariant support VARIABLES \* @type: ROUND -> TIME; beginRound, \* the minimum of the local clocks at the time any process entered a new round \* @type: PROCESS -> TIME; endConsensus, \* the local time when a decision is made \* @type: ROUND -> TIME; lastBeginRound, \* the maximum of the local clocks in each round \* @type: ROUND -> TIME; proposalTime, \* the real time when a proposer proposes in a round \* @type: ROUND -> TIME; proposalReceivedTime \* the real time when a correct process first receives a proposal message in a round INSTANCE TendermintPBT_002_draft WITH Corr <- {"c1", "c2"}, Faulty <- {"f3", "f4"}, N <- 4, T <- 1, ValidValues <- { "v0", "v1" }, InvalidValues <- {"v2"}, MaxRound <- 5, MaxTimestamp <- 10, MinTimestamp <- 2, Delay <- 2, Precision <- 2 \* run Apalache with --cinit=CInit CInit == \* the proposer is arbitrary -- works for safety Proposer \in [Rounds -> AllProcs] =============================================================================