EVMC specifies a generic API for Ethereum execution engines. This EIP specifies a way of providing implementations of Ethereum precompiled contracts using the EVMC VM API.
For the complete EVMC specification visit the EVMC documentation first. This EIP is based on and is compatible with EVMC ABI version 6.
The EVMC module with implementations of precompiled contracts SHOULD:
Advertise the [EVMC_CAPABILITY_PRECOMPILES
] capability
in the [get_capabilities()
] method.
Implement the [execute()
] method in the following way:
Validate the incoming execution request requirements:
The message kind ([evmc_message::kind
]) is a call ([EVMC_CALL
]).
The call destination address ([evmc_message::destination
])
is within the range of precompiled contracts defined by EIP-1352.
There is no code provided (the code
argument is NULL
and code_size
argument is 0
).
If the requirements are not fulfilled, abort execution with the [EVMC_REJECTED
] status code.
Check if the call destination address ([evmc_message::destination
])
targets existing precompiled contract.
Consider the EVM revision ([evmc_revision
]) requested by
the rev
parameter of [execute()
].
If yes, execute as follows:
Inspect the input data ([evmc_message::input_data
], [evmc_message::input_size
])
and calculate the gas cost of the execution.
Compute the amount of gas left after execution by
subtracting the gas cost from the call gas limit ([evmc_message::gas
]).
If gas left is negative,
abort execution with the [EVMC_OUT_OF_GAS
] status code.
Otherwise,
execute the code of the precompiled contract,
return the [EVMC_SUCCESS
] status code, the output and gas left
([evmc_result::output_data
], [evmc_result::output_size
], [evmc_result::gas_left
]).
Otherwise, emulate execution of empty code by returning
the [EVMC_SUCCESS
] status code
and gas left equal the call gas limit ([evmc_message::gas
]).
Precompiled contract implementations are allowed to return two more EVMC error codes:
- [EVMC_FAILURE
] if the failure was caused due to something other than out of gas (e.g. input validation error)
- [EVMC_REVERT
] if the precompile doesn't want to forfeit all supplied gas (as of May 2019 no such precompile exists)
The Client is not required to provide the Host interface ([evmc_context
] argument of [execute()
] is set to NULL).
Therefore, the precompiled contracts implementation MUST NOT access the evmc_context
.
It is very unlikely that any precompile will need to access or modify a contract state. Not requiring the Client to implement the EVMC Host interface removes the big portion of work needed for full EVMC integration.
EVMC provides the evmc-vmtester tool for checking compatibility with the EVMC specification.
Copyright and related rights waived via CC0.