---
# System prepended metadata

title: '[Solidity Language Design Discussion] NatSpec for Formal Specifications #10825'

---

# [Solidity Language Design Discussion] NatSpec for Formal Specifications #10825

_27.01.2021, 4:30PM - 5:30PM CET (Berlin time)_

Discussion on next steps for [issue #10825](https://github.com/ethereum/solidity/issues/10825).

### Attendees
Akos H
Alex B
Chris R
Dimitar B
Joran H
Leo A
Martin L
Valentin W
Goncalo S
Franziska H

### Notes

- Joran: Initial motivation of the issue was to discuss using NatSpec to standardise specification language annotations, could be useful for several tools 
- Leo: Several aspects need to go together, otherwise they might diverge too much; let's create a general common minimum 
- Akos: Pre- and post conditions, invariants and basic Sol expressions as starting point
- Valentin: Agrees that a minimal language would be nice, but e.g. Scribble does not have preconditions; there are different desing choices possible;  not sure where the convergence is, maybe it would be worth trying different approaches first before trying to define the common denominator
- Leo: Could become chicken & egg thing if remains undefined for too long
- Valentin: There is no common specification lang yet and there is imo no easy way to integrate it into the compiler; usually standardization just takes a really long time; it will be a compromise, not everybody will be happy with it; let's try to collect empirical evidence what's essential before defining it
- Akos: Likes Dejan's proposal of common format + more custom spec
- Alex: 2 opposing positions: 1st doesn't want to do any type checking; spec tag + dialect 
- References issue [#8146 on custom NatSpec tags](https://github.com/ethereum/solidity/issues/8146) 
- Joran would like to have NatSpec tags for the mentioned reasons 
- Valentin: Custom NatSpec tags could also be a first step and then work out the next iteration, still in explorative stage
- Dimitar: Several stages of general @spec (tool undefined) and @spec (with tool defined) to check whether parsing and typechecking is possible
- Chris: How exactly could the tools (e.g. Scribble) benefit from a simpler implemenation in the compiler? How would you work with an export (eg. AST node has XY tag)
- Akos: Returning an AST would help so that the tools would not need to reinvent parsing
- Chris: But you would still have to take the sol code and modify it?
- Dimitar: That would be the task of the tool, - Chris: you're working with a mix of parsed and unparsed content?
- Dimitar: Yes
- Alex: Wouldn't it be better if the JSON AST would keep all the comments from the source code and keep it included?
- Dimitar: Good idea, if you exclude NatSpec tags that would be useful, if you follow NatSpec tags you get more, if you also follow syntax you get even more etc. 
- Chris: Would it help to do some sort of identifier solution?
- Dimitar: Yes that would help, also it would help if the compiler would not fail if not finding the identifier
- Chris: Compiler has to ignore any syntax anyways
- Chris: Don't think it's a good idea to agree on a fixed grammar
- Alex: Check free text for anything that resembles a variable name
- Chris: Reminds me of an old feature we wanted to have in the past: parsing and evaluating a contract Without inserting it into the source code
- Akos: This is what we are doing but in a hacky way
- Dimitar: Yes would be very useful
- Chris: This is most useful if you can keep the context of the compiler alive
- Alex: couldn't you pass in a list of snippets at the same time? hypothetically if we would expose all the comments in the AST; then you can do your own parsing on the comments
- Dimitar: How do you point the scope in a snippets format? 
- Chris: By AST ID or filenum;
- Alex: Issue for that is ["Compile external code snippets #1272"](https://github.com/ethereum/solidity/issues/1272)
- Chris: Currently, the set of NatSpec tags is fixed but we were thinking of opening it up 
- Alex: But is NatSpec even useful here? it's quite decoupled from the AST
- Joran: NatSpec would be useful because people are using it already to put "meta" information about the functions; it's not meant to make tool dev easier but rather encourage adoption of writing specifications
- Alex: Dejan made a good point about people being confused about the huge selection of tools and how to choose; that's why common language could make sense; if we go to the route of NatSpec there should be a common lang, which again would take time to get there
- Leo: Maybe the first common lang would just be natural lang; add a a new tag, maybe decide on some syntax / format (tag, tool, message), it would be nice to have something to start with, but there should also be some commmon ground, e.g. @spec 
- Valentin: It would be great if there was a common format, we are not against that, it's just that we have this discussions for a long time already, it's hard to agree on this "common" stuff, going with something that is undisputed, semi-formal or natural lang, free form, would be good
- Matin: We can work into both directions, I also want to recognize there is a little interoperability in require/asserts; and then expanding towards more static asserts
- Valentin: there is some sort of duplication that we also observe; having clear seperation what is interface Specification and how you enforce it at run-time is not a bad idea
- Martin: Static assert could be useful there
- Goncalo: Pros / cons of doing it in NatSpec vs just getting the commenting to the AST
- Valentin: Pro NatSpec: make specs more visible, doc generators, tools would show it, verification exposure
- Goncalo: How I understood Dimitar having comments in the AST would already be a big benefit correct?
- nodding 
- Valentin: Both would help, keeping comments in the AST could be the 1st step, adding it into NatSpec could be the 2nd step, formalizing it even further 3rd step
- Chris: All the three features are useful for other things too so it is justified to do them
- Leo: Doing it in NatSpec would really give more visibility to the subject
- Joran: From the user's perspective using NatSpec would be a first step to a more uniform experience 
- Alex: Risk with NatSpec: if we don't have an agreed common subset... if we allow custom tags, the risk is that people can make mistakes; tools could warn them but not the compiler, currently the NatSpec is quite strict; once we have a common subset it would need to be bound to the compiler version
- Valentin: Is your concern backwards compatibility?
- Alex: Right now no link between NatSpec and the AST; this needs to be solved anyways
- Alex: IMO dialect (spec tag with dialect) required is better than custom (arbitary) tags
- Leo: @spec scribble invariant x > 1;
- Chris: Disadvantage here is it's a bit verbose
- Chris: Another way could be just having one tag at the beginning "add verification tool"
- Leo: I think I would use different tools in the same source code
- Valentin: main benefit of core language would be easy for users to try out different tools (at least for core constructs)
- Joran: Yes but you would still have different dialects, thinking of creating a "translator" for different backends
- Martin: Should we also come up with a minimal subset of the language for the dialects?
- Joran: That would be interesting, could be a working group
- **Leo: How about we start with ``@spec dialect message`` and in parallel we start running examples and see how things look and eventually agree on minimal lang**
- Chris: Only at locations where NatSpec is allowed?
- Dimitar: For now sufficient
- Martin: I would find it useful in different places, too
[...]

We've agreed on steps forward, let's continue the discussion on more next steps another time!



