Giter Site home page Giter Site logo

maanavkhaitan / protobuf3-solidity Goto Github PK

View Code? Open in Web Editor NEW

This project forked from celestiaorg/protobuf3-solidity

0.0 0.0 0.0 304 KB

Protobuf3 plugin for Solidity

License: Apache License 2.0

JavaScript 20.38% Go 76.97% Makefile 1.48% Solidity 1.17%

protobuf3-solidity's Introduction

protobuf3-solidity

GitHub go.mod Go version GitHub release (latest SemVer) Go and Node.js Tests GitHub

A protobuf3 code generator plugin for Solidity. Decode and encode protobuf messages in your Solidity contract! Leverages the protobuf3-solidity-lib codec library.

Serialization rules are stricter than default protobuf3 rules, and are specified in ADR-027. The resulting serialization is bijective (one-to-one), rather than the usual non-deterministic and malleable serialization used in most protobuf parsers. This makes it suitable for canonical serialization in blockchain applications.

Usage

Use as a protoc plugin:

protoc \
--plugin protoc-gen-sol \
--sol_out [license=<license string>,compile=<link,inline>,generate=<all,decoder,encoder>:]<output directory> \
<proto files>

Examples:

# Output foo.proto.sol in current directory
protoc --plugin protoc-gen-sol --sol_out . foo.proto

# Generate Solidity file with Apache-2.0 license identifier
protoc --plugin protoc-gen-sol --sol_out license=Apache-2.0:. foo.proto

Parameters

  • license: default CC0
    • any string is accepted, and the generated license comment will use the string as-is
  • compile: default inline
    • inline: the generated library's functions will be inlined (JUMP)
    • link: the generated library's functions will be linked (DELEGATECALL)
  • generate: default decoder
    • all: both decoder and encoder will be generated
    • decoder: only decoder will be generated
    • encoder: only encoder will be generated (experimental!)

Feature support

The below protobuf file shows all supported features of this plugin.

syntax = "proto3";

// import is supported but not shown here

enum OtherEnum {
  UNSPECIFIED = 0;
  ONE = 1;
  TWO = 2;
};

message OtherMessage {
  uint64 other_field = 1;
}

message Message {
  int32 optional_int32 = 1;
  int64 optional_int64 = 2;
  uint32 optional_uint32 = 3;
  uint64 optional_uint64 = 4;
  sint32 optional_sint32 = 5;
  sint64 optional_sint64 = 6;
  fixed32 optional_fixed32 = 7;
  fixed64 optional_fixed64 = 8;
  sfixed32 optional_sfixed32 = 9;
  sfixed64 optional_sfixed64 = 10;
  bool optional_bool = 11;
  string optional_string = 12;
  bytes optional_bytes = 13;
  OtherEnum optional_enum = 14;
  OtherMessage optional_message = 15;

  repeated int32 repeated_int32 = 16 [packed = true];
  repeated int64 repeated_int64 = 17 [packed = true];
  repeated uint32 repeated_uint32 = 18 [packed = true];
  repeated uint64 repeated_uint64 = 19 [packed = true];
  repeated sint32 repeated_sint32 = 20 [packed = true];
  repeated sint64 repeated_sint64 = 21 [packed = true];
  repeated fixed32 repeated_fixed32 = 22 [packed = true];
  repeated fixed64 repeated_fixed64 = 23 [packed = true];
  repeated sfixed32 repeated_sfixed32 = 24 [packed = true];
  repeated sfixed64 repeated_sfixed64 = 25 [packed = true];
  repeated bool repeated_bool = 26 [packed = true];
  repeated OtherEnum repeated_enum = 27 [packed = true];
  repeated OtherMessage repeated_message = 28;
}

Rules to keep in mind:

  1. Enum values must start at 0 and increment by 1.
  2. Field numbers must start at 1 and increment by 1.
  3. Repeated numeric types must explicitly specify [packed = true].

Currently unsupported features:

  1. nested enum or message definitions - All enum and message definitions must be top-level.
  2. package - Scoping currently unsupported, including in imports.

Unsupported features:

  1. repeated string and bytes - Solidity does not support arrays of string or bytes. Workaround: wrap the field in a message.
  2. float and double - Solidity does not support floating-point numbers.
  3. oneof - Solidity does not support unions.
  4. map - Maps are forbidden as per ADR-027.

Building from source

Requires Go >= 1.14.

Build:

make

Test (requires a protoc binary in PATH):

make test-protoc

protobuf3-solidity's People

Contributors

adlerjohn avatar maanavkhaitan avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.