Documentation

ArkLib.OracleReduction.Composition.Virtual

Semantics of Virtual (Oracle) Reductions #

Sequential composition is usually not enough to represent oracle reductions in a modular way. We also need to formalize virtual oracle reductions, which lift reductions from one (virtual) context into the another (real) context.

This is what is meant when we informally say "apply so-and-so protocol to this quantity (derived from the input statement & witness)".

structure TransportStatement (StmtIn StmtOut StmtIn' StmtOut' : Type) :
  • fStmtIn : StmtInStmtIn'
  • fStmtOut : StmtIn × StmtOut'StmtOut
Instances For
    structure TransportWitness (WitIn WitOut WitIn' WitOut' : Type) :
    • fWitIn : WitInWitIn'
    • fWitOut : WitIn × WitOut'WitOut
    Instances For
      structure TransportData (StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type) extends TransportStatement StmtIn StmtOut StmtIn' StmtOut', TransportWitness WitIn WitOut WitIn' WitOut' :
      Instances For
        structure TransportStatementInv (StmtIn StmtOut StmtIn' StmtOut' : Type) :
        • fStmtInInv : StmtOut × StmtIn'StmtIn
        • fStmtOutInv : StmtOutStmtOut'
        Instances For
          structure TransportWitnessInv (WitIn WitOut WitIn' WitOut' : Type) :
          • fWitInInv : WitOut × WitIn'WitIn
          • fWitOutInv : WitOutWitOut'
          Instances For
            structure TransportDataInv (StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type) extends TransportStatementInv StmtIn StmtOut StmtIn' StmtOut', TransportWitnessInv WitIn WitOut WitIn' WitOut' :
            Instances For
              structure TransportDataComplete (StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type) (relIn : StmtInWitInProp) (relIn' : StmtIn'WitIn'Prop) (relOut : StmtOutWitOutProp) (relOut' : StmtOut'WitOut'Prop) extends TransportData StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' :

              Conditions for the transformation to preserve completeness

              NOTE: this is not the correct condition for now (see example)

              • fStmtIn : StmtInStmtIn'
              • fStmtOut : StmtIn × StmtOut'StmtOut
              • fWitIn : WitInWitIn'
              • fWitOut : WitIn × WitOut'WitOut
              • relIn_implies (stmtIn : StmtIn) (witIn : WitIn) : relIn stmtIn witInrelIn' (self.fStmtIn stmtIn) (self.fWitIn witIn)
              • relOut_implied_by (stmtIn : StmtIn) (witIn : WitIn) (stmtOut' : StmtOut') (witOut' : WitOut') : relIn stmtIn witInrelOut' stmtOut' witOut'relOut (self.fStmtOut (stmtIn, stmtOut')) (self.fWitOut (witIn, witOut'))
              Instances For
                structure TransportDataSound (StmtIn StmtOut StmtIn' StmtOut' : Type) (langIn : Set StmtIn) (langOut : Set StmtOut) (langIn' : Set StmtIn') (langOut' : Set StmtOut') extends TransportStatement StmtIn StmtOut StmtIn' StmtOut', TransportStatementInv StmtIn StmtOut StmtIn' StmtOut' :
                Instances For
                  structure TransportDataKnowledgeSound (StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type) (relIn : StmtInWitInProp) (relIn' : StmtIn'WitIn'Prop) (relOut : StmtOutWitOutProp) (relOut' : StmtOut'WitOut'Prop) extends TransportData StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut', TransportDataInv StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' :
                  Instances For
                    def Prover.transport {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type} (data : TransportData StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut') (P : Prover pSpec oSpec StmtIn' WitIn' StmtOut' WitOut') :
                    Prover pSpec oSpec StmtIn WitIn StmtOut WitOut

                    How does the prover change? Only in input & output, and keep around the input statement & witness

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      def Verifier.transport {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {StmtIn StmtOut StmtIn' StmtOut' : Type} (data : TransportStatement StmtIn StmtOut StmtIn' StmtOut') (V : Verifier pSpec oSpec StmtIn' StmtOut') :
                      Verifier pSpec oSpec StmtIn StmtOut
                      Equations
                      • One or more equations did not get rendered due to their size.
                      Instances For
                        def Reduction.transport {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type} (data : TransportData StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut') (R : Reduction pSpec oSpec StmtIn' WitIn' StmtOut' WitOut') :
                        Reduction pSpec oSpec StmtIn WitIn StmtOut WitOut
                        Equations
                        Instances For
                          def StraightlineExtractor.transport {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type} (data : TransportData StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut') (dataInv : TransportDataInv StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut') (E : Reduction.StraightlineExtractor) :
                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For
                            theorem Prover.run_transport {n : } {pSpec : ProtocolSpec n} {ι : Type} [DecidableEq ι] {oSpec : OracleSpec ι} {StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type} [(i : pSpec.ChallengeIndex) → VCVCompatible (pSpec.Challenge i)] [oSpec.FiniteRange] {data : TransportData StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut'} {stmtIn : StmtIn} {witIn : WitIn} (P : Prover pSpec oSpec StmtIn' WitIn' StmtOut' WitOut') :
                            run stmtIn witIn (transport data P) = do let __discrrun (data.fStmtIn stmtIn) (data.fWitIn witIn) P match __discr with | (stmtOut, witOut, fullTranscript) => pure (data.fStmtOut (stmtIn, stmtOut), data.fWitOut (witIn, witOut), fullTranscript)
                            theorem Reduction.run_transport {n : } {pSpec : ProtocolSpec n} {ι : Type} [DecidableEq ι] {oSpec : OracleSpec ι} {StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type} [(i : pSpec.ChallengeIndex) → VCVCompatible (pSpec.Challenge i)] [oSpec.FiniteRange] {data : TransportData StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut'} {stmtIn : StmtIn} {witIn : WitIn} (R : Reduction pSpec oSpec StmtIn' WitIn' StmtOut' WitOut') :
                            run stmtIn witIn (transport data R) = do let __discrrun (data.fStmtIn stmtIn) (data.fWitIn witIn) R match __discr with | ((prvStmtOut, witOut), verStmtOut, fullTranscript) => pure ((data.fStmtOut (stmtIn, prvStmtOut), data.fWitOut (witIn, witOut)), data.fStmtOut (stmtIn, verStmtOut), fullTranscript)
                            theorem Reduction.runWithLog_transport {n : } {pSpec : ProtocolSpec n} {ι : Type} [DecidableEq ι] {oSpec : OracleSpec ι} {StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type} [(i : pSpec.ChallengeIndex) → VCVCompatible (pSpec.Challenge i)] [oSpec.FiniteRange] {data : TransportData StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut'} {stmtIn : StmtIn} {witIn : WitIn} (R : Reduction pSpec oSpec StmtIn' WitIn' StmtOut' WitOut') :
                            runWithLog stmtIn witIn (transport data R) = do let __discrrunWithLog (data.fStmtIn stmtIn) (data.fWitIn witIn) R match __discr with | ((prvStmtOut, witOut), verStmtOut, fullTranscript, queryLog) => pure ((data.fStmtOut (stmtIn, prvStmtOut), data.fWitOut (witIn, witOut)), data.fStmtOut (stmtIn, verStmtOut), fullTranscript, queryLog)
                            theorem Reduction.transport_completeness {n : } {pSpec : ProtocolSpec n} {ι : Type} [DecidableEq ι] {oSpec : OracleSpec ι} {StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type} [(i : pSpec.ChallengeIndex) → VCVCompatible (pSpec.Challenge i)] [oSpec.FiniteRange] {relIn : StmtInWitInProp} {relOut : StmtOutWitOutProp} {relIn' : StmtIn'WitIn'Prop} {relOut' : StmtOut'WitOut'Prop} {completenessError : NNReal} (data : TransportDataComplete StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' relIn relIn' relOut relOut') (R : Reduction pSpec oSpec StmtIn' WitIn' StmtOut' WitOut') (h : completeness relIn' relOut' R completenessError) :
                            completeness relIn relOut (transport data.toTransportData R) completenessError

                            Informally, if (stmtIn, witIn) ∈ relIn, we want (stmtIn', witIn') ∈ relIn'. Using the completeness guarantee, we get that (stmtOut', witOut') ∈ relOut'. From these, we need to deduce that (stmtOut, witOut) ∈ relOut.

                            theorem Reduction.transport_soundness {n : } {pSpec : ProtocolSpec n} {ι : Type} [DecidableEq ι] {oSpec : OracleSpec ι} {StmtIn StmtOut StmtIn' StmtOut' : Type} [(i : pSpec.ChallengeIndex) → VCVCompatible (pSpec.Challenge i)] [oSpec.FiniteRange] {langIn : Set StmtIn} {langOut : Set StmtOut} {langIn' : Set StmtIn'} {langOut' : Set StmtOut'} {soundnessError : NNReal} (data : TransportDataSound StmtIn StmtOut StmtIn' StmtOut' langIn langOut langIn' langOut') (V : Verifier pSpec oSpec StmtIn' StmtOut') (h : soundness langIn' langOut' V soundnessError) :
                            soundness langIn langOut (Verifier.transport data.toTransportStatement V) soundnessError
                            theorem Reduction.transport_knowledgeSoundness {n : } {pSpec : ProtocolSpec n} {ι : Type} [DecidableEq ι] {oSpec : OracleSpec ι} {StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' : Type} [(i : pSpec.ChallengeIndex) → VCVCompatible (pSpec.Challenge i)] [oSpec.FiniteRange] {relIn : StmtInWitInProp} {relOut : StmtOutWitOutProp} {relIn' : StmtIn'WitIn'Prop} {relOut' : StmtOut'WitOut'Prop} {soundnessError : NNReal} (data : TransportDataKnowledgeSound StmtIn WitIn StmtOut WitOut StmtIn' WitIn' StmtOut' WitOut' relIn relIn' relOut relOut') (V : Verifier pSpec oSpec StmtIn' StmtOut') (h : knowledgeSoundness relIn' relOut' V soundnessError) :
                            knowledgeSoundness relIn relOut (Verifier.transport data.toTransportStatement V) soundnessError
                            Equations
                            Instances For
                              Equations
                              Instances For
                                def relIn :
                                StmtInUnitProp
                                Equations
                                Instances For
                                  def relIn' :
                                  StmtIn'UnitProp
                                  Equations
                                  Instances For
                                    Equations
                                    Instances For
                                      def relOut :
                                      StmtOutUnitProp
                                      Equations
                                      Instances For
                                        def relOut' :
                                        Equations
                                        Instances For
                                          Equations
                                          • One or more equations did not get rendered due to their size.
                                          Instances For