2018-05-23 00:02:17 +02:00
---
eip: 1109
2018-08-23 11:52:59 +02:00
title: PRECOMPILEDCALL opcode (Remove CALL costs for precompiled contracts)
2018-05-23 00:02:17 +02:00
author: Jordi Baylina (@jbaylina )
discussions-to: https://ethereum-magicians.org/t/eip-1109-remove-call-costs-for-precompiled-contracts/447
status: Draft
type: Standards Track
category: Core
created: 2018-05-22
---
## Simple Summary
2020-08-29 05:58:34 +01:00
This EIP creates a specific opcode named `PRECOMPILEDCALL` to call Precompiled contracts without the costs of a normal `CALL` .
2018-05-23 00:02:17 +02:00
## Abstract
2018-08-23 11:52:59 +02:00
This EIP tries to resolve the problem of high gas consumption when calling precompiled contracts with a small gas cost. Using this opcode for calling precompiled contracts allows to define precompiled contracts whose effective cost it is less than 700.
2018-05-23 00:02:17 +02:00
## Motivation
2018-08-23 11:52:59 +02:00
Each precompiled contract has an already defined cost for calling it. It does not make sense to add the implicit extra gas cost of the CALL opcode.
2018-05-23 00:02:17 +02:00
2020-09-30 12:22:43 +08:00
As an example, SHA256 precompiled contract costs 60 and ECADD costs 500 (proposed to costs only 50 in [EIP-1108 ](./eip-1108.md ) . When a precompiled contract is called, 700 gas is consumed just for the CALL opcode besides the costs of the precompiled contract.
2018-05-23 00:02:17 +02:00
2018-08-23 11:52:59 +02:00
This makes no sense, and right now it's impossible to define a precompiled contract whose effective cost for using it, is less than 700.
2018-05-23 00:02:17 +02:00
## Specification
2020-08-29 05:58:34 +01:00
If `block.number >= XXXXX` , define a new opcode named `PRECOMPILEDCALL` with code value `0xfb` .
2018-08-23 11:52:59 +02:00
The gas cost of the OPCODE is 2 (Gbase) plus the Specific gas cost defined for each specific precompiled smart contract.
The OPCODE takes 5 words from the stack and returns 1 word to the stack.
The input stack values are:
mu_s[0] = The address of the precompiled smart contract that is called.
mu_s[1] = Pointer to memory for the input parameters.
2019-05-19 07:54:10 +01:00
mu_s[2] = Length of the input parameters in bytes.
2018-08-23 11:52:59 +02:00
mu_s[3] = Pointer to memory where the output is stored
mu_s[4] = Length of the output buffer.
The return will be 1 in case of success call and 0 in any of the next cases:
1.- mu_s[0] is an address of an undefined precompiled smart contract.
2.- The precompiled smart contract fails (as defined on each smart contract). Invalid input parameters for example.
2020-08-29 05:58:34 +01:00
Precompiled smart contracs, does not execute opcodes, so there is no need to pass a gas parameter as a normal `CALL` (`0xf1` ). If the available gas is less that 2 plus the required gas required for the specific precompiled smart cotract, the context just STOPS executing with an "Out of Gas" error.
2018-08-23 11:52:59 +02:00
There is no stack check for this call.
2020-08-29 05:58:34 +01:00
The normal `CALL` s to the precompiled smart contracts continue to work with the exact same behavior.
2018-08-23 11:52:59 +02:00
2020-08-29 05:58:34 +01:00
A `PRECOMPILEDCALL` to a regular address or regular smart contract, is considered a call to an "undefined smart contract", so the VM MUST not execute it and the opcode must return 0x0 .
2018-05-23 00:02:17 +02:00
## Rationale
2020-08-29 05:58:34 +01:00
There was a first proposal for removing the gast consts for the `CALL` , but it looks that it's easier to implement and test a new opcode just for that.
2018-08-23 11:52:59 +02:00
2020-08-29 05:58:34 +01:00
The code is just the next opcode available after the `STATICCALL` opcode.
2018-05-23 00:02:17 +02:00
## Backwards Compatibility
2018-08-23 11:52:59 +02:00
This EIP is backwards compatible. Smart contracts that call precompiled contracts using this new opcode will cost less from now on.
2020-08-29 05:58:34 +01:00
Old contracts that call precompiled smart contracts with the `CALL` method, will continue working.
2018-05-23 00:02:17 +02:00
## Test Cases
2018-05-23 05:13:09 +02:00
- Normal call to a defined precompiled contract.
- Call to undefined precompiled contract.
2018-08-23 11:52:59 +02:00
- Call to a regular contract
- Call to a regular account
- Call to 0x0 smart contract (Does not exists).
2019-05-19 07:54:10 +01:00
- Call with large values for the offste pointers and lengths
2018-08-23 11:52:59 +02:00
- Call with the exact gas remaining needed to call smart contract.
- Call with the exact gas remaining minus one needed to call smart contract.
2018-05-23 00:02:17 +02:00
## Implementation
Not implemented yet.
## Copyright
Copyright and related rights waived via [CC0 ](https://creativecommons.org/publicdomain/zero/1.0/ ).