borsh-rs icon indicating copy to clipboard operation
borsh-rs copied to clipboard

serde derivations for `BorshSchemaContainer`

Open itegulov opened this issue 1 year ago • 3 comments

It would be nice to be able to (de)serialize BorshSchemaContainer into something human-readable. For some context, we must somehow represent a contract's borsh-serializable types in the ABI schema file. Since this file is in JSON format, we have to serialize borsh schema as JSON, which is doable in a janky way using serde's remote derivation (see https://github.com/near/near-sdk-rs/pull/872). Ideally, this logic should live in this repo, but I also recognize that borsh would rather not depend on serde, so maybe this functionality can be behind an optional feature schema-serde?

As for the BorshSchemaContainer's format, I propose we use untagged Fields and inline all single-fielded Definition variants for the sake of readability while maintaining all other underlying type names (Struct, Tuple etc). Borsh schema for struct Pair(u32, u32) would look like:

{
  "declaration": "Pair",
  "definitions": {
    "Pair": {
      "Struct": [
        "u32",
        "u32"
      ]
    }
  }
}

See https://github.com/near/near-sdk-rs/pull/872/commits/979b83910d49a8317d58311c5a0fad53294ea557 for more examples.

CC @austinabell

itegulov avatar Aug 01 '22 07:08 itegulov

@itegulov Do I understand it correctly that NEAR ABI does not need Borsh Schema anymore and we can close this issue? I feel Borsh Schema does not really work well, and we should potentially redesign it.

frol avatar Jul 27 '23 16:07 frol

@frol nope, it does. I mean Borsh Schema is the only format we have that can represent borsh-serializable types. To be fair, Borsh is used much more rarely in contracts' public API from my experience, so I don't know how big of a deal the redesign would be from users' perspective.

itegulov avatar Jul 27 '23 23:07 itegulov

what is status for this?

dzmitry-lahoda avatar May 02 '24 00:05 dzmitry-lahoda