Skip to main content

EVM Compatibility

The eSpace implements an Ethereum Virtual Machine (EVM). Below are some differences between eSpace and Ethereum:

Transaction Type

Currently eSpace only support 155 type transaction. 1559 type transaction is not support.

EVM Opcodes

  • The BLOCKHASH opcode can only take NUMBER-1 as input. (Unlike Ethereum, which takes any integer in NUMBER-256 to NUMBER-1 as input). This is the only break opcode.

Block Time

The NUMBER opcode will return the tree-graph epoch number. As a result, block.number used in eSpace contracts will not grow at a stable and predictable rate, and so it might not be suitable for measuring time.

Block generate rate is 1.25s per block (mainnet), is same as Core Space Epoch time.

Contract Size

Contract max code size is 49152 double as Ethereum

Transaction Fees

  • No gas refund in SSTORE opcode and SUICIDE opcode.
  • The operations which occupy storage have a different gas cost.
    1. SSTORE costs 40000 gas (instead of 20000 gas in Ethereum) when changing a storage entry from zero to non-zero.
    2. When deploying a new contract, each byte costs 400 gas (instead of 200 gas in Ethereum).
    3. When creating a new account by CALL or SUICIDE, it consumes 50000 gas (instead of 25000 gas in Ethereum).
  • At most 1/4 of transaction gasLimit will be refund (if not used)

Transaction Gas limit

Only the block whose block height is a multiple of 5 can pack Ethereum type transaction. The total gas limit of these transaction cannot exceed half of the block gas limit (1500w).

EVM Precompiles

All standard precompiles are supported.

AddressIDNameSpecStatus
0x01ECRecoverECDSA public key recoveryYellow Paper
0x02SHA256SHA-2 256-bit hash functionYellow Paper
0x03RIPEMD160RIPEMD 160-bit hash functionYellow Paper
0x04IdentityIdentity functionYellow Paper
0x05ModExpBig integer modular exponentiationEIP-198
0x06BN128AddElliptic curve additionEIP-196
0x07BN128MulElliptic curve scalar multiplicationEIP-196
0x08BN128PairElliptic curve pairing checkEIP-197
0x09Blake2FBLAKE2b F compression functionEIP-152

Phantom transactions

A cross-space transaction is a transaction in the Conflux core space that, at some point during its execution, calls one of the state-changing (i.e., not view) methods of the CrossSpaceCall internal contract. Such transactions can change CFX balances and contract storage in both spaces, core and eSpace.

As EVM clients are not aware of Conflux space transactions (the two spaces use different transaction formats), we construct one or more phantom transactions (aka virtual transactions) for each call to the CrossSpaceCall internal contract. These phantom transactions are derived from the corresponding core space transaction, they do not exist in the ledger. Phantom transactions have the following special properties:

  • gas and gasPrice are 0. Gas for cross-space transactions is charged in the core space. Therefore, the corresponding phantom transactions do not consume any gas.
  • Invalid signature (r, s, v, standardV). The Conflux protocol is unable to sign transactions on behalf of the sender of the cross-space transaction. Therefore, phantom transactions use a fake signature that will not pass ECDSA verification.

Example

When we retrieve epoch 0x72819 in the Conflux core space, we see it contains a single Conflux transaction.

cfx_getBlockByEpochNumber(0x72819, true)

{
"epochNumber": "0x72819",
"hash": "0x7440c9e8ebb2e87a7d187e4ad6d09027d860b3948cf4364bb883c028b6c3a858",
"transactions": [
{
"hash": "0xe89ef4b61434ec331b621b8687033f9e4058e76759a3522bdc50e0cb358f505e",
"blockHash": "0x7440c9e8ebb2e87a7d187e4ad6d09027d860b3948cf4364bb883c028b6c3a858",
"from": "NET8888:TYPE.USER:AAJFT5SK5RGK2KTJPMPUEJ69989N15KCCY7JAJEUP2",
"to": "NET8888:TYPE.CONTRACT:ACAP3N9KXZ7C4TU5NUU8G65FJ7A09MG1FY77ZAYSVW",
"gasPrice": "0x1",
"gas": "0x8b28d",
"storageLimit": "0x54",
"r": "0x2b943e84111cd5f95fbdf15667329ac546c9e5b99548d3c3702aeced4f07de6d",
"s": "0x2f47ae3c15ec2d1cbcf5bde3870aa21e1df54e8b7b926840a54faa9951cb3321",
"v": "0x0",
...
}
],
...
}

When we retrieve the corresponding block in the eSpace, we see it contains two phantom transactions.

eth_getBlockByNumber(0x72819, true)

{
"hash": "0x7440c9e8ebb2e87a7d187e4ad6d09027d860b3948cf4364bb883c028b6c3a858",
"number": "0x72819",
"transactions": [
{
"hash": "0xfcdcf304b6b9dc263625b0924efaf3a7eb7044a17d27c0b8d631025b55d1147e",
"blockHash": "0x7440c9e8ebb2e87a7d187e4ad6d09027d860b3948cf4364bb883c028b6c3a858",
"from": "0x0000000000000000000000000000000000000000",
"to": "0xf709629eee416c2d2a53692d38f1568538d8022f",
"gasPrice": "0x0",
"gas": "0x0",
"r": "0x1",
"s": "0x1",
"v": "0x4593",
...
},
{
"hash": "0xca2f5c5848458bea556f99e626db7108377d600e24add1920c4106358a1a5502",
"blockHash": "0x7440c9e8ebb2e87a7d187e4ad6d09027d860b3948cf4364bb883c028b6c3a858",
"from": "0xf709629eee416c2d2a53692d38f1568538d8022f",
"to": "0xdacf3af269b55ece5fe3239626a27f2a76c48245",
"gasPrice": "0x0",
"gas": "0x0",
"r": "0x1",
"s": "0x1",
"v": "0x4593",
...
}
],
...
}