Abstract 1 Introduction 2 Preliminaries 3 Modeling pod 4 Protocol pod-core 5 Evaluation 6 Auctions on pod through the bidset protocol 7 Conclusion References Appendix A Validation function for pod-core Appendix B Security of Protocol pod-core under a Continuum of Byzantine and Omission faults

pod: An Optimal-Latency, Censorship-Free,
and Accountable Generalized Consensus Layer

Orestis Alpos ORCID Common Prefix, Athens, Greece Bernardo David ORCID IT University of Copenhagen (ITU), Denmark
Common Prefix, Athens, Greece
Jakov Mitrovski Technical University of Munich, Germany
Common Prefix, Athens, Greece
Odysseas Sofikitis ORCID Common Prefix, Athens, Greece
pod network, Athens, Greece
Dionysis Zindros ORCID Common Prefix, Athens, Greece
pod network, Athens, Greece
Abstract

This work addresses the inherent issues of high latency in blockchains and low scalability in traditional consensus protocols. We present pod, a novel notion of consensus whose first priority is to achieve the physically-optimal latency of 2δ, or one round-trip, i.e., requiring only one network trip (duration δ) for writing a transaction and one for reading it.

To accomplish this, we first eliminate inter-replica communication. Instead, clients send transactions directly to all replicas, which independently process transactions and append them to local logs. Replicas assign a timestamp and a sequence number to each transaction in their logs, allowing clients to extract valuable metadata about the transactions and the system state. Later on, clients retrieve these logs and extract transactions (and associated metadata) from them.

Necessarily, this construction achieves weaker properties than a total-order broadcast protocol, due to existing lower bounds. Our work models the primitive of pod and defines its security properties. We then show pod-core, a protocol that satisfies properties such as transaction confirmation within 2δ, censorship resistance against Byzantine replicas, and accountability for safety violations. We show that single-shot auctions can be realized using the pod notion and observe that it is also sufficient for other popular applications.

Keywords and phrases:
consensus, censorship resistance, accountability, auctions
Copyright and License:
[Uncaptioned image] © Orestis Alpos, Bernardo David, Jakov Mitrovski, Odysseas Sofikitis, and Dionysis Zindros; licensed under Creative Commons License CC-BY 4.0
2012 ACM Subject Classification:
Security and privacy Distributed systems security
; Computer systems organization Dependable and fault-tolerant systems and networks
Related Version:
Full Version: https://arxiv.org/abs/2501.14931 [2]
Editor:
Dariusz R. Kowalski

1 Introduction

Despite the widespread adoption of blockchains, a significant challenge remains unresolved: they are inherently slow. The latency from the moment a client submits a transaction to when it is confirmed in another client’s view of the blockchain can be prohibitively long for certain applications. Notice that we define latency in terms of the blockchain liveness property, referring to finalized, non-reversible outputs: once a transaction is received by a reader, it remains in the protocol’s output permanently. Moreover, we do not assume “optimistic” or “happy path” scenarios, where transactions might finalize faster under favorable conditions (such as having honest leaders or optimal network conditions).

Indeed, Nakamoto-style blockchain protocols require a large number of rounds in order to achieve consensus on a new block, even when considering the best known bounds [15]. On the other hand, it is known that permissioned protocols for n parties (out of which t are corrupted) realizing traditional notions of broadcast and Byzantine agreement require at least t+1 rounds in the synchronous case [1] and at least 2n/(nt) rounds in the asynchronous case [14], even when allowing for digital signatures and probabilistic termination.

In a model where replicas maintain the network, writers submit transactions, and readers read the network, the minimum latency is one network round trip, or 2δ, letting δ denote the actual network delay, as the information must travel from the writers to the replicas and then to the readers. More importantly, we want that any transaction from an honest writer appears in the output of honest readers within 2δ time, regardless of the current value of δ and corrupted parties’ actions. In this context, we are motivated by the following question:

Can we realize tasks that blockchains are commonly used for with optimal latency?

We give a positive answer to this question with a protocol realizing pod, a new notion of consensus that trades off traditional agreement properties for optimal latency, while retaining sufficient security guarantees to realize important tasks (e.g., decentralized auctions).

1.1 Our Contributions

In order to motivate the notion of pod, we first introduce the architecture of our protocol, pod-core, which realizes this notion. To achieve the single-round-trip latency, our first key design decision is to eliminate inter-replica communication entirely. Instead, writers send their transactions directly to all replicas. Each replica maintains its own replica log, processes incoming transactions independently, and transmits its log to readers on request. Readers then process these replica logs to extract transactions and relevant associated information. See Figure 1 for a summary of the pod-core architecture.

Figure 1: pod-core’s simple architecture. A writing client (top) sends a transaction to all replicas (middle). Each replica appends it to its own log and transmits it to the reading client (bottom).

This design raises two important questions. First, what meaningful information can readers derive from replica logs when replicas operate in isolation? Second, given that in two rounds even randomized authenticated broadcast is proven impossible [14], what capabilities can this – necessarily weaker – primitive offer? We demonstrate that, by incorporating simple mechanisms, such as assigning timestamps and sequence numbers to transactions, replicas can enable readers to extract valuable information beyond mere low-latency guarantees. Furthermore, we show how the properties of pod can enable various applications, including auctions (as shown in Section 6). Specifically, a secure pod delivers the following guarantees (formally defined in Section 3):

  • Transaction confirmation within 2δ, with each transaction assigned a confirmed round: we say that the transaction becomes confirmed at the time indicated by the confirmed round.

  • Censorship resistance when facing up to β Byzantine and γ omission-faulty replicas, ensuring all confirmed transactions appear in every honest reader’s output.

  • A past-perfect round can be computed by readers, such that the reader is guaranteed to have received all transactions that are or will be confirmed prior to this round, even though not all transactions are strictly ordered.

  • Accountability for all safety violations, i.e., if any safety property is violated, at least β+1 replicas can be identified as misbehaving.

In particular, our Protocol pod-core, presented in Section 4, realizes the notion of pod with the properties above, supporting a continuum of two adversarial models: up to β Byzantine replicas and up to γ omission-faulty replicas, out of a total of n>5β+3γ replicas. Protocol pod-core requires no expensive cryptographic primitives or setup beyond digital signatures and a PKI registering replicas’ public keys. We showcase pod-core’s efficiency by means of experiments with a prototype implementation presented in Section 5. Our experiments show that even with 1000 replicas distributed around the world, the latency achieved by our protocol is just under double (resp. about 5 times) the round-trip time between writer and reader clients with security against omission-faulty (resp. Byzantine) replicas.

1.2 Technical Overview

We consider that time proceeds in rounds, and that parties (replicas and clients) know the current round, so we can express timestamps in terms of rounds. The output of pod associates each transaction tx with timestamp values rmin0 (minimum round), rmax (maximum round) and rconf (confirmed round). We call these values the trace of tx, and they evolve over time. Initially we have rconf= but later we get rconf, when a transaction is confirmed. The protocol guarantees confirmation within u rounds, meaning that, at most u rounds after tx was written, every party who reads the pod will see tx as confirmed with some rconf. The protocol also guarantees that rminrconfrmax, a property we call confirmation bounds: while each party reads different values rmin,rmax,rconf for the same tx, pod guarantees that values read by different parties stay within these limits.

When clients read the pod, they obtain a pod data structure D=(T,rperf), where T is the set of transactions and their traces and rperf is a past-perfect round. The past-perfection safety property guarantees that T contains all transactions that every other honest party will ever read with a confirmed round smaller than rperf. A pod also guarantees past-perfection within w, meaning that rperf is at most w rounds in the past.

In summary, pod provides past-perfection and confirmation bounds as safety properties, ensuring parties cannot be blindsided by transactions suddenly appearing as confirmed too far in the past, and that the different (and continuously changing) transaction timestamps stay in a certain range. The liveness properties of confirmation within u and past-perfection within w ensure that new transactions get confirmed within a bounded delay, and that each party’s past-perfect round must be constantly progressing.

Besides introducing the notion of pod, we present protocol pod-core, which realizes this notion while requiring minimal interaction among parties and achieving optimal latency, i.e., optimal parameters u=2δ and w=δ, where δ is the current network delay (not a delay upper bound, which we assume to be unknown). The only communication is between each client and the replicas. Writing a transaction tx to pod-core only requires clients to send tx to the replicas, who each assign a timestamp ts (their current time) and a sequence number sn to tx and return a signature on (tx,ts,sn). When reading the pod, the client simply requests each replica’s log of transactions, validates the responses, and determines rmin, rmax, and rconf from the received timestamps. Protocol pod-core supports a continuum of mixed adversarial models, tolerating up to β Byzantine and at the same time up to γ additional omission-faulty replicas.

1.3 Related work

Many previous works have lowered the latency of ordering transactions. HotStuff [27] uses three rounds of all-to-leader and leader-to-all communication pattern, which results in a latency (measuring from the moment a client submits a transaction until in appears in the output of honest replicas) of 8δ in the happy path. Jolteon [16], Ditto [16], and HotStuff-2 [19] are two-round versions of HotStuff with end-to-end latency of 5δ. MoonShot [10] allows leaders to send a new proposal every δ time, before receiving enough votes for the previous one, but still achieves an end-to-end latency of 5δ. In the “DAG-based” line of word, Tusk [8] achieves and end-to-end latency of 7δ, the partially-synchronous version of BullShark [23] an end-to-end latency of 5δ, and Mysticeti [3] an end-to-end latency of 4δ. All these protocols aim at total-order properties and have their lower latency is inherently restricted by lower bounds, whereas pod starts from the single-round-trip latency requirement and explores the properties that can be achieved.

The redundancy of consensus for implementing payment systems has been recognized by previous works [18, 22, 7, 5]. The insight is that total transaction order is not required in the case that each account is controlled by one client. Instead, a partial order is sufficient, ensuring that, if transactions tx1 and tx2 are created by the same client, then every party outputs them in the same order. This requirement was first formalized by Guerraoui et al. [18] as the source-order property. The constructions of Guerraoui et al. [18] and FastPay [5] require clients to maintain sequence numbers. ABC [22] requires clients to reference all previous transaction in a DAG (including its own last transaction). Cheating clients might lose liveness [5, 18, 22], but equivocating is not possible. To the best of our knowledge, previous work in the consensusless literature has not considered or achieved a property like our past-perfection, which we show sufficient for implementing auctions.

2 Preliminaries

Notation.

We denote by the set of natural numbers including 0. Letting L be a bounded sequence, we denote by L[i] the ith element (starting from 0), and by |L| its length. Negative indices address elements from the end, so L[i] is the ith element from the end, and L[1] in particular is the last. The notation L[i:] means the subarray of L from i onwards, while L[:j] means the subsequence of L up to (but not including) j. We denote an empty sequence by []. We denote the concatenation of sequences L1 and L2 by L1L2.

Pseudocode notation.

Command “require P” causes a function to terminate immediately and return 𝖿𝖺𝗅𝗌𝖾 if P evaluates to 𝖿𝖺𝗅𝗌𝖾. Notation “upon e” causes a block of code to be executed when event e occurs. Notations “MSG p” and “MSG p” denote receiving and sending a message MSG from and to party p, respectively. Finally, x:aAbB denotes that variable x is a map from elements of type A to elements of type B. When obvious from the context, we do not explicitly write the types A or B. For a map x, the operations x.keys() and x.values() return all keys and all values in x, respectively. With we denote an empty map.

Parties.

We consider n replicas R={R1,,Rn} and an unknown number of clients. Parties are stateful, i.e., store state between executions of different algorithms. We assume that replicas are known to all parties and register their public keys (for which they have corresponding secret keys) in a Public Key Infrastructure (PKI). Clients do not register keys in the PKI.

Adversarial model.

We call a party (replica or client) honest, if it follows the protocol, and malicious otherwise. We assume static corruptions, i.e., the set of malicious replicas is decided before the execution starts and remains constant. This work uses a combination of two adversarial models, the Byzantine and the omission models. In the Byzantine model, corrupted replicas are malicious and may deviate arbitrarily from the protocol. The adversary has access to the internal state and secret keys of all corrupted parties. We denote by β the number of Byzantine replicas in an execution. The Byzantine adversary is modelled as a probabilistic polynomial time overarching entity that is invoked in the stead of every corrupted party. That is, whenever the turn of a corrupted party comes to be invoked by the environment, the adversary is invoked instead. In the omission model, corrupted replicas may only deviate from the protocol by dropping messages that they were supposed to send, but follow the protocol otherwise. Observe that this includes crash faults, where replicas crash (i.e. stop execution) and remain crashed until the end of the execution of an algorithm. We denote by γ the number of omission-faulty replicas in an execution.

Modeling time.

We assume that time proceeds in discrete rounds, and parties have clocks allowing them to determine the current round. For simplicity, our analysis will assume synchronized clocks. Notice that although we assume synchronized clocks as a setup, clock synchronization can be achieved in partially synchronous networks [11] using existing techniques [21], also in the case where replicas gradually join the network [26]. By timestamp we refer to a round number assigned to some event.

Modeling network.

We denote by δ the actual delay (measured in number of rounds) it takes to deliver a message between two honest parties, a number which is finite but unknown to all parties. We denote by Δ an upper bound on this delay, i.e., δΔ, which is also finite. In the synchronous model, Δ is known to all parties. In the partially synchronous model [11], Δ is unknown but still finite, i.e., all messages are eventually delivered. A protocol is called responsive if it does not rely on knowledge of Δ and its liveness guarantees depend only on the actual network delay δ.

Digital signatures

We assume that replicas (and auctioneers in bidset-core) authenticate their messages with digital signatures. A digital signature scheme consists of the following three algorithms, satisfying the EUF-CMA security [17]: (1) KeyGen(1κ): The key generation algorithm takes as input a security parameter κ and outputs a secret key sk and a public key pk. (2) Sign(sk,m)σ: The signing algorithm takes as input a private key sk and a message m{0,1} and returns a signature σ. (3)Verify(pk,m,σ)b{0,1}: The verification algorithm takes as input a public key pk, a message m, and a signature σ, and outputs a bit b{0,1}. We say σ is a valid signature on m with respect to pk if Verify(pk,m,σ)=1.

Accountable safety

Taking a similar approach as Neu, Tas, and Tse [20, Def. 4], we define accountable safety through an identification function.

Definition 1 (Transcript and partial transcript).

We define as transcript the set of all network messages sent by all parties in an execution of a protocol. A partial transcript is a subset of a transcript.

Definition 2 (β-Accountable safety).

A protocol satisfies accountable safety with resilience β if its interface contains a function 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒(T)R~, which takes as input a partial transcript T and outputs a set of replicas R~R, such that the following conditions hold except with negligible probability.

Correctness:

If safety is violated, then there exists a partial transcript T, such that 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒(T)R~ and |R~|>β.

No-framing:

For any partial transcript T produced during an execution of the protocol, the output of 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒(T) does not contain honest replicas.

 Remark 3.

For simplicity, we have defined the transcript based on messages sent by all replicas. We can also define a local transcript as the set of messages observed by a single party. As will become evident from the implementation of 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒(), in practice, adversarial behavior can be identified from the local transcripts of a single party or of a pair of parties.

3 Modeling pod

In this section, we introduce the notion of a pod, a distributed protocol where clients can read and write transactions. We first define the basic data structures of a pod protocol.

Definition 4 (Transaction trace and trace set).

The transaction trace of a transaction tx{0,1} is a tuple containing the values (tx,rmin,rmax,rconf), which change during the execution of a pod protocol. We call rmin the minimum round, rmax{} the maximum round, rconf{} the confirmed round. We denote by rmax= an unbounded maximum round and by rconf= an undefined confirmed round. We also denote these values as tx.rmin,tx.rmax, and tx.rconf. A trace set T is a set of transaction traces {(tx,rmin,rmax,rconf)tx{0,1}}.

Definition 5 (Confirmed transaction).

A transaction with confirmed round rconf is called confirmed if rconf, and unconfirmed otherwise.

Definition 6 (Pod data structure).

A pod data structure D is a tuple (T,rperf), where T is a trace set and rperf is a round number called the past-perfect round.

We denote the components of a pod data structure as D.T and D.rperf. We write txD.T if an entry (tx,,,) exists in D.T. We remark that transactions in T may be confirmed on unconfirmed. Moreover, rperf will be used to define a completeness property on T (the past-perfection property of pod).

Definition 7 (Auxiliary data).

We associate with a pod data structure D some auxiliary data C, which will be used to validate D. The exact implementation of C is irrelevant for the definition of pod; however, it is helpful to mention that in pod-core it will be a tuple C=(Cpp,tx), where Cpp will be a past-perfection certificate and tx a map from each transaction tx in D.T to a transaction certificate Ctx for tx. Both contain digital signatures.

Definition 8 (Interface of a pod).

A pod protocol has the following interface.

  • write(tx): It writes a transaction tx to the pod.

  • read()(D,C): It outputs a pod data structure D=(T,rperf) and auxiliary data C.

We say that a client reads the pod when it calls read(). If tx appears in T, we say that the client observes tx and, if tx.rconf, we say that the client observes tx as confirmed.

Definition 9 (Validity function).

Apart from its interface functions, a pod protocol also specifies a computable, deterministic, and non-interactive function valid(D, C) that takes as input a pod data structure D and auxiliary data C and outputs a boolean value. We say that a pod data structure D is valid if valid(D,C)=𝗍𝗋𝗎𝖾.

Definition 10 (View of the pod).

We call view of the pod and denote by Drc the data structure returned by read(), where read() is invoked by client c and the output is produced at round r. We remark that r denotes the round when read() outputs, as the client may have invoked it at an earlier round.

We now introduce the basic definition of a secure pod protocol, as well as some additional properties (timeliness and monotonicity) that it may satisfy.

Definition 11 (Secure pod).

A protocol is a secure pod if it implements the pod interface of Definition 8 and specifies a validity function valid(), such that the following properties hold.

(Liveness) Completeness:

Honest clients always output a valid pod data structure. That is, if read() returns (D,C) to an honest client, then valid(D,C)=𝗍𝗋𝗎𝖾.

(Liveness) Confirmation within u:

Transactions of honest clients become confirmed after at most u rounds. Formally, if an honest client c writes a transaction tx at round r, then for any honest client c (including c=c) it holds that txDr+uc and tx.rconf.

(Liveness) Past-perfection within w:

Rounds become past-perfect after at most w rounds. Formally, for any honest client c and round rw, it holds that Drc.rperfrw.

(Safety) Past-perfection:

A valid pod D contains all transactions that may ever obtain a confirmed round smaller than D.rperf. Formally, the adversary cannot output (D1,C1) and (D2,C2) to the network, such that valid(D1,C1)valid(D2,C2) and there exists a transaction tx such that (tx,rmin1,rmax1,rconf1)D1.T and (tx,rmin2,rmax2,rconf2)D2.T and rconf2 and rconf2<D1.rperf.

(Safety) Confirmation bounds:

The values rmin and rmax bound the confirmed round that a transaction may ever obtain. Formally, the adversary cannot output (D1,C1) and (D2,C2) to the network, such that valid(D1,C1)valid(D2,C2) and there exists a transaction tx such that (tx,rmin1,rmax1,rconf1)D1.T and (tx,rmin2,rmax2,rconf2)D2.T and rmin1>rconf2 or rmax1<rconf2.

The confirmation bounds property gives rmin1rconf2rmax1, for rmin1,rmax1,rconf2 computed by honest clients, but it does not guarantee anything about the values of rmin1 and rmax1 (for example, it could trivially be rmin1=0 and rmax1=). To this purpose we define an additional property of pod, called timeliness. Previous work has observed a similar property as orthogonal to safety and liveness [25].

Definition 12 (pod θ-timeliness for honest transactions).

A pod protocol is θ-timely if it is a secure pod, as per Definition 11, and for any honest clients c1,c2, if c1 writes transaction tx in round r and c2 has view Drc2 in round r, such that (tx,rmin,rmax,rconf)Drc2.T, then:
(1) rconf(r,r+θ]; (2) rmax(r,r+θ]; (3) rmaxrmin<θ, implying rmin0 and rmax.

Moreover, a pod protocol allows rmin, rmax, rconf to change during an execution – for example, clients in construction pod-core will update them when they receive votes from replicas. In the full version of this paper [2, Appendix A] we define monotonicity properties that impose restrictions on how these values evolve.

We conclude this section with some visual examples in Figures 2 and 3.

Figure 2: The same transaction in the view of three different pod clients. Each client assigns it a minimum round rmin and a maximum round rmax. If it gets confirmed, the confirmation round rconf will be between these two values. The rconf that each client locally computes respects the bounds of each other client.
Figure 3: A possible view of a single pod client. Transactions tx1,tx2,tx3 are confirmed, tx4 is not yet confirmed. A client also derives a past-perfect round rperf. No transaction other than tx1,tx2,tx3,tx4 may obtain rconfrperf. There may exist tx5 for which the client has not received votes, but tx5 cannot obtain rconfrperf.

4 Protocol pod-core

Before we present protocol pod-core, we define basic concepts and structures.

Definition 13 (Vote).

A vote is a tuple vote=(tx,ts,sn,σ,R), where tx is a transaction, ts is a timestamp, sn is a sequence number, σ is a signature, and R is a replica. A vote is valid if σ is a valid signature on message m=(tx,ts,sn) with respect to the public key pkR of replica R.

 Remark 14 (Sequence numbers, session identifiers, streaming algorithm).

Honest clients process votes from each replica in the same order, namely in order of increasing timestamps. For this, a replica maintains a sequence number which it increments and includes every time it assigns a timestamp to a transaction. We also assume that all messages between clients and replicas are concatenated with a session identifier (sid), which is unique for each concurrent execution of the protocol and included in all messages signed by the replicas. Finally, the client protocol we show in Protocol 1 is streaming, that is, clients maintain a connection to the replicas, and stateful, that is, they persist their state (received transactions and votes) across all invocations of write() and read().

Past-perfection and transaction certificates.

In pod-core, clients store certain votes which they output upon read() as part of the certificate C, which will be used to prove the validity of the returned D and for accountability in case of safety violations. Specifically, C consists of two parts, C=(Cpp,tx): the past-perfection certificate Cpp contains, for each replica, the vote on the most recent timestamp received from that replica. It is implemented as a map from replicas to votes, i.e., Cpp:Rvote. The transaction certificate tx contains, for each transaction, all valid votes received for it. It is implemented as a map from transactions to a map from replicas to votes, i.e., tx:txCtx and Ctx:Rvote. We remark that Cpp can be derived by taking the union of certificates Ctx for all transactions and keeping the most recent vote for each replica, but we define Cpp explicitly for clarity and readability.

Protocol 1 (pod-core).

Protocol pod-core is executed by n replicas that follow the steps of Algorithm 1 and an unknown number of clients that follow the steps of Algorithms 2 and 3 with parameters β, γ and α, where β denotes the number of Byzantine replicas and γ the number of omission-faulty replicas (in addition to the Byzantine) and α=nβγ is the number of honest replicas.

4.1 Replica code

Algorithm 1 Protocol pod-core: Code for a replica Ri, where sk denotes its secret signing key.

We show the pseudocode for the replica code in Algorithm 1. The state of a replica (lines 13) contains replicaLog, a log implemented as a sequence of votes (tx,ts,sn,σ,Ri) created by the replica, where ts is the timestamp assigned by the replica to tx, sn is a sequence number, and σ its signature. When the replica receives CONNECT  from a client c, it appends c to its set of connected clients and sends to c all entries in replicaLog (lines 712).

When it receives WRITE tx, a replica first checks whether it has already seen tx, in which case the message is ignored. Otherwise, it assigns tx a timestamp ts equal its local round number and the next available sequence number sn, and signs the message (tx,ts,sn) (line 18). Honest replicas use incremental sequence numbers for each transaction, implying that a vote with a larger sequence number than a second vote will have a larger or equal timestamp than the second. The replica appends (tx,ts,sn,σ) to replicaLog, and sends it via a VOTE (tx,ts,sn,σ,Ri) message to all connected clients (line 20).

Heartbeat messages.

Clients maintain a most-recent timestamp variable mrt[Rj] for each replica. This is updated every time they receive a vote and is crucial for computing the past-perfect round rperf. To make sure that clients update mrt[Rj] even when Rj does not have any new transactions in a round, we have replicas send a vote on a dummy heartBeat transaction the end of each round (lines 2326). An obvious practical optimization is to send heartBeat only for rounds when no other transactions were sent. When received by a client, a heartBeat is handled as a vote (i.e., it triggers line 11). To avoid being considered a duplicate vote by clients (see line 33 in Algorithm 2), replicas append the round number to the heartBeat transaction.

4.2 Client code

Algorithm 2 Protocol pod-core: Code for a client, part 1.
Algorithm 3 Protocol pod-core: Client code, part 2. Functions to compute trace values and past-perfect round. The code is parametrized with β, the number of Byzantine replicas expected by the client, and γ, the number of omission-faulty replicas, and α=nβγ for n replicas.

The state of a client is shown in Algorithm 2 in lines 16. Variable tsps is a map from transactions tx to a map from replicas R to timestamps ts. The state gets initialized in lines 710. At initialization the client also sends a CONNECT  message to each replica, which initiates a streaming connection from the replica to the client.

Receiving votes.

A client maintains a connection to each replica and receives votes through VOTE (tx,ts,sn,σ,Rj) messages (lines 1116). When a vote is received from replica Rj, the client first verifies the signature σ under Rj’s public key (line 30). If invalid, the vote is ignored. Then the client verifies that the vote contains the next sequence number it expects to receive from replica Rj (line 31). If this is not the case, the vote is backlogged and given again to the client at a later point (the backlogging functionality is not shown in the pseudocode). The client then checks the vote against previous votes received from Rj. First, ts must be greater or equal to mrt[Rj], the most recent timestamp returned by replica Rj. Second, the replica must have not previously sent a different timestamp for tx. If both checks pass, the client updates mrt[Rj] and tsps[tx][Rj] with ts (line 34). The client also updates Cpp and tx for each valid vote (lines 1314).

If any of these checks fail, the client ignores the vote, since both of these cases constitute accountable faults: In the first case, the client can use the message VOTE (tx,ts,sn,σ,Rj) and the vote it received when it updated mrt[Rj] to prove that Rj has misbehaved. In the second case, it can use VOTE (tx,ts,sn,σ,Rj) and the previous vote it has received for tx. The 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒() function we show in Algorithm 8 can detect such misbehavior

Writing to and reading from pod.

Clients interact with a pod using the write(tx) and read() functions. In order to write a transaction tx, a client sends WRITE tx to each replica (lines 1719). Since the construction is stateful and streaming, the client state contains at all times the latest view the client has of the pod. Hence, read() operates on the local state (lines 2024). It returns all the transactions the client has received so far and their traces, and the current past-perfect round rperf. We will show the details of computeTxSet() in Algorithm 3. As per the pod interface, read() also returns auxiliary data C, which has two parts: the past-perfection certificate Cpp and a list of transaction certificates Ctx (line 23). Note that tsps.keys() on line 3 returns all entries in tsps.

Computing the trace values and the past-perfect round.

Function computeTxSet() (Algorithm 3), computes the current transaction set from the timestamps received so far. A transaction becomes confirmed when the client receives α votes for it, in which case rconf is the median of all received timestamps (lines 68). The computation of rmin,rmax, and rperf is done using the functions minPossibleTs(), maxPossibleTs(), and computePastPerfectRound(), respectively. Function minPossibleTs() gets the timestamps timestamps from each replica on tx and the most recent timestamps mrt. It fills a missing timestamp from replica Rj with mrt[Rj] (line 16), the minimum timestamp that can ever be accepted from Rj (see the check in line 32 of Algorithm 2). It then prepends β times the 0 value, pessimistically assuming that up to β replicas will try to bias tx by sending a timestamp 0 to other clients. It then returns the median of the α smallest timestamps, which, again pessimistically, are the smallest timestamps another client may use to confirm tx. Function maxPossibleTs() is analogous, filling a missing vote with (line 24) and appending the value, the worst-case timestamp that Byzantine replicas may send to other clients. Finally, computePastPerfectRound() is similar to minPossibleTs() but it operates on timestamps mrt. As honest clients will not accept a timestamp smaller than mrt on any future transaction (line 32 of Algorithm 2), the returned value bounds from below the confirmed round of any transaction not yet seen.

4.3 Validation function

The validation function valid() allows a pod client to verify that a given pod data structure D satisfies the security properties of pod (Definition 11) without necessarily communicating with pod replicas. The function valid() for pod-core is shown in Appendix A. The verifier repeats the logic of an honest client: it is initialized in the same way as a pod client, goes through the votes found in tx, and checks that the resulting values match the ones in D.

4.4 Analysis

Theorem 15 (pod-core security).

Assume that the network is partially synchronous with actual network delay δ, that β is the number of Byzantine replicas, γ the number of omission-faulty replicas, α=nβγ the confirmation threshold, and n5β+3γ+1 the total number of replicas. Protocol pod-core (Protocol 1), instantiated with a EUF-CMA secure signature scheme, the valid() function shown in Algorithm 7, and the 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒() function described in Algorithm 8, is a responsive secure pod (Definition 11) with Confirmation within u=2δ, Past-perfection within w=δ and β-accountable safety (Definition 2), except with negligible probability.

Proof.

Shown in Appendix B.

5 Evaluation

To validate our theoretical results regarding optimal latency in Protocol pod-core, we implement111Our prototype implementation is available at https://github.com/commonprefix/pod-experiments a prototype pod-core in Rust 1.85. Our benchmarks measure the end-to-end confirmation latency of a transaction from the moment it is written by client until it is read as confirmed by another client in a different continent, both interacting with replicas distributed around the world. Specifically, the latency is computed as the difference between the timestamp recorded by the reading client upon receiving sufficiently many votes (quorum size α) from different replicas and the initial timestamp recorded by the writing client. We present the results in Figure 4.

Figure 4: End-to-end confirmation latency from a writing client to a reading client as a transaction traverses across n=15,,1000 replicas, for two reading clients: (1) a client that expects up to γ=13n omission faults (blue line, below), and (2) a client that expects up to β=15n Byzantine faults (orange line, above). The physical network round-trip time between the reading client and the writing client is also shown (dashed red line, 76ms). A 95% confidence interval is shown (shaded).

The implementation follows a client-server architecture where each replica maintains two TCP listening sockets: one for the reading client connection and one for the writing client connection. Upon receiving a transaction payload from a writer, the replica creates a tuple containing the payload, a sequence number, and the current local timestamp. The replica then signs this tuple using a Schnorr signature222https://crates.io/crates/secp256k1 on secp256k1 curve, appends it to its local log, and forwards the signed tuple to the reading client. Replicas are deployed round-robin across seven AWS regions: Frankfurt, London, N. Virginia, N. California, Canada, Mumbai, and Seoul. Each replica is deployed on a t2.medium EC2 instance (2 vCPUs, 4GB RAM) and is initialized with user data that contains the replica’s unique secret signing key.

We implement two types of clients. The writing client establishes connections to all replicas, records the timestamp (in its local view) right before sending the transaction and sends transaction payloads to each replica. The reading client maintains connections to all replicas, validates incoming signed transactions, and records the timestamp (in its local view) upon receiving a quorum of valid signatures for a particular transaction. We deploy the reading client in London and the writing client in N. Virginia, both initialized with the complete list of replica information (IP addresses, public keys).

We conduct experiments with two different values for the quorum size α=1βγ: (1) β=0 and γ=13n, for a client that only expects omission faults, and (2) β=15n and γ=0, for a client that expects Byzantine faults. We repeat the experiments for different numbers of replicas (n=15,,1000). We repeat each experiment five times and report the mean latency and a 95% confidence interval.

As shown in Figure 4, our experimental results demonstrate that the latency remains largely independent of the number of replicas. The reading client reports a transaction as confirmed as soon as the fastest α replicas have responded, which gives rise to the happy artifact that the 1 - α slowest replicas do not slow down confirmation. This also explains why the omission-fault experiment exhibits lower latency than the Byzantine experiment. Even with 1000 replicas the mean confirmation latency is 138ms for the omission-fault experiment and 375ms for the Byzantine experiment. This approximates the physical network round-trip time between the reading client and the writing client that stands at 76ms.

6 Auctions on pod through the bidset protocol

In this section, we show how single-shot distributed auctions can be implemented on top of pod. This is achieved through bidset, a primitive for collecting a set of bids. The idea is as follows. A pre-appointed sequencer – which can be any party, even a pod replica – runs the auction, but the bids are collected from pod using a bidset protocol. The past-perfection property of pod renders the sequencer unable to censor bids: when it creates an output, all timely and honestly-written bids must be in it, otherwise the sequencer has provably misbehaved and can be held accountable.

Definition 16 (bidset protocol).

A bidset protocol has a starting time parameter t0 and exposes the following interfaces to bidder and consumer parties:

  • function submitBid(b): It is called by a bidder at round t0 to submit a bid b.

  • event result(B, Cbid): It is an event generated by a consumer. It contains a bid-set B, which is a set of bids, and auxiliary information Cbid.

A bidset protocol satisfies the following liveness and safety properties:

(Liveness) Termination within W:

An honest consumer generates an event result(B, Cbid) by round t0+W.

(Safety) Censorship resistance:

If an honest bidder calls submitBid(b) and an honest consumer generates an event result(B, ), then bB.

(Safety) Weak consistency:

If two honest consumers generate result(B1,) and result(B2,) events, such that B1 and B2, then B1=B2.

Protocol 2 (bidset-core).

Construction bidset-core is parameterized by an integer Δ (looking ahead, we will prove security in synchrony, i.e., assuming the network delay δ is smaller than Δ) and assumes digital signatures and a pod with δ-timeliness, w=δ and u=2δ. At time t0, bidders execute Algorithm 4, the sequencer Algorithm 5, and the consumers Algorithm 6.

Algorithm 4 bidset-core: Code for a bidder. It runs a client for a pod-core instance pod.
Algorithm 5 bidset-core: Code for the sequencer. It runs a client for a pod-core instance pod, and ska denotes the secret key of the sequencer.
Algorithm 6 bidset-core: Code for a consumer. It runs a client for a pod-core instance pod.

A bidder (Algorithm 4) submits a bid by writing it on the pod at round t0. The sequencer (Algorithm 5) waits until the pod returns a past-perfect round larger than t0+Δ (line 3) and then constructs the bid-set B from the set of transactions in T (line 4). The sequencer concludes by signing B and Cbid (which can be used as evidence, in case of a safety violation) and writing BIDS (B,Cbid,σ) on pod. The consumer (Algorithm 6) waits until one of the following two conditions is met. First, a confirmed transaction BIDS (B,Cbid,σ) appears in T, for which rconft0+3Δ (line 4), in which case it outputs bid-set B as result. Second, a round higher than t0+3Δ becomes past-perfect in pod (line 6) without a confirmed BIDS  transaction appearing, in which case it outputs B=.

Theorem 17 (Bidset security).

Assuming a synchronous network where δΔ, protocol bidset-core (Construction 2) instantiated with a digital signature and a secure pod protocol that satisfies the past-perfection within w=δ, confirmation within u=2δ and δ-timeliness properties, is a secure bidset protocol satisfying termination within W=3Δ+δ. It satisfies accountable safety with an 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒𝖲𝖾𝗊𝗎𝖾𝗇𝖼𝖾𝗋() function that identifies a malicious sequencer.

Proof.

Additional intuition, formal proofs, and 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒𝖲𝖾𝗊𝗎𝖾𝗇𝖼𝖾𝗋() are shown in the full version of this paper [2, Appendix D].

 Remark 18.

Observe that bidset-core terminates within W=3Δ+δ in the worst case, but, if the sequencer is honest, then it terminates within W=Δ+3δ. Moreover, bidset-core is not responsive because Algorithm 5 waits for a fixed Δ interval. This step can be optimized if the set of bidders is known (e.g., requiring them to pre-register), which allows for the protocol to be made optimistically responsive (i.e., W=4δ) when all parties are honest.

 Remark 19 (Implicit sub-session identifiers).

We assume that each instance of the bidset-core protocol is identified by a unique sub-session identifier (ssid). All messages written to the underlying pod are concatenated with the ssid.

7 Conclusion

In this work we present pod, a novel consensus layer that finalizes transactions with the optimal one-round-trip latency by eliminating communication among replicas. Instead, clients read the system state by performing lightweight computation on logs retrieved from the replicas. As no validator has a particular role in pod (as compared to leaders, block proposers, miners, etc. in similar protocols), pod achieves censorship resistance by default, without any extra mechanisms or additional cost. Furthermore, validator misbehavior, such as voting in incompatible ways or censoring confirmed transactions, is accountable.

As an application, we present an efficient and censorship-resistant mechanism for single-shot first-price and second-price open auctions, which leverages pod as a bulletin board. We show how the accountability, offered by pod, is also inherited by applications built on it – the auctioneer cannot censor confirmed bids without being detected. In the full version [2] of this paper we discuss further applications, including payments in the style of Fastpay [5].

We conjecture that single-shot sealed bid auction protocols, such as those of [12, 4, 9, 24, 6, 13], can also be instantiated on top of a bidset protocol. Intuitively, this holds because such protocols first agree on a set of sealed bids and then determine the winner. A formal analysis of sealed-bid auction protocols based on bidset is left as future work. The architecture of pod also motivates the design of light clients, which would not have to connect to all replicas or to download all transactions. This is achieved through cryptographic primitives such as Merkle mountain ranges and segment trees. We leave the formal description as future work.

Finally, we remark that pod differs from standard notions of consensus because it does not offer an agreement property, neither to validators nor to clients. A client reading the pod obtains a past-perfect round rperf, and it is guaranteed to have received all transactions that obtained a confirmed round rconf such that rconfrperf, or that may obtain such an rconf in the future, even though the transaction presently appears to the client as unconfirmed. However, the client cannot tell which unconfirmed transactions will become confirmed. Moreover, a transaction might appear confirmed to one client and unconfirmed to another (in this case, this is a transaction written by a malicious client).

References

  • [1] Marcos Kawazoe Aguilera and Sam Toueg. A simple bivalency proof that t-resilient consensus requires t + 1 rounds. Inf. Process. Lett., 71(3-4):155–158, 1999. doi:10.1016/S0020-0190(99)00100-3.
  • [2] Orestis Alpos, Bernardo David, and Dionysis Zindros. Pod: An optimal-latency, censorship-free, and accountable generalized consensus layer. CoRR, abs/2501.14931, 2025. doi:10.48550/arXiv.2501.14931.
  • [3] Kushal Babel, Andrey Chursin, George Danezis, Lefteris Kokoris-Kogias, and Alberto Sonnino. Mysticeti: Low-latency DAG consensus with fast commit path. CoRR, abs/2310.14821, 2023. doi:10.48550/arXiv.2310.14821.
  • [4] Samiran Bag, Feng Hao, Siamak F. Shahandashti, and Indranil Ghosh Ray. Seal: Sealed-bid auction without auctioneers. IEEE Transactions on Information Forensics and Security, 15:2042–2052, 2020. doi:10.1109/TIFS.2019.2955793.
  • [5] Mathieu Baudet, George Danezis, and Alberto Sonnino. Fastpay: High-performance byzantine fault tolerant settlement. In AFT, pages 163–177. ACM, 2020. doi:10.1145/3419614.3423249.
  • [6] Tarun Chitra, Matheus V. X. Ferreira, and Kshitij Kulkarni. Credible, Optimal Auctions via Public Broadcast. In Rainer Böhme and Lucianna Kiffer, editors, 6th Conference on Advances in Financial Technologies (AFT 2024), volume 316 of Leibniz International Proceedings in Informatics (LIPIcs), pages 19:1–19:16, Dagstuhl, Germany, 2024. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. doi:10.4230/LIPIcs.AFT.2024.19.
  • [7] Daniel Collins, Rachid Guerraoui, Jovan Komatovic, Petr Kuznetsov, Matteo Monti, Matej Pavlovic, Yvonne-Anne Pignolet, Dragos-Adrian Seredinschi, Andrei Tonkikh, and Athanasios Xygkis. Online payments by merely broadcasting messages. In 50th Annual IEEE/IFIP International Conference on Dependable Systems and Networks, DSN 2020, Valencia, Spain, June 29 - July 2, 2020, pages 26–38. IEEE, 2020. doi:10.1109/DSN48063.2020.00023.
  • [8] George Danezis, Lefteris Kokoris-Kogias, Alberto Sonnino, and Alexander Spiegelman. Narwhal and tusk: a dag-based mempool and efficient BFT consensus. In EuroSys, pages 34–50. ACM, 2022. doi:10.1145/3492321.3519594.
  • [9] Bernardo David, Lorenzo Gentile, and Mohsen Pourpouneh. FAST: Fair auctions via secret transactions. In Giuseppe Ateniese and Daniele Venturi, editors, ACNS 22International Conference on Applied Cryptography and Network Security, volume 13269 of LNCS, pages 727–747. Springer, Cham, June 2022. doi:10.1007/978-3-031-09234-3_36.
  • [10] Isaac Doidge, Raghavendra Ramesh, Nibesh Shrestha, and Joshua Tobkin. Moonshot: Optimizing chain-based rotating leader BFT via optimistic proposals. CoRR, abs/2401.01791, 2024. doi:10.48550/arXiv.2401.01791.
  • [11] Cynthia Dwork, Nancy Lynch, and Larry Stockmeyer. Consensus in the presence of partial synchrony. J. ACM, 35(2):288–323, April 1988. doi:10.1145/42282.42283.
  • [12] Hisham S. Galal and Amr M. Youssef. Trustee: Full privacy preserving vickrey auction on top of ethereum. In Andrea Bracciali, Jeremy Clark, Federico Pintore, Peter B. Rønne, and Massimiliano Sala, editors, Financial Cryptography and Data Security, pages 190–207, Cham, 2020. Springer International Publishing.
  • [13] Chaya Ganesh, Shreyas Gupta, Bhavana Kanukurthi, and Girisha Shankar. Secure vickrey auctions with rational parties. Cryptology ePrint Archive, Paper 2024/1011, 2024. To appear at CCS 2024. doi:10.1145/3658644.3670311.
  • [14] Juan A. Garay, Jonathan Katz, Chiu-Yuen Koo, and Rafail Ostrovsky. Round complexity of authenticated broadcast with a dishonest majority. In FOCS, pages 658–668. IEEE Computer Society, 2007. doi:10.1109/FOCS.2007.44.
  • [15] Peter Gazi, Ling Ren, and Alexander Russell. Practical settlement bounds for longest-chain consensus. In Helena Handschuh and Anna Lysyanskaya, editors, Advances in Cryptology - CRYPTO 2023 - 43rd Annual International Cryptology Conference, CRYPTO 2023, Santa Barbara, CA, USA, August 20-24, 2023, Proceedings, Part I, volume 14081 of Lecture Notes in Computer Science, pages 107–138. Springer, 2023. doi:10.1007/978-3-031-38557-5_4.
  • [16] Rati Gelashvili, Lefteris Kokoris-Kogias, Alberto Sonnino, Alexander Spiegelman, and Zhuolun Xiang. Jolteon and ditto: Network-adaptive efficient consensus with asynchronous fallback. In Financial Cryptography, volume 13411 of Lecture Notes in Computer Science, pages 296–315. Springer, 2022. doi:10.1007/978-3-031-18283-9_14.
  • [17] Shafi Goldwasser, Silvio Micali, and Ronald L. Rivest. A digital signature scheme secure against adaptive chosen-message attacks. SIAM J. Comput., 17(2):281–308, 1988. doi:10.1137/0217017.
  • [18] Rachid Guerraoui, Petr Kuznetsov, Matteo Monti, Matej Pavlovic, and Dragos-Adrian Seredinschi. The consensus number of a cryptocurrency. Distributed Comput., 35(1):1–15, 2022. doi:10.1007/S00446-021-00399-2.
  • [19] Dahlia Malkhi and Kartik Nayak. Extended abstract: Hotstuff-2: Optimal two-phase responsive BFT. IACR Cryptol. ePrint Arch., page 397, 2023. URL: https://eprint.iacr.org/2023/397.
  • [20] Joachim Neu, Ertem Nusret Tas, and David Tse. The availability-accountability dilemma and its resolution via accountability gadgets. In Ittay Eyal and Juan A. Garay, editors, FC 2022, volume 13411 of LNCS, pages 541–559. Springer, Cham, May 2022. doi:10.1007/978-3-031-18283-9_27.
  • [21] Barbara Simons. An overview of clock synchronization. In Barbara Simons and Alfred Spector, editors, Fault-Tolerant Distributed Computing, pages 84–96, New York, NY, 1990. Springer New York.
  • [22] Jakub Sliwinski and Roger Wattenhofer. ABC: asynchronous blockchain without consensus. CoRR, abs/1909.10926, 2019. arXiv:1909.10926.
  • [23] Alexander Spiegelman, Neil Giridharan, Alberto Sonnino, and Lefteris Kokoris-Kogias. Bullshark: The partially synchronous version. CoRR, abs/2209.05633, 2022. doi:10.48550/arXiv.2209.05633.
  • [24] Nirvan Tyagi, Arasu Arun, Cody Freitag, Riad Wahby, Joseph Bonneau, and David Mazières. Riggs: Decentralized sealed-bid auctions. In Weizhi Meng, Christian Damsgaard Jensen, Cas Cremers, and Engin Kirda, editors, ACM CCS 2023, pages 1227–1241. ACM Press, November 2023. doi:10.1145/3576915.3623182.
  • [25] Apostolos Tzinas, Srivatsan Sridhar, and Dionysis Zindros. On-chain timestamps are accurate. Cryptology ePrint Archive, Report 2023/1648, 2023. URL: https://eprint.iacr.org/2023/1648.
  • [26] Josef Widder. Booting clock synchronization in partially synchronous systems. In Faith Ellen Fich, editor, Distributed Computing, pages 121–135, Berlin, Heidelberg, 2003. Springer Berlin Heidelberg. doi:10.1007/978-3-540-39989-6_9.
  • [27] Maofan Yin, Dahlia Malkhi, Michael K. Reiter, Guy Golan-Gueta, and Ittai Abraham. Hotstuff: BFT consensus with linearity and responsiveness. In PODC, pages 347–356. ACM, 2019. doi:10.1145/3293611.3331591.

Appendix A Validation function for pod-core

In this section we present the function valid(), which allows a pod client, which is not necessarily communicating with the pod replicas, to verify that a given pod data structure D satisfies the security properties of pod (Definition 11).

Algorithm 7 Function valid(D, C) for pod-core. Code for a verifier, which can be a pod client not communicating with the pod replicas.

The function valid() for pod-core is shown in Algorithm 7. The idea is to have the verifier repeat the logic of an honest client. The verifier is initialized in the same way as in Algorithm 2 – importantly, it knows the identifiers and public keys of pod replicas. Function valid() takes as input a pod data structure D and auxiliary data C, which contains two parts, a past-perfection certificate Cpp and a collection of transaction certificates tx, one for each transaction in D.T. Both contain vote messages, as constructed by a pod client in lines 13 and 14 of Algorithm 2. The verifier processes each vote in order of increasing sequence number sn using function processVote(). If any vote is invalid, valid() returns 𝖿𝖺𝗅𝗌𝖾. Observe that if the votes are valid the verifier will have updated its local tsps and mrt variables with the same values as the pod client that constructed D. Finally, the verifier computes the transaction set T and the past-perfect round rperf (using its local tsps and mrt variables) and requires that the values match the ones in D (lines 910).

Finally, the verifier also verifies the past-perfection certificate. Given that the previous checks have passed, we require that each vote in Cpp is contained in one of the transaction certificates in tx and has the maximum sequence number received from the client that sent the vote (lines 1114). As we have remarked earlier, Cpp can be derived from tx by taking the union of certificates tx for all transactions and keeping the most recent vote for each replica, in which case the checks on lines 1114 can be omitted. We maintain the past-perfection certificate for readability and simplicity in the proofs.

Appendix B Security of Protocol pod-core under a Continuum of Byzantine and Omission faults

In order to prove Theorem 15 and establish the security of Protocol pod-core shown Construction 1, we first prove some useful intermediate results. We remind that n=α+β+γ, where n denotes the total number of replicas, β denotes the number of Byzantine replicas, γ denotes the number of omission-faulty replicas in an execution, and α denotes the number of replicas required to confirm a transaction.

Lemma 20 (The values for minimum, maximum and confirmed rounds).

Regarding Algorithm 3, we have the following. Consider the list of all timestamps received by a client for a particular transaction, replacing a missing vote from Rj with a special value (mrt[Rj] for computing rmin, for computing rmax), to get n values in total, sorted in increasing order. Assume mrt is also sorted in increasing order of timestamps.

  1. 1.

    rmin is the timestamp at index α/2β of this list.

  2. 2.

    rmax is the timestamp at index nα+α/2+β of this list.

  3. 3.

    rperf is the timestamp at index α/2β of mrt.

Proof.

Functions minPossibleTs() and computePastPerfectRound() prepend β times the 0 value in the beginning of the list and return the median of the first α values, hence they return the timestamp at index α/2β. Function maxPossibleTs() appends β times the value at the end of the list and returns the median of the last α values of that list, that is, it ignores the first nα+β values and returns the timestamp at index nα+β+α/2.

Lemma 21 (rperf bounded by honest timestamp).

Assuming n5β+3γ+1 (equiv., α4β+2γ+1), for a valid pod D with auxiliary data C=(Cpp,tx), there exists some honest replica Rj, such that the most-recent timestamp mrt from Rj included in Cpp satisfies mrtD.rperf.

Proof.

Since valid(D,C)=𝗍𝗋𝗎𝖾, the past-perfect round D.rperf is the value returned by computePastPerfectRound() of Algorithm 3. From Lemma 20 we have that rperf is the timestamp at index α/2β of sorted mrt. The condition α4β+2γ+1 implies that β+γα/2β, hence the number of not honest replicas (β+γ) cannot fill all positions between 0 and α/2β, hence at least one of the indexes between 0 and α/2β (inclusive) will contain the timestamp created and sent by an honest replica. We now recall Theorem 15, which we prove through a series of lemmas.

Theorem 15 (pod-core security).

Assume that the network is partially synchronous with actual network delay δ, that β is the number of Byzantine replicas, γ the number of omission-faulty replicas, α=nβγ the confirmation threshold, and n5β+3γ+1 the total number of replicas. Protocol pod-core (Protocol 1), instantiated with a EUF-CMA secure signature scheme, the valid() function shown in Algorithm 7, and the 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒() function described in Algorithm 8, is a responsive secure pod (Definition 11) with Confirmation within u=2δ, Past-perfection within w=δ and β-accountable safety (Definition 2), except with negligible probability.

Proof.

Follows from Lemmas 2226, presented and proven in the remainder of this section.

Lemma 22 (Confirmation within u).

For the conditions stated in Theorem 15, Protocol 1 satisfies the confirmation within u property (Definition 11) for u=2δ.

Proof.

Assume an honest client c calls write(tx) at round r. It sends message WRITE tx to all replicas at round r (line 18). An honest replica receives this by round r+δ and sends a VOTE  message back to all connected clients (line 20). An honest client c receives the vote by round r+2δ. As are at least α honest replicas, c receives at least α such votes, hence the condition in line 6 is satisfied and c observes tx as confirmed.

Lemma 23 (Past-perfection within w).

For the conditions stated in Theorem 15, Protocol 1 satisfies the past-perfection within w property (Definition 11) for w=δ.

Proof.

Assume an honest client c at round r has view Drc. From Lemma 21, there exists some honest replica Rj, such that the most-recent timestamp mrt[Rj] that Rj has sent to c satisfies Drc.rperfmrt[Rj]. The honest replica Rj sends at least one heartbeat or vote message per round (line 25), which arrives within δ rounds, and an honest client updates mrt[Rj] when it receives the heartbeat or vote message. Hence, c will have mrt[Rj]rδ. All together, Drc.rperfrδ.

Lemma 24 (Past-perfection safety).

For the conditions stated in Theorem 15, Protocol 1 satisfies the past-perfection safety property (Definition 11), except with negligible probability.

Proof.

Assume the adversary outputs valid (D1,C1) and (D2,C2) that violate the property, i.e., there exists a transaction tx such that (tx,rmin1,rmax1,rconf1)D1.T and (tx,rmin2,rmax2,rconf2)D2.T and rconf2 and rconf2<D1.rperf. Let C1=(Cpp1,tx1) and C2=(Cpp2,tx2).

Let 1 be the set of replicas Ri for which Cpp1 contains a vote with timestamp mrtiD1.rperf. From Lemma 20 (rperf is computed as the timestamp at index α/2β of sorted mrt), and since D1 is valid, there exist at least na/2+β such replicas, hence |1|na/2+β. For each Ri1, the transaction certificates tx1 contain the whole log of Ri with timestamps up to mrti (line 31 of Algorithm 2 does not allow gaps in the sequence number of the received votes). That is, for each Ri1 the certificates tx1 contains votes

(txi,1,tsi,1,1,σi,1,Ri),(txi,2,tsi,2,2,σi,2,Ri),,(txi,ki,tsi,ki,ki,σi,ki,Ri), (1)

where ki is the smallest sequence number for which tsi,kiD1.rperf, and txi,j are transactions.

Since tx is confirmed in D2 and rconf2<D1.rperf, the transaction certificate tx2[tx] must contain votes on tx with timestamp tsi, such that tsi<D1.rperf, from at least α/2+1 replicas. Let 2 be the set of these replicas, with |2|α/2+1. For each Ri2, certificate tx2[tx] contains a vote

(tx,tsi,sni,σi,Ri), (2)

such that tsi<D1.rperf. We will show that, if at most β replicas are Byzantine, this leads to a contradiction. Observe from the cardinality of 1 and 2 that at least β+1 replicas must be in both sets, hence at least one honest replica must be in both sets (except if the adversary forges a signature under the public key of an honest replica, which happens with negligible probability). For that replica, the vote in (2) must be one of the votes in (1) since tsi<D1.rperf and tsi,miD1.rperf. Hence, one of the txi,j in (1) is tx, and tx must appear in D1.T, a contradiction.

Lemma 25 (Confirmation bounds).

For the conditions stated in Theorem 15, Protocol 1 satisfies the confirmation bounds property (Definition 11), except with negligible probability.

Proof.

Assume the adversary outputs (D1,C1) and (D2,C2), such that valid(D1,C1)valid(D2,C2) and there exists a transaction tx such that (tx,rmin1,rmax1,rconf1)D1.T and (tx,rmin2,rmax2,rconf2)D2.T. Let C1=(Cpp1,tx1) and C2=(Cpp2,tx2), and Ctx1=tx1[tx] and Ctx2=tx2[tx].

First assume rmin1>rconf2. From Lemma 20, Ctx1 can include at most α/2β votes with a timestamp for tx smaller than rmin1. Allowing up to β replicas to equivocate, the adversary can obtain at most α/2 votes on tx with a timestamp smaller than rmin1, except if it forges a digital signature from an honest replica, which happens with negligible probability. In order to compute rconf2<rmin1 for tx, the adversary must include in Ctx2 timestamps smaller than rmin1 from at least α/2+1 replicas.

Now assume rmax1<rconf2. Using Lemma 20, Ctx1 can include at most αα/2β1 votes with a timestamp larger than rmax, hence the number of honest replicas, from which a vote with timestamp larger than rmax can be included in Ctx2 is at most αα/21 (since β are malicious). If α is odd, this upper bound becomes αα/21=α/2, while at least α/2+1 votes larger that rmax are required to compute a median larger than rmax, and if α is even, then αα/21=α/21, while at least α/2 votes larger that rmax are required to compute a median larger than rmax. (We remind that Algorithm 3 returns as median the value at position α/2). In either case, we get a contradiction, except for the negligible probability that the adversary forges a digital signature from an honest replica.

Algorithm 8 The 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒() function for Protocol pod-core (Protocol 1).
Lemma 26 (β-Accountable safety).

For the conditions stated in Theorem 15, Protocol 1 satisfies accountable safety (Definition 2) with resilience β, except with negligible probability.

Proof.

We show that 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒() (Algorithm 8) satisfies the correctness and no-framing properties required by Definition 2, in three steps.

1.

If the past-perfection safety property (Definition 11) is violated, there exists a partial transcript T, such that 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒() on input T returns at least β replicas.
Proof: We resume the proof of Lemma 24. There, we constructed sets 1,2, such that 12β+1. We saw that, for each Ri12, certificates tx1 contain the replica log shown in (1), containing all votes with timestamp up to tsi,kirperf. In a similar logic, certificates tx2 contains the following ki votes from Ri (possibly more, but we care for the votes up to transaction tx)

(txi,1,tsi,1,1,σi,1,Ri),(txi,2,tsi,2,2,σi,2,Ri),,(txi,ki,tsi,ki,ki,σi,ki,Ri), (3)

with txi,ki=tx and tsi,ki<rperf. Obviously, for an honest Ri, the replica logs of (1) and (3) must be identical, i.e., txi,j=txi,j and tsi,j=tsi,j, for j[1,min(ki,ki)]. We will show that they differ in at least one sequence number. If ki>ki, then the replica logs differ at sequence number ki, because the transaction txi,ki in (1) cannot be tx, as D1.T does not contain tx, and txi,ki=tx. If kiki, the log of (1) should be identical with the first ki positions of the log of (3), which would imply that tsi,ki=tsi,ki and, since a valid pod only accepts non-decreasing timestamps, tsi,kitsi,ki, and all together tsi,kitsi,ki. This is impossible, because tsi,ki>rperf and tsi,ki<rperf. Hence, the two logs will contain a different timestamp for some sequence number in [1,ki].

Summarizing, we have shown for at least β+1 replicas Ri12, certificate C1 and C2 contain votes (tx1,ts1,sn1,σ1,Ri) and (tx2,ts2,sn2,σ2,Ri), such that sn1=sn2 but tx1tx2 or ts1ts2. On input a set T that contains these votes, function 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒(T) returns 12.

2.

If the confirmation-bounds property (Definition 11) is violated, there exists a partial transcript T, such that Algorithm 8 on input T returns at least β replicas.
Proof: As in the proof of Lemma 25, assume the adversary outputs (D1,C1) and (D2,C2), such that valid(D1,C1)valid(D2,C2) and there exists a transaction tx such that (tx,rmin1,rmax1,rconf1)D1.T, (tx,rmin2,rmax2,rconf2)D2.T, and rmin1>rconf2rmax1<rconf2 Let C1=(Cpp1,tx1) and C2=(Cpp2,tx2), and Ctx1=tx1[tx] and Ctx2=tx2[tx].

Let’s take the case rmin1>rconf2 first. From Lemma 20 (timestamps contains at least nα/2+β timestamps ts such that tsrmin), there is a set 1 with at least nα/2+β replicas Ri, from each of which tx1 contains votes

(txi,1,tsi,1,1,σi,1,Ri),(txi,2,tsi,2,2,σi,2,Ri),,(txi,mi,tsi,mi,mi,σi,mi,Ri), (4)

up to some sequence number mi, such that tsi,mirmin and either txi,mi=tx (i.e., a vote from Ri on tx is included in Ctx1, and we only consider the votes up to this one), or txi,jtx,jmi (i.e., a vote from Ri on tx is not included in Ctx1, in which case timestamps contains the timestamp Ri has sent on txi,mitx).

Now, for a valid D2 to output rconf2<rmin1, certificate Ctx2 must contain timestamps smaller than rmin from at least α/2+1 replicas. Call this set 2. From each of these replicas, certificates tx2 must contain votes

(txi,1,tsi,1,1,σi,1,Ri),(txi,2,tsi,2,2,σi,2,Ri),,(tx,tsi,mi,mi,σi,mi,Ri), (5)

considering only votes up to tx, for which tsi,mi<rmin.

By counting arguments there are at least β+1 replicas in 12. For each one, we make the following argument. Since tsi,mirmin and tsi,mi<rmin, we get tsi,mi<tsi,mi, and it must be the case that mi<mi (otherwise, the two logs will differ at a smaller sequence number, similar to the previous case). But in this case the two logs differ at sequence number mi, i.e., txi,mitxi,mi=tx. This is because the log of (4) either does not contain tx, or contains it at sequence number mi>mi, in which case it must contain a different transaction at sequence number mi. On input a set T that contains all votes for replicas in 1 and 2 votes, function 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒(T) returns 12.

For the case rmax1<rconf2, similar arguments apply. In order to compute rconf2>rmax1, certificate Ctx2 must contain at least α/2 or α/2+1 (depending on the parity of α) votes on tx with timestamp larger than rmax. On the other hand, from Lemma 20 certificate Ctx1 contains at least nα+α/2+β votes on tx with a timestamp smaller or equal than rmax. As before, the replicas in the intersection of these two sets have sent conflicting votes for some sequence numbers.

3.

The 𝗂𝖽𝖾𝗇𝗍𝗂𝖿𝗒() function never outputs honest replicas.
Proof: The function only adds a replica to R~ if given as input two vote messages from that replica, where the same sequence number is assigned to two different votes (line 7 on Algorithm 8). An honest replica always increments nextsn after each vote it inserts to its log (line 21 on Algorithm 1), hence, the adversary can only construct valid votes by forging a signature under the public key of an honest replica, which happens with negl. probability.