coinbase / mesh-specifications

Specification files for the Mesh Blockchain Standard
Apache License 2.0
324 stars 92 forks source link

Error when trying to generate grpc definitions. #18

Closed johnwhitton closed 4 years ago

johnwhitton commented 4 years ago

Describe the bug Cannot generate grpc (.proto) definitions

Body" keys:"required"
Errors reading api.yaml
Plugin error: [file "api.proto" included an unresolvable reference to "api.NetworkIdentifierYaml"]

To Reproduce Clone the rosetta specifications directory - only need to do once

git clone git@github.com:coinbase/rosetta-specifications.git
cd rosetta-specifications

Get gnostic, gnositc-grpc and gnostic-go-generator - only need to do once

go get -u github.com/googleapis/gnostic
go get -u github.com/googleapis/gnostic-grpc
go get -u github.com/googleapis/gnostic-go-generator

Try and generate the grpc definition

gnostic api.yaml --grpc-out=rosetta.proto

Expected behavior A rosetta.proto file is created

Additional context Detailed gist containing the log is here I can be reached at https://johnwhitton.dev or john@johnwhitton.dev

patrick-ogrady commented 4 years ago

I believe you are getting this error because gnostic does not support resolving a multi-file OpenAPI specification (api.yaml imports many files from models/*).

Fortunately, gnostic supports generating proto files from json specifications and I already resolved external references when generating api.json. If you run gnostic api.json --grpc-out=rosetta.proto, you should be able to produce a proto file (GitHub isn't letting me upload the one I generated here because they don't support .proto, so I copied the contents below).

Just a heads up, the Metadata message looks a little strange in proto (defined as an object with no required fields in the spec).

Let me know if you run into any other issues!

syntax = "proto3";

package api;

import "google/api/annotations.proto";

import "google/protobuf/descriptor.proto";

message NetworkIdentifier {
  string blockchain = 1;

  string network = 2;

  SubNetworkIdentifier sub_network_identifier = 3;
}

message Metadata {
}

message SubNetworkIdentifier {
  string network = 1;

  Metadata metadata = 2;
}

message BlockIdentifier {
  int64 index = 1;

  string hash = 2;
}

message PartialBlockIdentifier {
  int64 index = 1;

  string hash = 2;
}

message TransactionIdentifier {
  string hash = 1;
}

message OperationIdentifier {
  int64 index = 1;

  int64 network_index = 2;
}

message AccountIdentifier {
  string address = 1;

  SubAccountIdentifier sub_account = 2;

  Metadata metadata = 3;
}

message SubAccountIdentifier {
  string address = 1;

  Metadata metadata = 2;
}

message Block {
  BlockIdentifier block_identifier = 1;

  BlockIdentifier parent_block_identifier = 2;

  Timestamp timestamp = 3;

  repeated Transaction transactions = 4;

  Metadata metadata = 5;
}

message Transaction {
  TransactionIdentifier transaction_identifier = 1;

  repeated Operation operations = 2;

  Metadata metadata = 3;
}

message Operation {
  OperationIdentifier operation_identifier = 1;

  repeated OperationIdentifier related_operations = 2;

  string type = 3;

  string status = 4;

  AccountIdentifier account = 5;

  Amount amount = 6;

  Metadata metadata = 7;
}

message Amount {
  string value = 1;

  Currency currency = 2;

  Metadata metadata = 3;
}

message Currency {
  string symbol = 1;

  int32 decimals = 2;

  Metadata metadata = 3;
}

message Peer {
  string peer_id = 1;

  Metadata metadata = 2;
}

message Version {
  string rosetta_version = 1;

  string node_version = 2;

  string middleware_version = 3;

  Metadata metadata = 4;
}

message Allow {
  repeated OperationStatus operation_statuses = 1;

  repeated string operation_types = 2;

  repeated Error errors = 3;
}

message OperationStatus {
  string status = 1;

  bool successful = 2;
}

message Timestamp {
  int64 value = 1;
}

message AccountBalanceRequest {
  NetworkIdentifier network_identifier = 1;

  AccountIdentifier account_identifier = 2;

  PartialBlockIdentifier block_identifier = 3;
}

message AccountBalanceResponse {
  BlockIdentifier block_identifier = 1;

  repeated Amount balances = 2;

  Metadata metadata = 3;
}

message BlockRequest {
  NetworkIdentifier network_identifier = 1;

  PartialBlockIdentifier block_identifier = 2;
}

message BlockResponse {
  Block block = 1;

  repeated TransactionIdentifier other_transactions = 2;
}

message BlockTransactionRequest {
  NetworkIdentifier network_identifier = 1;

  BlockIdentifier block_identifier = 2;

  TransactionIdentifier transaction_identifier = 3;
}

message BlockTransactionResponse {
  Transaction transaction = 1;
}

message MempoolRequest {
  NetworkIdentifier network_identifier = 1;
}

message MempoolResponse {
  repeated TransactionIdentifier transaction_identifiers = 1;
}

message MempoolTransactionRequest {
  NetworkIdentifier network_identifier = 1;

  TransactionIdentifier transaction_identifier = 2;
}

message MempoolTransactionResponse {
  Transaction transaction = 1;

  Metadata metadata = 2;
}

message MetadataRequest {
  Metadata metadata = 1;
}

message NetworkListResponse {
  repeated NetworkIdentifier network_identifiers = 1;
}

message NetworkRequest {
  NetworkIdentifier network_identifier = 1;

  Metadata metadata = 2;
}

message NetworkStatusResponse {
  BlockIdentifier current_block_identifier = 1;

  Timestamp current_block_timestamp = 2;

  BlockIdentifier genesis_block_identifier = 3;

  repeated Peer peers = 4;
}

message NetworkOptionsResponse {
  Version version = 1;

  Allow allow = 2;
}

message Options {
}

message ConstructionMetadataRequest {
  NetworkIdentifier network_identifier = 1;

  Options options = 2;
}

message ConstructionMetadataResponse {
  Metadata metadata = 1;
}

message ConstructionSubmitRequest {
  NetworkIdentifier network_identifier = 1;

  string signed_transaction = 2;
}

message ConstructionSubmitResponse {
  TransactionIdentifier transaction_identifier = 1;

  Metadata metadata = 2;
}

message Error {
  int32 code = 1;

  string message = 2;

  bool retriable = 3;
}

message NetworkListParameters {
  MetadataRequest metadata_request = 1;
}

message NetworkStatusParameters {
  NetworkRequest network_request = 1;
}

message NetworkOptionsParameters {
  NetworkRequest network_request = 1;
}

message BlockParameters {
  BlockRequest block_request = 1;
}

message BlockTransactionParameters {
  BlockTransactionRequest block_transaction_request = 1;
}

message MempoolParameters {
  MempoolRequest mempool_request = 1;
}

message MempoolTransactionParameters {
  MempoolTransactionRequest mempool_transaction_request = 1;
}

message AccountBalanceParameters {
  AccountBalanceRequest account_balance_request = 1;
}

message ConstructionMetadataParameters {
  ConstructionMetadataRequest construction_metadata_request = 1;
}

message ConstructionSubmitParameters {
  ConstructionSubmitRequest construction_submit_request = 1;
}

service Api {
  rpc NetworkList ( NetworkListParameters ) returns ( NetworkListResponse ) {
    option (google.api.http) = { post:"/network/list" body:"metadata_request"  };
  }

  rpc NetworkStatus ( NetworkStatusParameters ) returns ( NetworkStatusResponse ) {
    option (google.api.http) = { post:"/network/status" body:"network_request"  };
  }

  rpc NetworkOptions ( NetworkOptionsParameters ) returns ( NetworkOptionsResponse ) {
    option (google.api.http) = { post:"/network/options" body:"network_request"  };
  }

  rpc Block ( BlockParameters ) returns ( BlockResponse ) {
    option (google.api.http) = { post:"/block" body:"block_request"  };
  }

  rpc BlockTransaction ( BlockTransactionParameters ) returns ( BlockTransactionResponse ) {
    option (google.api.http) = { post:"/block/transaction" body:"block_transaction_request"  };
  }

  rpc Mempool ( MempoolParameters ) returns ( MempoolResponse ) {
    option (google.api.http) = { post:"/mempool" body:"mempool_request"  };
  }

  rpc MempoolTransaction ( MempoolTransactionParameters ) returns ( MempoolTransactionResponse ) {
    option (google.api.http) = { post:"/mempool/transaction" body:"mempool_transaction_request"  };
  }

  rpc AccountBalance ( AccountBalanceParameters ) returns ( AccountBalanceResponse ) {
    option (google.api.http) = { post:"/account/balance" body:"account_balance_request"  };
  }

  rpc ConstructionMetadata ( ConstructionMetadataParameters ) returns ( ConstructionMetadataResponse ) {
    option (google.api.http) = { post:"/construction/metadata" body:"construction_metadata_request"  };
  }

  rpc ConstructionSubmit ( ConstructionSubmitParameters ) returns ( ConstructionSubmitResponse ) {
    option (google.api.http) = { post:"/construction/submit" body:"construction_submit_request"  };
  }
}