-
Notifications
You must be signed in to change notification settings - Fork 216
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TIP-543: Implement EIP-3855 PUSH0 instruction #543
Comments
what does this |
@KrisdiaPaul If you want to know the details of |
Introducing |
It is good if it helps reduce gas/energy consumption. |
Will this make tron EVM? |
The TVM was designed to be the EVM equivalent at the outset, and the purpose of this TIP is to enable the TVM to support the changes associated with the Ethereum Shanghai upgrade of the EVM. |
Thank you for getting back to me. As for smart contract equivalence, will this allow users to bring their EVM smart contracts and integrate them into the TVM? Are there any opcode concerns to be aware of? |
@tinteth Developers can migrate their smart contracts to the TRON network with development kits provided by many TRON communities, such as Tron-IDE, TronWeb, TronBox, etc. This TIP mainly brings the TVM supports the full EVM opcodes, and TVM also introduces some unique opcodes. For details, please refer to: https://developers.tron.network/docs/tvm#differences-from-evm |
Close this issue as it is implemented by GreatVoyage-v4.7.2. |
Summary
As part of the Ethereum Shanghai upgrade, EIP-3855: PUSH0 Instruction is required to be implemented to TRON.
Abstract
Introduce the
PUSH0
(0x5f
) instruction, which pushes the constant value 0 onto the stack.Motivation
The Ethereum Shanghai upgrade inclues EIP-3855: PUSH0 Instruction, an EIP designed to introduce a new
PUSH0
instruction to reduce gas consumption during contract deployment and invocation.So to accommodate the changes in EVM due to the Shanghai upgrade, we introduced this TIP.
Original motivation from EIP-3855:
Many instructions expect offsets as inputs, which in a number of cases are zero. A good example is the return data parameters of
CALLs
, which are set to zeroes in case the contract prefers usingRETURNDATA*
. This is only one example, but there are many other reasons why a contract would need to push a zero value. They can achieve that today byPUSH1 0
, which costs 3 gas at runtime, and is encoded as two bytes which means2 * 200
gas deployment cost.Because of the overall cost many try to use various other instructions to achieve the same effect. Common examples include
PC
,MSIZE
,CALLDATASIZE
,RETURNDATASIZE
,CODESIZE
,CALLVALUE
, andSELFBALANCE
. Some of these cost only 2 gas and are a single byte long, but their value can depend on the context.We have conducted an analysis on Mainnet (block ranges 8,567,259…8,582,058 and 12,205,970…12,817,405), and ~11.5% of all the
PUSH*
instructions executed push a value of zero.The main motivations for this change include:
DUP
instructions for duplicating zeroes.To put the "waste" into perspective, across existing accounts 340,557,331 bytes are wasted on
PUSH1 00
instructions, which means 68,111,466,200 gas was spent to deploy them. In practice a lot of these accounts share identical bytecode with others, so their total stored size in clients is lower, however the deploy time cost must have been paid nevertheless.An example for 2) is changing the behaviour of
RETURNDATASIZE
such that it may not be guaranteed to be zero at the beginning of the call frame.Specification
The instruction
PUSH0
is introduced at0x5f
. It has no immediate data, pops no items from the stack, and places a single item with the value 0 onto the stack. The cost of this instruction is 2 energy (akabase
).Rationale
Energy cost
The
base
energy cost is used for instructions which place constant values onto the stack, such asADDRESS
,ORIGIN
, and so forth.Opcode
0x5f
means it is in a "contiguous" space with the rest of thePUSH
implementations and potentially could share the implementation.Backwards Compatibility
This TIP introduces a new opcode which did not exists previously. Already deployed contracts using this opcode could change their behaviour after this TIP.
Test Cases
5F
-- successful execution, stack consist of a single item, set to zero5F5F..5F
(1024 times) -- successful execution, stack consists of 1024 items, all set to zero5F5F..5F
(1025 times) -- execution aborts due to out of stackSecurity Considerations
There is no security considerations.
The text was updated successfully, but these errors were encountered: