Brief Announcement: Incrementally Verifiable Distributed Computation
Abstract
Incrementally verifiable computation () is a cryptographic scheme that allows a prover to certify the correctness of a long or ongoing computation in an incremental manner, by repeatedly updating a proof certifying the computation so far. Updating the proof does not require access to the entire trace of the computation, which makes the prover memory efficient.
In this work we construct incrementally verifiable distributed computation, which allows a distributed algorithm to efficiently certify its own execution using low memory and communication overhead. Our primary motivation is massively-parallel computation (MPC), where memory efficiency is make-or-break: the machines participating in an MPC algorithm usually cannot store the entire trace of their computation. Thus, certifying MPC algorithms essentially requires distributed .
At the heart of this work is a new abstraction, updatable batch arguments for (s), which we define and construct. Standard s allow one to prove a batch of -statements using a proof whose length barely grows with ; however, the statements and their witnesses must all be known in advance. In contrast, s support adding statements and witnesses on the fly, making them a flexible tool for constructing across different computational models. We use s to construct for streaming algorithms, for MPC algorithms, and for PRAM algorithms in the exclusive-read exclusive-write (EREW) model.
Keywords and phrases:
Incrementally verifiable computation, massively parallel computation, streaming, parallel RAM, batch arguments, SNARGFunding:
Eden Aldema Tshuva: Research supported by the Israeli Science Foundation, Grant No. 2338/23, and by AFOSR award FA9550-24-1-0156.Copyright and License:
2012 ACM Subject Classification:
Theory of computation Cryptographic protocolsEditor:
Dariusz R. KowalskiSeries and Publisher:
Leibniz International Proceedings in Informatics, Schloss Dagstuhl – Leibniz-Zentrum für Informatik
1 Introduction
Incrementally verifiable computation (), introduced by Valiant [15], enables a prover to generate a succinct proof that a long computation has been executed correctly, and update the proof incrementally as the computation progresses: given a proof that the first steps have been executed correctly (for some ), the prover can update it to obtain a proof that the first steps have been executed correctly, without having to store in memory the entire trace of the computation so far. This makes a natural fit for scenarios where long computations must be executed reliably over time: for example, resuming a paused computation from an intermediate verified state, or continuously auditing the correctness of outsourced computation performed by an untrusted server or cloud.
The incremental structure of is particularly well-suited to computations that are distributed or reactive in nature: where inputs arrive over time, or are jointly held by multiple parties that collaborate to carry out the computation. In this work we extend the scope of to encompass such distributed and reactive models of computation, bringing the benefits of incremental verification to a setting that arguably stands to gain from it the most. We construct for massively parallel computation (MPC), streaming algorithms and PRAM. Our main technical tool is updatable hash-and- for (s), a generic building block that we believe is of independent interest: it allows us to construct for models where we can prove the correctness of a single computation step.
IVC for reactive and distributed computation.
An scheme consists of a prover and a verifier. The prover is intended to run alongside the computation whose correctness it proves, so it is important for the prover to have low overhead in terms of space, and for distributed computations, also in terms of communication and rounds. At each point in time, the prover holds a proof that the computation has executed correctly so far, and as the computation proceeds, the prover updates the proof. The interface to the prover consists of a proof update procedure that takes a proof reflecting some prefix of computation steps, alongside the current state of the computation , and returns a new proof reflecting computation steps. The verifier is modeled as a sequential algorithm. Because the input to the system could be very large (e.g., in streaming or MPC algorithms), we do not assume that the verifier can store all of it, or even that the verifier can store a single global state of the system in its entirety. Instead, the verifier is presented with hashes of two states of the computation (respectively), a number of steps , and a proof , and it checks whether is a “convincing” proof that the computation indeed reaches after computation steps from . We use the short-hand notation “” for this statement. The notions of “states” and “computation steps” depends on the exact computation model (e.g., it can mean synchronous rounds, or a single step of a process).
The fact that the verifier is given hashes of the states instead of plaintext, presents some definitional subtleties, as one cannot reconstruct the original state from its hash value; technically, given and , the verifier does not even know what statement “” is being asserted. To resolve this we adopt definitions analogous to the one used for RAM delegation [11, 6], where the same issue arises. Informally, the distributed schemes that we design have the following essential properties:
-
Succinctness: the proof is short enough to store on a single machine.
-
Incremental completeness: for any system states and such that transitions to in one computation step, if the prover is given and a proof such that the verifier accepts as a proof for the statement , then the prover produces a proof for the statement “”, which is also accepted by the verifier.111Here, by “the verifier accepts for ” we mean it accepts where are the respective hash values of .
-
Computational soundness: no poly-size algorithm222That is, an algorithm that can be represented as a circuit with a polynomial number of wires. This is at least as strong as probabilistic polynomial-time Turing machines. can generate values , a step number and two proofs , such that , but the verifier accepts both the proof with and the proof with . Intuitively, this means that the verifier cannot be convinced of two “contradictory statements”, asserting that starting from some initial state (reflected by the hash ), after computation steps the system ends up in two different states (reflected by the hashes ).
The main and most challenging model we handle in this work is massively parallel computation (MPC) [7, 12], where space-bounded machines collaborate to compute over an input initially partitioned between them. Proving the correctness of MPC computations almost requires : non-incremental verification typically requires access to the entire trace of the computation at once, which in the MPC model no single machine can store. Thus, while efficient distributed provers have already been developed for other distributed models [1, 2], no such construction is known for MPC, even if we do not insist on and are willing to settle for a non-incremental construction. Thus, our construction of for MPC addresses not only the problem of incrementality but also the more basic problem of proving the correctness of massively parallel computation.
We consider two use cases. (1) Reliable cloud delegation: a user with input outsources a heavy computation to a server farm or cloud provider, which returns both the output and a short correctness certificate. The user (a single weak machine) hashes once, never rereads it, and verifies the result in polylogarithmic time in . (2) Internal MPC verification: the network itself verifies correctness so far (e.g., to detect faulty machines). Our distributed IVC maintains a short, continuously updatable certificate that any machine can use to verify locally against its own input. This resembles proof labeling schemes [13] but with polylogarithmic, rather than overall linear proof growth, and with each machine verifying independently without communication.
Our framework for constructing is modular and generic: we are able to construct for practically any model of deterministic computation for which we can prove the correctness of a single computation step. We demonstrate this by constructing, in addition to the for MPC discussed above, for streaming algorithms, where a low-space single machine processes a stream of elements that arrive over time and cannot all be stored at once, and for PRAM algorithms in the exclusive-read exclusive-write model (EREW), which captures parallel algorithms in shared memory. While for streaming algorithms, proving the correctness of a single computation step is trivial (as the step itself is represented succinctly by the state transition and the stream element), for the PRAM and MPC models we use cryptographic proof systems called succinct non-interactive arguments (s): essentially, these are the non-incremental analog of . Specifically, for PRAM we use the existing for PRAM of [9]. For MPC, no such construction is known, so we first construct a for one-round MPC, and then lift it into full-fledged for MPC. Unlike some commonly used heuristically sound s (s of knowledge) and [3, 10], all of our constructions are sound under standard cryptographic assumptions.
Our main building block: updatable hash-and- for (s).
Proving that a computation is correct boils down to proving the conjunction of statements: “for each , the system transitions from state to state in one step”. In existing constructions of (non-incremental) from standard cryptographic assumptions [6, 16, 4], this is done using two cryptographic tools: batch arguments (s) for and hash families with local openings (e.g., Merkle trees). Informally, a for an -language allows us to prove the conjunction of statements, each of the form “”, using a proof whose length grows linearly with the length of a single -witness, and only polylogarithmically with the number of statements . A hash family with local openings allows us to hash an -sized vector to a short hash value , and in addition, given an index , to produce a short opening to the -th index. Given only , one can verify that is indeed the -th entry of the vector whose hash is .
In prior constructions, to prove (non-incrementally) that , the prover hashes the vector using a hash with local openings to obtain a hash value . Then it constructs a asserting that for each , there exist states and openings such that opens to in positions (respectively), and transitions to in one step. Here, the states and the openings serve as an -witness for the statement “the -th step is reflected correctly in the hash ”.
When incrementally proving the correctness of a reactive or distributed computation, we do not know in advance what statements the prover will need to prove, as the state that the system will reach depends on the future inputs or messages. Thus, we cannot lay out the entire computation trace in advance, hash it, and prepare a proof. To overcome this, we design a scheme we call updatable hash-and- (), which imitates the above hash-and- paradigm while allowing both the hash and the to be constructed incrementally, together. This scheme enables us to update a hash value and a proof for a conjunction of -statements on-the-fly, without advance knowledge. To use our to construct , we must overcome another difficulty, which is that without having the entire trace in advance, we cannot compute the openings that serve as -witnesses even for the entries we already have. We show that we can compute the required openings in hindsight, using properties of tree-based hash families with local openings. Our techniques are inspired by the recent works on IVC for sequential deterministic computation [14, 8].
2 Brief Preliminaries
The common reference string model and computational hardness.
Our work is set in the common reference string (CRS) model. In this model, all parties have access to a string that is sampled randomly by a trusted setup process, denoted by , which takes a security parameter . (This can be viewed as public randomness.) The security parameter governs the computational resources that must be invested to break the security of the protocol: we say that a task that involves the CRS is computationally hard if given , no poly-size (in ) adversary can succeed in the task, except with negligible probability in .
Batch arguments for (s).
A batch argument () [5] allows a prover to succinctly prove the conjunction of statements, where the size of the proof barely grows with , and is similar to the size of one witness. The interface is as follows:
-
: takes a reference string , a machine , instances , and witnesses , and outputs a proof .
-
: takes a reference string , a machine , and a proof and outputs an acceptance bit .
We say a is somewhere extractable if it allows the extraction of one witness from a convincing proof , as follows:
-
The generation procedure may be called in trapdoor mode. In trapdoor mode, takes as additional input an index , called the binding index. It outputs a pair , where is a trapdoor that can later be used to recover the -th witness. In trapdoor mode, the procedure has a property called index hiding: given (without ), it is computationally hard to find the binding index .
-
The has the somewhere argument of knowledge property: There exists an efficient auxiliary extraction procedure, , which satisfies the following. Suppose we call in trapdoor mode with a binding index , and obtain . Given only , it is computationally hard to find a proof that is accepted by the verifier, such that when we extract a witness using , we have .
3 Technical Overview
We give an overview of our distributed constructions, with emphasis on the MPC model. Our framework for constructing is generic and quite simple once we have (1) a for one-step computations in the model, and (2) an updatable hash-and- scheme.
3.1 Defining and Using Updatable Hash-and-
An updatable hash-and- () is defined with respect to some hash family with local openings. It consists of three algorithms, , where is a standard CRS generation algorithm, and are update and verification algorithms, respectively. The syntax for the update and verification algorithms is as follows:
-
: takes as input a hash key , a common reference string , a Turing machine , a hash value , a proof , and a new statement and witness , and outputs a hash value and a new proof .
-
: takes a hash key , a common reference string , a Turing machine , a hash value , and proof , and outputs an acceptance bit .
Our satisfies the standard succinctness and index hiding properties of s (see Section˜2), but it has stronger completeness and argument of knowledge properties:
-
Incremental completeness: if accepts , and , then it also accepts , where .
-
Somewhere argument of knowledge: upon using the trapdoor version of , with binding index , the extractor extracts not only an instance-witness pair , but also an opening proving that indeed opens to in the index .
Supporting consistency checks.
Our requires the ability to claim that two extracted instances are consistent with each other, for a definition of “consistent” that is supplied by the user. To that end, we extend the syntax above to feed the update and verification algorithms additional inputs: a Turing machine specifying the consistency check, and a “last instance” . Our incremental completeness guarantee in this case holds whenever . The extractor of the somewhere argument of knowledge guarantee now additionally extracts a previous instance and a respective opening, such that: (1) opens to in location and this is proved by said opening, and (2) .
From to .
We now aim to incrementally certify the correctness of execution of an ongoing computation, denote it by , where we wish the proof updating procedure to be done in the same model as . Given a for which prover’s run in the same model, the provides the required building block fairly directly. Let be a scheme in which we are able to prove (within the computation model) the correctness of one step . Let be the non-deterministic machine which verifies the proof. That is, on inputs , interprets as , and as a -proof for the transition , then it applies the verifier and accepts or rejects accordingly.
The prover runs alongside and updates an proof for the machine , and whenever the algorithm transitions from state to state , it uses to prove and then updates with the instance-witness pair . We use consistency checks to ensure that every two consecutive statements overlap on their last and first states, respectively, to prevent a situation where we correctly assert that “” and then “”, but , so we do not truly prove that . Consistency checks allow us to force , so that the conjunction of all statements together asserts the correctness of the entire multi-step computation from the initial state to the current one.
3.2 for One-Round Massively Parallel Computation
Our generic “-to- via ” method can lift a for one computation step in a computational model into a full for that model. However, for the MPC model, no (even for a single round) was known prior to our work. We outline our construction of such a , using s again.
One MPC round as a RAM program.
We observe that one round of MPC on machines can be described as a RAM program, which takes a vector of the machines’ initial states , and outputs the machines’ states in the end of the round . Each state or is an -bit vector, where is the space bound of an individual machine. To construct a for one-round-MPC, we imitate a for the program above. However, while a RAM program is executed on a single machine that can access any place in its random-access memory, in the MPC model, the “memory” is partitioned across the machines. Fortunately, existing RAM s have the property that constructing the proof does not require access to the entire memory configuration: it is enough to have a hash with local openings of the memory, and openings to the locations that are accessed by the algorithm in each step. Thus, to construct our desired RAM--like proof for the MPC model, we need to go through the following three stages: (1) Obtain a hash of the state vector ; (2) For each machine , obtain openings of the above hash value to the messages (where ) that machine receives during the round333We assume for simplicity that the messages each machine sends are stored as part of its state at the beginning of the round. ; and (3) Using the openings, construct a proof which proves the transition . The main challenge in this scheme is that each stage must be implemented in the MPC network: we do not truly have random access to the state assignments, because these are actual states of individual machines. For all three stages, our solution is based on having the machines simulate some process on a tree-structured network. This network is an -ary tree with leaves which represent the states of the actual machines, and the rest of the nodes are virtual nodes, simulated by the real machines.
Using a virtual tree-structured network.
To obtain a hash of the state assignment , we aggregate the hash up the tree: the leaves send their state to their parents, and each inner node, upon receiving values from its children, hashes the values it received and sends them up to its parent. The root of the tree then obtains a hash of the entire state assignment. In order for each machine to obtain an opening to its state , we proceed this time down the tree, with each inner node receiving from its parent a partial opening down to its index, extending it to an opening for each of its children’s indices, and sending each extended opening to the corresponding child. Each inner node is able to extend the opening because it is the one that hashed all of its children’s values together. Eventually, each machine receives from its parent a complete opening down to index . Finally, we construct a proof for the alleged RAM computation . To do so, we first observe that this transition is defined by separate computations, and for each , we prove that when the network state assignment is , the next state of machine is . Each such statement can be proved by a computed at machine , as follows. Let be a machine that sends message to machine during the round. Recall that after the previous stage, machine has an opening from the global hash to its state . Machine now computes an opening from to and sends this opening to machine .Each machine, upon receiving these openings, uses a RAM to prove that its transition is legal.
The remaining challenge is to aggregate the individual proofs of the machines into one global succinct proof while maintaining soundness. To do this we use the virtual network again: we proceed up the tree, with each node sending its current proof up to its parent. Upon receiving the proofs from its children, each inner node uses an to obtain a proof of the conjunction of its childrens’ statements. Finally, at the root of the tree, we obtain our one succinct proof for the entire transition .
References
- [1] Eden Aldema Tshuva, Elette Boyle, Ran Cohen, Tal Moran, and Rotem Oshman. Locally verifiable distributed SNARGs. In TCC, pages 65–90. Springer, 2023. doi:10.1007/978-3-031-48615-9_3.
- [2] Eden Aldema Tshuva and Rotem Oshman. Fully Local Succinct Distributed Arguments. In DISC, pages 1:1–1:24. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2024. doi:10.4230/LIPICS.DISC.2024.1.
- [3] Nir Bitansky, Ran Canetti, Alessandro Chiesa, and Eran Tromer. Recursive composition and bootstrapping for snarks and proof-carrying data. In STOC, pages 111–120, 2013. doi:10.1145/2488608.2488623.
- [4] Arka Rai Choudhuri, Sanjam Garg, Abhishek Jain, Zhengzhong Jin, and Jiaheng Zhang. Correlation intractability and snargs from sub-exponential ddh. In Crypto, pages 635–668. Springer, 2023. doi:10.1007/978-3-031-38551-3_20.
- [5] Arka Rai Choudhuri, Abhishek Jain, and Zhengzhong Jin. Non-interactive batch arguments for NP from standard assumptions. In Annual International Cryptology Conference, pages 394–423. Springer, 2021. doi:10.1007/978-3-030-84259-8_14.
- [6] Arka Rai Choudhuri, Abhishek Jain, and Zhengzhong Jin. SNARGs for P from LWE. In FOCS, pages 68–79, 2021.
- [7] Jeffrey Dean and Sanjay Ghemawat. Mapreduce: simplified data processing on large clusters. Communications of the ACM, 51(1):107–113, 2008. doi:10.1145/1327452.1327492.
- [8] Lalita Devadas, Rishab Goyal, Yael Kalai, and Vinod Vaikuntanathan. Rate-1 non-interactive arguments for batch-NP and applications. In FOCS, pages 1057–1068, 2022. doi:10.1109/FOCS54457.2022.00103.
- [9] Cody Freitag, Rafael Pass, and Naomi Sirkin. Parallelizable delegation from LWE. In TCC, pages 623–652, 2022. doi:10.1007/978-3-031-22365-5_22.
- [10] Jens Groth. On the size of pairing-based non-interactive arguments. In Annual international conference on the theory and applications of cryptographic techniques, pages 305–326. Springer, 2016. doi:10.1007/978-3-662-49896-5_11.
- [11] Yael Kalai and Omer Paneth. Delegating ram computations. In TCC, pages 91–118. Springer, 2016.
- [12] Howard Karloff, Siddharth Suri, and Sergei Vassilvitskii. A model of computation for mapreduce. In SODA, pages 938–948. SIAM, 2010. doi:10.1137/1.9781611973075.76.
- [13] Amos Korman, Shay Kutten, and David Peleg. Proof labeling schemes. In PODC, pages 9–18, 2005. doi:10.1145/1073814.1073817.
- [14] Omer Paneth and Rafael Pass. Incrementally verifiable computation via rate-1 batch arguments. In FOCS, pages 1045–1056, 2022. doi:10.1109/FOCS54457.2022.00102.
- [15] Paul Valiant. Incrementally verifiable computation or proofs of knowledge imply time/space efficiency. In TCC, pages 1–18. Springer, 2008. doi:10.1007/978-3-540-78524-8_1.
- [16] Brent Waters and David J Wu. Batch arguments for NP and more from standard bilinear group assumptions. In Crypto, pages 433–463. Springer, 2022. doi:10.1007/978-3-031-15979-4_15.
