Skip to content

Commit

Permalink
[ATL-1774] feat(iris): Define Castor and Pollux specific protobuf mod…
Browse files Browse the repository at this point in the history
…els (#41)

* [ATL-1774] feat(iris): Define Castor and Pollux specific protobuf models. Also Iris service protobuf
  • Loading branch information
pva701 committed Sep 29, 2022
1 parent 71b7116 commit 0b1b089
Show file tree
Hide file tree
Showing 10 changed files with 226 additions and 28 deletions.
9 changes: 9 additions & 0 deletions iris/api/grpc/README.md
@@ -0,0 +1,9 @@
## gRPC API ##

We use gRPC messages for both: interactions with Iris, and also to serialise messages which reside in the DLT.

`protocol` folder contains only definitions which are posted to the DLT and
basically define low-level protocol operations.

Files outside the `protocol` folder describe messages and services which are used in gRPC interface of Iris,
using protocol messages in their definitions.
22 changes: 0 additions & 22 deletions iris/api/grpc/iris_api.proto

This file was deleted.

95 changes: 95 additions & 0 deletions iris/api/grpc/protocol/did_operations.proto
@@ -0,0 +1,95 @@
syntax = "proto3";

import "scalapb/scalapb.proto";

option (scalapb.options) = {
no_default_values_in_constructor: true
package_name: "io.iohk.atala.iris.proto"
};

message PublicKeyJwk {
message ECKeyData {
string curve = 1; // The curve name, like secp256k1.
bytes x = 2; // The x coordinate, represented as bytes.
bytes y = 3; // The y coordinate, represented as bytes.
}

oneof key {
ECKeyData ec_key = 1;
}
}

message DocumentDefinition {
message PublicKey {
string id = 1;

enum Type {
SECP256K1 = 0;
}
Type type = 2;

PublicKeyJwk jwk = 3;

enum Purpose {
AUTHENTICATION = 0;
KEY_AGREEMENT = 1;
ASSERTION_METHOD = 2;
CAPABILITY_INVOCATION = 3;
}
Purpose purpose = 4;
}

message Service {
string id = 1;
enum Type {
MEDIATOR_SERVICE = 0;
}
Type type = 2;
string service_endpoint = 3;
}

repeated PublicKey public_keys = 1;
repeated Service services = 2;
}

message CreateDid {
bytes initial_update_commitment = 1;
bytes initial_recovery_commitment = 2;
string storage = 3;
DocumentDefinition document = 4;
}

message UpdateDid {
message Patch {
oneof patch {
DocumentDefinition.PublicKey add_public_key = 1;
string remove_public_key = 2;
DocumentDefinition.Service add_service = 3;
string remove_service = 4;
}
}

string did = 1;
bytes revealed_update_key = 2;
bytes previous_version = 3;
bytes forward_update_commitment = 4;
repeated Patch patches = 5;
bytes signature = 6;
}

message RecoverDid {
string did = 1;
bytes revealed_recovery_key = 2;
bytes previous_version = 3;
bytes forward_update_commitment = 4;
bytes forward_recovery_commitment = 5;
repeated DocumentDefinition document = 6;
bytes signature = 7;
}

message DeactivateDid {
string did = 1;
bytes revealed_recovery_key = 2;
bytes previous_version = 3;
bytes signature = 4;
}
37 changes: 37 additions & 0 deletions iris/api/grpc/protocol/dlt.proto
@@ -0,0 +1,37 @@
syntax = "proto3";

import "scalapb/scalapb.proto";
import "protocol/vc_operations.proto";
import "protocol/did_operations.proto";

option (scalapb.options) = {
no_default_values_in_constructor: true
package_name: "io.iohk.atala.iris.proto"
};

// The possible operations affecting the blockchain.
message IrisOperation {
// The actual operation.
oneof operation {
// Used to create a public DID.
CreateDid create_did = 1;

// Used to update an existing public DID.
UpdateDid update_did = 2;

// Used to recover an existing public DID.
RecoverDid recover_did = 3;

// Used to deactivate DID
DeactivateDid deactivate_did = 4;

IssueCredentialsBatch issue_credentials_batch = 5;

RevokeCredentials revoke_credentials = 6;
};
}

// List of operations which will be stored in the blockchain transaction metadata
message AtalaObject {
repeated IrisOperation operations = 1;
}
19 changes: 19 additions & 0 deletions iris/api/grpc/protocol/vc_operations.proto
@@ -0,0 +1,19 @@
syntax = "proto3";

import "scalapb/scalapb.proto";

option (scalapb.options) = {
no_default_values_in_constructor: true
package_name: "io.iohk.atala.iris.proto"
};

message IssueCredentialsBatch {
string issuer_did = 1;
bytes merkle_root = 2;
}

message RevokeCredentials {
string revoker_did = 1;
bytes issuance_batch_digest = 2;
repeated bytes credentials_to_revoke = 3;
}
41 changes: 41 additions & 0 deletions iris/api/grpc/service.proto
@@ -0,0 +1,41 @@
syntax = "proto3";

import "scalapb/scalapb.proto";
import "protocol/did_operations.proto";
import "protocol/vc_operations.proto";
import "protocol/dlt.proto";

option (scalapb.options) = {
no_default_values_in_constructor: true
package_name: "io.iohk.atala.iris.proto"
};

message IrisOperationId {
bytes id = 1;
}

message IrisOperationOutcome {
bytes operation_id = 1;
}

enum IrisOperationStatus {
PENDING = 0;
SUBMITTED = 1;
ROLLED_BACK = 2;
CONFIRMED = 3;
};

message IrisOperationInfo {
bytes operationId = 1;
oneof operation {
CreateDid create_did = 2;
UpdateDid update_did = 3;
RecoverDid recovery_did = 4;
DeactivateDid deactivate_did = 5;
}
}

service IrisService {
rpc ScheduleOperation(IrisOperation) returns (IrisOperationOutcome) {}
rpc GetOperation(IrisOperationId) returns (IrisOperationInfo) {}
}
Expand Up @@ -10,7 +10,7 @@ import io.iohk.atala.iris.apiserver.grpc.{GrpcServer, GrpcServices}
import io.iohk.atala.iris.core.repository.OperationsRepository
import io.iohk.atala.iris.core.service.*
import io.iohk.atala.iris.core.worker.{MockPublishingScheduler, PublishingScheduler}
import io.iohk.atala.iris.proto.iris_api.IrisServiceGrpc
import io.iohk.atala.iris.proto.service.IrisServiceGrpc
import io.iohk.atala.iris.sql.repository.{JdbcOperationsRepository, TransactorLayer}
import zio.*
import zio.interop.catz.*
Expand Down
Expand Up @@ -2,7 +2,7 @@ package io.iohk.atala.iris.apiserver.grpc

import io.grpc.{ServerBuilder, ServerServiceDefinition}
import io.grpc.protobuf.services.ProtoReflectionService
import io.iohk.atala.iris.proto.iris_api.IrisServiceGrpc
import io.iohk.atala.iris.proto.service.IrisServiceGrpc
import zio.*

object GrpcServer {
Expand Down
Expand Up @@ -2,7 +2,7 @@ package io.iohk.atala.iris.apiserver.grpc

import akka.actor.typed.ActorSystem
import io.grpc.ServerServiceDefinition
import io.iohk.atala.iris.proto.iris_api.IrisServiceGrpc
import io.iohk.atala.iris.proto.service.IrisServiceGrpc
import zio.*

object GrpcServices {
Expand Down
@@ -1,18 +1,37 @@
package io.iohk.atala.iris.apiserver.grpc.service

import com.google.protobuf.ByteString
import io.iohk.atala.iris.core.service.PublishingService
import io.iohk.atala.iris.core.worker.PublishingScheduler
import io.iohk.atala.iris.proto.iris_api.{IrisServiceGrpc, Ping, Pong}
import io.iohk.atala.iris.proto.did_operations.{CreateDid, DocumentDefinition}
import io.iohk.atala.iris.proto.dlt.IrisOperation
import io.iohk.atala.iris.proto.service.*
import zio.*

import scala.concurrent.Future

class IrisServiceGrpcImpl(service: PublishingScheduler)(using runtime: Runtime[Any]) extends IrisServiceGrpc.IrisService {

override def sendPing(request: Ping): Future[Pong] = Unsafe.unsafe { implicit unsafe =>
runtime.unsafe.runToFuture(ZIO.succeed(Pong("hello world")))
private val mockOperationId = ByteString.copyFrom("aaafff111".getBytes())
private val mockOperation = IrisOperationInfo.Operation.CreateDid(
CreateDid(
initialUpdateCommitment = ByteString.copyFrom("a".getBytes()),
initialRecoveryCommitment = ByteString.copyFrom("b".getBytes()),
storage = "https://atalaprism.io",
document = Some(DocumentDefinition(publicKeys = Seq(), services = Seq()))
));

override def scheduleOperation(request: IrisOperation): Future[IrisOperationOutcome] = Unsafe.unsafe { implicit unsafe =>
runtime.unsafe.runToFuture(ZIO.succeed(IrisOperationOutcome(mockOperationId)))
}

override def getOperation(request: IrisOperationId): Future[IrisOperationInfo] = Unsafe.unsafe { implicit unsafe =>
runtime.unsafe.runToFuture(ZIO.succeed(
IrisOperationInfo(
operationId = mockOperationId,
operation = mockOperation
)))
}
}

object IrisServiceGrpcImpl {
Expand Down

0 comments on commit 0b1b089

Please sign in to comment.