string wrangling in Michelson

(cross-posted from the tezos dev slack, it’s hard to know the right place to put things like this!)

Hi folks - i’ve been having some trouble with a next-gen NFT contract in SmartPy, and i’ve come to the conclusion that the underlying issues i’m having might need some language-level support. so i’m basically here to air a proposal for adding nat to string and address to string support to Michelson.

In Michelson there is currently no native way to convert a nat to a string, or an address to a string, or vice versa. However, when writing NFT metadata retrieval views - which we currently have to do off-chain (TZIP-16) but which Hangzhou enables us to do on-chain - it is often desirable to be able to convert nats or addresses to strings (for example: assembling URIs by appending a token id or wallet address to a base URI in contract storage). Currently, if we want to append a nat to a string we have to build a map of nat 0…9→single digit strings “0”…“9”, and assemble the string manually, digit by digit. This is far from ideal.

It seems that especially after Hangzhou adoption, inter-contract calls might also benefit from being able to do nat to string/address to string (and perhaps in the other direction too). I am imagining a situation where a client contract expects map keys to be formatted one way, but the calling contract only has access to keys formatted a different way. Richer string composition and decomposition tools would be advantageous for future-proofing Michelson and the Tezos ecosystem more generally.

What might be the technical or design considerations to adding the following instructions:

nat to string
address to string
bytes to string

and optionally:

string to nat
string to address
string to bytes

to Michelson, in a future protocol change? I can name at least three other NFT contract developers besides myself who would benefit from at least a nat to string native instruction, and I am sure there are others - as well as other use-cases beyond NFTs that are not at this point readily apparent.

Please let me know your thoughts.

2 Likes

There are more things we could use, like being able to deserialize JSON to a record.
This would allow for parsing out some JWTs enabling things like Android SafetyNet oracles and more.

1 Like