def simulated_set(ss, vv, key, value): state = schema_pb2.ImmutableState() state.ParseFromString(base64.b64decode(ss)) verifiableTx = schema_pb2.VerifiableTx() verifiableTx.ParseFromString(base64.b64decode(vv)) tx = schema.TxFromProto(verifiableTx.tx) entrySpecDigest = store.EntrySpecDigestFor(tx.header.version) inclusionProof = tx.Proof(database.EncodeKey(key)) md = tx.entries[0].metadata() if md != None and md.Deleted(): raise ErrCorruptedData e = database.EncodeEntrySpec(key, md, value) verifies = store.VerifyInclusion(inclusionProof, entrySpecDigest(e), tx.header.eh) assert verifies assert tx.header.eh == schema.DigestFromProto( verifiableTx.dualProof.targetTxHeader.eH) sourceID = state.txId sourceAlh = schema.DigestFromProto(state.txHash) targetID = tx.header.iD targetAlh = tx.header.Alh() if state.txId > 0: assert store.VerifyDualProof( schema.DualProofFromProto(verifiableTx.dualProof), sourceID, targetID, sourceAlh, targetAlh, )
def call(service: schema_pb2_grpc.ImmuServiceStub, rs: RootService, zset: bytes, score: float, key: bytes, atTx: int = 0, verifying_key=None): state = rs.get() request = schema_pb2.VerifiableZAddRequest( zAddRequest=schema_pb2.ZAddRequest( set=zset, score=score, key=key, atTx=atTx, ), proveSinceTx=state.txId) vtx = service.VerifiableZAdd(request) if vtx.tx.header.nentries != 1: raise ErrCorruptedData tx = schema.TxFromProto(vtx.tx) entrySpecDigest = store.EntrySpecDigestFor(tx.header.version) ekv = database.EncodeZAdd(zset, score, key, atTx) inclusionProof = tx.Proof(ekv.key) verifies = store.VerifyInclusion(inclusionProof, entrySpecDigest(ekv), tx.header.eh) if not verifies: raise ErrCorruptedData if tx.header.eh != schema.DigestFromProto(vtx.dualProof.targetTxHeader.eH): raise ErrCorruptedData sourceID = state.txId sourceAlh = schema.DigestFromProto(state.txHash) targetID = tx.header.iD targetAlh = tx.header.Alh() if state.txId > 0: verifies = store.VerifyDualProof( schema.DualProofFromProto(vtx.dualProof), sourceID, targetID, sourceAlh, targetAlh, ) if not verifies: raise ErrCorruptedData newstate = State( db=state.db, txId=targetID, txHash=targetAlh, publicKey=vtx.signature.publicKey, signature=vtx.signature.signature, ) if verifying_key != None: newstate.Verify(verifying_key) rs.set(newstate) return datatypes.SetResponse( id=vtx.tx.header.id, verified=True, )
def call(service: schema_pb2_grpc.ImmuServiceStub, rs: RootService, refkey: bytes, key: bytes, atTx=0, verifying_key=None): state = rs.get() req = schema_pb2_grpc.schema__pb2.ReferenceRequest(referencedKey=refkey, key=key, atTx=atTx, boundRef=atTx > 0) vreq = schema_pb2_grpc.schema__pb2.VerifiableReferenceRequest( referenceRequest=req, proveSinceTx=state.txId) vtx = service.VerifiableSetReference(vreq) if vtx.tx.header.nentries != 1: raise ErrCorruptedData tx = schema.TxFromProto(vtx.tx) entrySpecDigest = store.EntrySpecDigestFor(tx.header.version) inclusionProof = tx.Proof(database.EncodeKey(key)) e = database.EncodeReference(key, None, refkey, atTx) verifies = store.VerifyInclusion(inclusionProof, entrySpecDigest(e), tx.header.eh) if not verifies: raise ErrCorruptedData sourceID = state.txId sourceAlh = schema.DigestFromProto(state.txHash) targetID = tx.header.iD targetAlh = tx.header.Alh() if state.txId > 0: verifies = store.VerifyDualProof( schema.DualProofFromProto(vtx.dualProof), sourceID, targetID, sourceAlh, targetAlh, ) if not verifies: raise ErrCorruptedData newstate = State( db=state.db, txId=targetID, txHash=targetAlh, publicKey=vtx.signature.publicKey, signature=vtx.signature.signature, ) if verifying_key != None: newstate.Verify(verifying_key) rs.set(newstate) return datatypes.SetResponse( id=vtx.tx.header.id, verified=True, )
def test_printable(): verifiableTx = schema_pb2.VerifiableTx() verifiableTx.ParseFromString(base64.b64decode(v2)) tx = schema.TxFromProto(verifiableTx.tx) s = repr(tx) assert type(s) == str txm = schema_pb2.TxMetadata() txm.ParseFromString(base64.b64decode(md0)) s = repr(txm) assert type(s) == str q = printable() q.a = [b'1', b'2'] dummy = str(q) assert dummy == 'class printable\n\ta:\n\t- [49]\n\t- [50]\n'
def test_verify_inclusion(): key = b"salacadula" value = b"magicabula" vtx = schema_pb2.Tx() vtx.ParseFromString(base64.b64decode(v0)) tx = schema.TxFromProto(vtx) entrySpecDigest = store.EntrySpecDigestFor(tx.header.version) inclusionProof = tx.Proof(database.EncodeKey(key)) md = tx.entries[0].metadata() if md != None and md.Deleted(): raise ErrCorruptedData e = database.EncodeEntrySpec(key, md, value) verifies = store.VerifyInclusion(inclusionProof, entrySpecDigest(e), tx.header.eh) assert verifies
def call(service: schema_pb2_grpc.ImmuServiceStub, rs: RootService, key: bytes, value: bytes, verifying_key=None, metadata=None): schemaMetadata = MetadataToProto(metadata) state = rs.get() # print(base64.b64encode(state.SerializeToString())) kv = schema_pb2.KeyValue(key=key, value=value, metadata=schemaMetadata) rawRequest = schema_pb2.VerifiableSetRequest( setRequest=schema_pb2.SetRequest(KVs=[kv]), proveSinceTx=state.txId, ) verifiableTx = service.VerifiableSet(rawRequest) # print(base64.b64encode(verifiableTx.SerializeToString())) if verifiableTx.tx.header.nentries != 1 or len( verifiableTx.tx.entries) != 1: raise ErrCorruptedData tx = schema.TxFromProto(verifiableTx.tx) entrySpecDigest = store.EntrySpecDigestFor(tx.header.version) inclusionProof = tx.Proof(database.EncodeKey(key)) md = tx.entries[0].metadata() if md != None and md.Deleted(): raise ErrCorruptedData e = database.EncodeEntrySpec(key, md, value) verifies = store.VerifyInclusion(inclusionProof, entrySpecDigest(e), tx.header.eh) if not verifies: raise ErrCorruptedData if tx.header.eh != schema.DigestFromProto( verifiableTx.dualProof.targetTxHeader.eH): raise ErrCorruptedData sourceID = state.txId sourceAlh = schema.DigestFromProto(state.txHash) targetID = tx.header.iD targetAlh = tx.header.Alh() if state.txId > 0: verifies = store.VerifyDualProof( schema.DualProofFromProto(verifiableTx.dualProof), sourceID, targetID, sourceAlh, targetAlh, ) if not verifies: raise ErrCorruptedData newstate = State( db=state.db, txId=targetID, txHash=targetAlh, publicKey=verifiableTx.signature.publicKey, signature=verifiableTx.signature.signature, ) if verifying_key != None: newstate.Verify(verifying_key) rs.set(newstate) return datatypes.SetResponse( id=verifiableTx.tx.header.id, verified=verifies, )