Introduce a new JSON standard for SVM traces during execution of state tests.
Motivation
The Sila Virtual Machine executes all smart contract code on sila.
In order to debug smart contracts and state tests better, a common format was introduced to log every execution step of the SVM.
This format was implemented by Go-Sila, Parity-Sila, Nethermind and Besu.
Since the common format was not well-defined, the implementations differed slightly, making it hard to develop adequate tooling which reduces the usefulness of tracing significantly.
This SIP has multiple goals:
Move the specification to a more visible place to encourage new clients to implement it
Strictly define corner cases that were not addressed in the previous version
Allow for updates to the specification in case new fields are introduced during execution
Provide sample output
Implementing this SIP in all major clients allows us to create meaningful differential fuzzers that fuzz SVM implementations for the sila-mainnet and all upcoming hardforks.
It also helps to find differences in execution quickly in the case of a chain split.
This SIP will enable users to create better differential fuzzing infrastructure to compare the SVM implementations of all major Sila clients against each other.
This could help to find bugs that are currently present in the client implementations.
Specification
Clients should be able to execute simple transactions as well as code and return traces. In the following, we will call this client CUT (client under test) and use go-sila’s
svm binary for code examples.
Datatypes
Type
Explanation
Example
Number
Plain json number
“pc”:0
Hex-Number
Hex-encoded number
“gas”:”0x2540be400”
String
Plain string
“opName”:”PUSH1”
Hex-String
Hex-encoded string
Â
Array of x
Array of x encoded values
Â
Key-Value
Key-Value structure with key and values encoded as hex strings
Â
Boolean
Json bool can either be true or false
“pass”: true
Output
The CUT MUST output a json object for EACH operation.
Required Fields
Name
Type
Explanation
pc
Number
Program Counter
op
Number
OpCode
gas
Hex-Number
Gas left before executing this operation
gasCost
Hex-Number
Gas cost of this operation
memSize
Number
Size of memory array
stack
Array of Hex-Numbers
Array of all values on the stack
depth
Number
Depth of the call stack
returnData
Hex-String
Data returned by function call
refund
Number
Amount of global gas refunded
Optional Fields
Name
Type
Explanation
opName
String
Name of the operation
error
Hex-String
Description of an error (should contain revert reason if supported)
The stack, memory and memSize are the values before execution of the op.
All array attributes (stack, memory) MUST be initialized to empty arrays ("stack":[]) NOT to null.
If the CUT will not be outputting values for memory or storage then the memory and storage fields are omitted.
This can happen either because the CUT does not support tracing these fields or it has been configured not to trace it.
The memSize field MUST be present regardless of memory support.
Clients SHOULD implement a way to disable recording the storage as the stateroot includes all storage updates.
Clients SHOULD output the fields in the same order as listed in this SIP.
The CUT MUST NOT output a line for the STOP operation if an error occurred:
This SIP is largely based on the previous non-official documentation for SVM tracing.
It tries to cover as many corner cases as possible to enable true client compatibility.
The datatypes and if a field is optional is chosen to be as compatible with current implementations as possible.
Backwards Compatibility
This SIP is fully backward compatible with sila as it only introduces a better tracing infrastructure that is optional for clients to implement.
Clients
This SIP is fully backward compatible with go-sila. Sila, Besu and Nethermind clients would have to change their JSON output of
sila-svmSVMtool and
nethtest slightly do adhere to the new and stricter specs. New clients would need to implement this change if they want to be part of the differential fuzzing group.
Martin Holst Swende (@holiman), Marius van der Wijden (@MariusVanDerWijden), "SIP-3155: SVM trace specification [LAST CALL]," Sila Improvement Proposals, no. 3155, December 2020. Available: https://sips.sila.org/SIPS/sip-3155.