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.

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