From 0b1b0895aa2408d13c5241a7348476b90bdf06e1 Mon Sep 17 00:00:00 2001 From: Ilya Peresadin Date: Thu, 29 Sep 2022 11:52:41 +0300 Subject: [PATCH] [ATL-1774] feat(iris): Define Castor and Pollux specific protobuf models (#41) * [ATL-1774] feat(iris): Define Castor and Pollux specific protobuf models. Also Iris service protobuf --- iris/api/grpc/README.md | 9 ++ iris/api/grpc/iris_api.proto | 22 ----- iris/api/grpc/protocol/did_operations.proto | 95 +++++++++++++++++++ iris/api/grpc/protocol/dlt.proto | 37 ++++++++ iris/api/grpc/protocol/vc_operations.proto | 19 ++++ iris/api/grpc/service.proto | 41 ++++++++ .../iohk/atala/iris/apiserver/Modules.scala | 2 +- .../iris/apiserver/grpc/GrpcServer.scala | 2 +- .../iris/apiserver/grpc/GrpcServices.scala | 2 +- .../grpc/service/IrisServiceGrpcImpl.scala | 25 ++++- 10 files changed, 226 insertions(+), 28 deletions(-) create mode 100644 iris/api/grpc/README.md delete mode 100644 iris/api/grpc/iris_api.proto create mode 100644 iris/api/grpc/protocol/did_operations.proto create mode 100644 iris/api/grpc/protocol/dlt.proto create mode 100644 iris/api/grpc/protocol/vc_operations.proto create mode 100644 iris/api/grpc/service.proto diff --git a/iris/api/grpc/README.md b/iris/api/grpc/README.md new file mode 100644 index 0000000000..47abfff63c --- /dev/null +++ b/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. diff --git a/iris/api/grpc/iris_api.proto b/iris/api/grpc/iris_api.proto deleted file mode 100644 index edf861cee1..0000000000 --- a/iris/api/grpc/iris_api.proto +++ /dev/null @@ -1,22 +0,0 @@ -syntax = "proto3"; - -import "scalapb/scalapb.proto"; - -option (scalapb.options) = { - no_default_values_in_constructor: true - package_name: "io.iohk.atala.iris.proto" -}; - - -message Ping { - string message = 1; - float delaySeconds = 2; -} - -message Pong { - string message = 1; -} - -service IrisService { - rpc SendPing(Ping) returns (Pong) {} -} \ No newline at end of file diff --git a/iris/api/grpc/protocol/did_operations.proto b/iris/api/grpc/protocol/did_operations.proto new file mode 100644 index 0000000000..562e491944 --- /dev/null +++ b/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; +} diff --git a/iris/api/grpc/protocol/dlt.proto b/iris/api/grpc/protocol/dlt.proto new file mode 100644 index 0000000000..821f73e6aa --- /dev/null +++ b/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; +} diff --git a/iris/api/grpc/protocol/vc_operations.proto b/iris/api/grpc/protocol/vc_operations.proto new file mode 100644 index 0000000000..6bf3efc658 --- /dev/null +++ b/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; +} diff --git a/iris/api/grpc/service.proto b/iris/api/grpc/service.proto new file mode 100644 index 0000000000..c66d9a6b9f --- /dev/null +++ b/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) {} +} diff --git a/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/Modules.scala b/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/Modules.scala index 75eadaef6a..4774d9cb5b 100644 --- a/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/Modules.scala +++ b/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/Modules.scala @@ -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.* diff --git a/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/GrpcServer.scala b/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/GrpcServer.scala index b5dfb4a9d2..c0423b8ab1 100644 --- a/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/GrpcServer.scala +++ b/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/GrpcServer.scala @@ -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 { diff --git a/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/GrpcServices.scala b/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/GrpcServices.scala index 4082651e60..f4ef958a81 100644 --- a/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/GrpcServices.scala +++ b/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/GrpcServices.scala @@ -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 { diff --git a/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/service/IrisServiceGrpcImpl.scala b/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/service/IrisServiceGrpcImpl.scala index d1564c94e3..19464c4bf7 100644 --- a/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/service/IrisServiceGrpcImpl.scala +++ b/iris/service/api-server/src/main/scala/io/iohk/atala/iris/apiserver/grpc/service/IrisServiceGrpcImpl.scala @@ -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 {