The copyright in this document is owned by Enterprise Ethereum Alliance Inc. (“EEA” or “Enterprise Ethereum Alliance”).
This Specification is copyright © 2018-2022 Enterprise Ethereum Alliance Incorporated (EEA). It is made available under the terms of the Apache License version 2.0. [[Apache2]]
This is an editors' draft of the Enterprise Ethereum Alliance Client Specification version 7. Changes made since version 6 of this Specification, released in November 2020, have been reviewed by the Enterprise Ethereum Alliance (EEA) Technical Specification Working Group (TSWG), but not the EEA Board. The TSWG expects at time of writing that this revision of the Specification will be released around the middle of 2022, obsoleting version 6. The group is also expecting to hear about further implementation experience, that could potentially lead to proposed modifications. This particularly applies to sections marked experimental: * The object syntax for recording changes to maxCodeSize * Asynchronous methods for private transactions The Working Group **expects** to remove any requirements for Unrestricted Private Transactions before publishing this draft as an EEA specification, and requests feedback on that proposal before April 25 Please send any comments to the EEA Technical Steering Committee at [https://entethalliance.org/contact/](https://entethalliance.org/contact/).Protocol requirements are requirements where the desired properties and correctness of the system can be jeopardized unless all clients implement the requirement correctly.
Client requirements do not impact global system behavior, but if not implemented correctly in a client, that client might not function correctly, or to a desirable level, in an Enterprise Ethereum blockchain.
However, some aspects of Ethereum in general, and Enterprise Ethereum specifically, are especially important in an organizational environment.
Permissioning plays some role in mitigating network-level attacks (like the 51% attack), but it is important to carefully consider which risks are of most concern to a client implementation versus those that are better mitigated by updates to the Ethereum consensus protocol design.
Wallets can interface with Enterprise Ethereum using the Extended RPC API, as shown in . A wallet can also interface directly with the enclave of a private transaction manager, or interface with public Ethereum.
A private transaction manager is a subsystem of an Enterprise Ethereum system for implementing privacy and permissioning.
Enterprise Ethereum inherits the smart contract tools used by public Ethereum. These tools include smart contract languages and associated developer tools, such as parsers, compilers, and debuggers, as well as methods used for security analysis and formal verification of smart contracts.
Enterprise Ethereum implementations enable use of these tools and methods through implementation of the Execution sublayer, as described in Section .
[P] SMRT-030: Enterprise Ethereum clients MUST support smart contracts of at least 24,576 bytes in size.
[P] SMRT-040: Enterprise Ethereum clients MUST read and enforce a size limit for transactions that deploy smart contracts from the maxCodeSize parameter in the network configuration, specified as a number of kilobytes as defined in the section below.
[P] SMRT-060: Enterprise Ethereum clients MUST read and enforce a size limit for transactions that deploy smart contracts from the maxCodeSize parameter in the network configuration, specified as a javascript object as defined in the section below.
See also [[CONFIG-010]](chainspec.html#req-config-010) in the Enterprise Ethereum Alliance Permissioned Blockchain specification [[EEA-chains]].The Tooling layer also provides support for the compilation, and possibly formal verification, of smart contracts through the use of parsers and compilers for one or more smart contract languages.
Smart contract languages are the programming languages, such as [[Solidity]] and [[LLL]], used to create smart contracts. For each language, tools can perform tasks such as compiling to EVM bytecode, static security checking, or formal verification.
Formal verification is the mathematical verification of the logical correctness of a smart contract designed to run in the EVM.
An Ethereum JSON-RPC API is used to communicate between ÐApps and nodes.
[P] JRPC-010: Enterprise Ethereum clients MUST provide support for the following Ethereum JSON-RPC API methods:
[P] JRPC-007: Enterprise Ethereum clients SHOULD implement [[JSON-RPC-API]] methods to be backward compatible with the definitions given in version e8e0771 of the Ethereum JSON-RPC API reference [[!JSON-RPC-API-5bdf414]], unless breaking changes were made and widely implemented for the health of the ecosystem. For example, to fix a major security or privacy problem.
[C] JRPC-015: Enterprise Ethereum clients MUST provide the capability to accept and respond to JSON-RPC method calls over a websocket interface.
[C] JRPC-040: Enterprise Ethereum clients MUST provide an
implementation of the debug_traceTransaction
method
[[debug-traceTransaction]] from the Go Ethereum Management API.
[C] JRPC-050: Enterprise Ethereum clients MUST implement the [[!JSON-RPC-PUB-SUB]] API.
[P] JRPC-070: Enterprise Ethereum clients implementing additional
nonstandard subscription types for the [[!JSON-RPC-PUB-SUB]] API MUST prefix
their subscription type names with a namespace prefix other than
eea_
.
[P] JRPC-080: Enterprise Ethereum clients must not use the prefix
eea_
for the names of [[JSON-RPC]] methods that are not defined
by this specification.
[P] JRPC-020: Enterprise Ethereum clients MUST implement at least one of the following extensions to create private transaction types defined in the Section :
[P] JRPC-025: Enterprise Ethereum clients MAY implement the following experimental extensions to create private transaction types defined in the Section :
[P] JRPC-030: The eea_sendTransactionAsync
,
eea_sendTransaction
,
eea_sendRawTransactionAsync
, and
eea_sendRawTransaction
methods MUST respond with a
[[JSON-RPC]] error response when an unimplemented private transaction
type is requested. The error response MUST have the code
-50100
and the message Unimplemented private
transaction type
.
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -50100, "message": "Unimplemented private transaction type" } }
[P] JRPC-035: If a restricted private transaction is requested
with values for both the privateFor and privacyGroupId parameters,
Enterprise Ethereum clients MUST return an error.
The error response MUST have the code -50100
and the
message Invalid private transaction parameters
.
privacyGroupId not supported
error response. The
`privacyGroupId` and `privateFor` parameters are mutually
exclusive. If both the `privacyGroupId` and `privateFor`
parameters are provided, an error response is generated.
- `restriction` STRING – If `restricted`, the transaction is a
restricted private transaction. For more information, see Section
.
**Returns**
DATA, 32 Bytes – The transaction hash.
If creating a contract, use `eea_getPrivateTransactionReceipt` to retrieve the
contract address after the transaction is finalized.
**Request Format**
```js
curl -X POST --data
'{"jsonrpc":"2.0","method":"eea_sendTransaction","params": [{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"data":
"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
"privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=",
"privateFor": ["g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="],
"restriction": "restricted"}],
"id":1}'
Or alternatively, when a privacyGroupId is provided instead of privateFor:
"privacyGroupId": "Vbj70zF+G2V/8XoyZzwqawfcQ+r9BkXoLQOqkQideys=",
```
**Response Format**
```js
{
"id":1,
"jsonrpc": "2.0",
"result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}
```
At the time of publication, the asynchronous methods to create private transactions are only known to be implemented by the Quorum client. The Working Groups is seeking feedback from developers about these asynchronous methods:
Please provide feedback through the EEA Technical Steering Committee at https://entethalliance.org/contact/.
privacyGroupId not supported
error response. The
`privacyGroupId` and `privateFor` parameters are mutually
exclusive. If both the `privacyGroupId` and `privateFor`
parameters are provided, an error response is generated.
- `restriction` STRING – If `restricted`, the transaction is a
restricted private transaction. For more information, see Section
.
- `callbackUrl` STRING – The URL to post the results of the transaction
to.
**Callback Body**
The callback object for this call contains:
- `txHash` DATA, 32 bytes – The transaction hash (if successful).
- `txIndex` QUANTITY – The index position, as an integer, of the
transaction in the block.
- `blockHash` DATA, 32 Bytes – The hash of the block this transaction was
in.
- `blockNumber` QUANTITY – The number of the block, as an integer, this
transaction was in.
- `from` DATA, 20 Bytes – The public key of the sender of this
private transaction.
- `to` DATA, 20 Bytes – The account address of the receiver. `null` if a
contract creation transaction.
- `cumulativeGasUsed` QUANTITY – The total amount of gas used when this
transaction was executed in the block.
- `gasUsed` QUANTITY – The amount of gas used by this specific
transaction.
- `contractAddress` DATA, 20 Bytes – The contract address created, if a
contract creation transaction, otherwise `null`.
- `logs` Array – An array of log objects generated by this transaction.
- `logsBloom` DATA, 256 Bytes – A bloom filter for light clients to
quickly retrieve related logs.
- `error` STRING – Optional. Includes an error message describing what went
wrong.
- `id` DATA – Optional. The ID of the request corresponding to this
transaction, as provided in the initial [[JSON-RPC]] call.
Also returned is either:
- `root` DATA, 32 bytes – The post-transaction stateroot (pre-Byzantium).
- `status` QUANTITY – The return status, either 1 (success) or 0 (failure).
**Request Format**
```js
curl -X POST --data
'{"jsonrpc":"2.0","method":"eea_sendTransactionAsync","params":[{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
"privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=",
"privateFor": ["g59BmTeJIn7HIcnq8VQWgyh/pDbvbt2eyP0Ii60aDDw="],
"callbackUrl": "http://myserver/id=1",
"restriction": "restricted"}],
"id":1}'
Or alternatively, when a privacyGroupId is provided instead of privateFor:
"privacyGroupId": "Vbj70zF+G2V/8XoyZzwqawfcQ+r9BkXoLQOqkQideys=",
```
**Response Format**
```js
{
"id":1,
"jsonrpc": "2.0"
}
```
**Callback Format**
```js
{
"txHash":
"0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
"txIndex": "0x1", // 1
"blockNumber": "0xb", // 11
"blockHash": "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b",
"cumulativeGasUsed": "0x33bc", // 13244
"gasUsed": "0x4dc", // 1244
"contractAddress": "0xb60e8dd61c5d32be8058bb8eb970870f07233155", // or null, if none was created
"logs": "[{
// logs as returned by getFilterLogs, etc.
}, ...]",
"logsBloom": "0x00...0", // 256 byte bloom filter
"status": "0x1"
}
```
The receipt is not available for pending transactions.
**Parameters** - `data` DATA, 32 bytes – hash of a transaction. ```js params: ["0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"] ``` **Returns** Object – A transaction receipt object, or `null` when no receipt was found: - `blockHash` DATA, 32 Bytes - Hash of block containing this transaction. - `blockNumber` QUANTITY - Block number of block containing this transaction. - `contractAddress` DATA, 20 Bytes – The contract address created, if a contract creation transaction, otherwise `null`. - `from` DATA, 20 Bytes – The public key of the sender of this private transaction. - `logs` Array – An array of log objects generated by this transaction. - `to` DATA, 20 Bytes – The address of the account receiving this transaction. `null` if a contract creation transaction. - `transactionHash` DATA, 32 Bytes - Hash of the private transaction. - `transactionIndex` QUANTITY, Integer - Index position of transaction in the block. - `revertReason` String - ABI-encoded string that displays the reason for reverting the transaction. Only available if revert reason is enabled - `output` DATA - RLP-encoded return value of a contract call if a value returns, otherwise, `null`. - `commitmentHash` DATA, 32 Bytes - Hash of the privacy marker transaction. - `status` QUANTITY - Either 1 (success) or 0 (failure). - `privateFrom` DATA, 32 Bytes - Private tranaction manager public key of the sender. - `privateFor` OR `privacyGroupId` Array OR DATA, 32 Bytes - List of private transaction manager public keys OR Privacy group ID of the recipients. - `logsBloom` DATA, 256 Bytes - Bloom filter for light clients to quickly retrieve related logs. **Request Format** ```js curl -X POST --data '{"jsonrpc":"2.0","method":"eea_getPrivateTransactionReceipt","params": [{see above}], "id":1}' ``` **Response Format** ```js { "jsonrpc": "2.0", "id": 1, "result": { "blockHash": "0xe7212a92cfb9b06addc80dec2a0dfae9ea94fd344efeb157c41e12994fcad60a", "blockNumber": "0x50", "contractAddress": "0x493b76031593402e24e16faa81f677b58e2d53f3", "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", "logs": [], "to": "0xf17f52151ebef6c7334fad080c5704d77216b732", "transactionHash": "0x36219e92b5f53d4150aa9ef7d2d793118cced523de6724100da5b534e3ceb4b8", "transactionIndex": "0x0", "output": "0x6080604052600436106049576000357c010000000000000000000000000000000000000000000 0000000000000900463ffffffff1680633fa4f24514604e57806355241077146076575b600080fd5b3480156059 57600080fd5b50606060a0565b6040518082815260200191505060405180910390f35b348015608157600080fd5b 50609e6004803603810190808035906020019092919050505060a6565b005b60005481565b8060008190555050560 0a165627a7a723058202bdbba2e694dba8fff33d9d0976df580f57bff0a40e25a46c398f8063b4c00360029", "commitmentHash": "0x79b9e6b0856db398ad7dc208f15b1d38c0c0b0c5f99e4a443a2c5a85510e96a5", "status": "0x1", "privateFrom": "negmDcN2P4ODpqn/6WkJ02zT/0w0bjhGpkZ8UP6vARk=", "privacyGroupId": "cD636RZlcqVSpoxT/ExbkWQfBO7kPAZO0QlWHErNSL8=", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } } ```It is based on a chain deployment architecture where permissioning is split into permissioning management, handled by one or more permissioning contracts on the Enterprise Ethereum blockchain, and permissioning enforcement, handled by the Enterprise Ethereum client based on information provided by the permissioning contract.
[P] PERM-300 permissioning contracts provided by an Enterprise Ethereum client SHOULD be certified as conforming to EthTrust Security Level 1, version 1 [[!EthTrust]].
[P] PERM-330 permissioning contracts provided by an Enterprise Ethereum client SHOULD be certified as conforming to EthTrust Security Level 3, version 1 [[!EthTrust]].
The EthTrust Security Levels specification [[!EthTrust]] defines a set of checks for audits of smart contract security. Testing to Level 1 typically requires an automated static analysis, for which a number tools are available. Level 3 implies testing that the contracts audited are fit their declared purpose and use exemplary coding practices in addition to a careful audit for complex security issues potentially beyond the reach of a static code analysis.Permissioning enforcement is performed to enforce the permissioning requirements of an Enterprise Ethereum blockchain. To obtain the information necessary to conduct enforcement, Enterprise Ethereum clients call specific functions in the permissioning contracts. These are common functions for all clients on the Enterprise Ethereum blockchain to use. The included functions are:
Node permissioning restricts the peer connections that can be established with other nodes in the Enterprise Ethereum blockchain. This helps to prevent interference and abuse by external parties and can establish a list of trusted nodes.
[P] PERM-200: Enterprise Ethereum clients MUST NOT allow an incoming connection from a node unless either:
This requirement allows a node to apply more restrictive rules about connections than those that cover the Enterprise Ethereum blockchain they are running. This means an organsation can run some nodes as validators allowing all authorised connections, and other nodes that only accept connections from nodes operated by that organisation.
The `connectionAllowed` function returns a `bytes32` type, which is interpreted as a bitmask with each bit representing a specific permission for the connection.[P] PERM-210: When Enterprise ethereum clients call connectionAllowed, if the response is `false`, Enterprise Ethereum clients MUST reject the connection.
[P] PERM-220: On receipt of a NodePermissionsUpdated event
containing an addsRestrictions property with the value
true
, Enterprise Ethereum clients MUST:
[P] PERM-230: On receipt of a NodePermissionsUpdated event
containing an addsPermissions property with the value
true
, Enterprise Ethereum clients MUST:
Interface [ { "name": "connectionAllowed", "stateMutability": "view", "type": "function", "inputs": [ { "name": "sourceEnode", "type": "string" }, { "name": "source", "type": "string" }, { "name": "sourceEnodePort", "type": "uint16" } ], "outputs": [ { "name": "result", "type": "bool" } ] }, { "type": "event", "name": "NodePermissionsUpdated", "inputs": [ { "name": "addsRestrictions", "type": "bool", "indexed": false }, { "name": "addsPermissions", "type": "bool", "indexed": false }, { "name": "enodeId", "type": "string", "indexed": false }, { "name": "source", "type": "string", "indexed": false }, { "name": "port", "type": "uint16", "indexed": false }, { "name": "raftport", "type": "uint16", "indexed": false }, { "name": "orgId", "type": "string", "indexed": false } ] } ]**Arguments** - `sourceEnode`: The enode address of the node initiating the connection. - `source`: A DNS name of the node initiating the connection. - `sourceEnodePort`: The peer-to-peer listening port of the node initiating the connection. **Event parameters** - `addsRestrictions`: If the rules change that caused the NodePermissionsUpdated event to be emitted involves further restricting existing permissions, this will be `true`, otherwise `false`. - `addsPermissions`: If the rules change that caused the NodePermissionsUpdated event to be emitted involves granting new permissions, this will be `true`, otherwise `false`. - `enodeId`: The enode address of the node for which the permissions have changed. - `source`: The valid host string [[!url]] of the node whose permissions have changed. - `port`: The peer-to-peer listening port of the node for which the permissions have changed. - `raftport`: If using raft as consensus protocol, the raft port of the node for which the permissions have changed. - `orgId`: If using organizations, the relevant organization ID. **Returns** - `result`: A boolean value, where `true` represents granting permissions for a node to access the network.
Account permissioning controls which accounts are able to send transactions and the type of transactions permitted.
[P] PERM-240: Enterprise Ethereum clients MUST NOT accept a transaction unless either:
true
;true
,
andtrue
.
[P] PERM-250: On receipt of an AccountPermissionsUpdated event
containing an addsRestrictions property with the value
true
, Enterprise Ethereum clients MUST:
[P] PERM-260: On receipt of an AccountPermissionsUpdated event
containing an addsPermissions property with the value
true
, Enterprise Ethereum clients MUST:
Interface [ { "name": "transactionAllowed", "stateMutability": "view", "type": "function", "inputs": [ { "name": "sender", "type": "address" }, { "name": "target", "type": "address" }, { "name": "value", "type": "uint256" }, { "name": "gasPrice", "type": "uint256" }, { "name": "gasLimit", "type": "uint256" }, { "name": "payload", "type": "bytes" } ], "outputs": [ { "name": "result", "type": "bool" } ] }, { "type": "event", "name": "AccountPermissionsUpdated", "inputs": [ { "name": "addsRestrictions", "type": "bool", "indexed": false }, { "name": "addsPermissions", "type": "bool", "indexed": false } ] } ]**Arguments** - `sender`: The address of the account that created this transaction. - `target`: The address of the account or contract that this transaction is directed at. For a creation contract where there is no target, this should be zero filled to represent the `null` address. - `value`: The eth value being transferred in this transaction, specified in Wei (10-18 ETH). - `gasPrice`: The gas price included in this transaction, specified in Wei (10-18 ETH). - `gasLimit`: The gas limit in this transaction, specified in Wei (10-18 ETH). - `payload`: The payload in this transaction. Either empty if a simple value transaction, the calling payload if executing a contract, or the EVM code to be deployed for a contract creation. - `addsRestrictions`: If the rules change that caused the AccountPermissionsUpdated event to be emitted involves further restricting existing permissions, this will be `true`. - `addsPermissions`: If the rules change that caused the AccountPermissionsUpdated event to be emitted grants new permissions, this will be `true`. **Return value** - boolean `result`, where a value of `true` means the account submitting the transaction has permission to submit it, and `false` meaning the account does not.
Privacy, performance, and permissioning are the "3 P's" of Enterprise Ethereum. This section describes the extensions in Enterprise Ethereum that support these requirements.
Privacy and performance solutions are broadly categorized into:
Enterprise Ethereum clients support privacy with techniques such as private transactions and enabling an Enterprise Ethereum blockchain to permit anonymous participants. Clients can also support privacy-enhanced Off-chain trusted computing.
New privacy mechanisms are are also being explored as extensions to public Ethereum, including zero-knowledge proofs [[ZKP]], which is a cryptographic technique where one party (the prover) can prove to another party (the verifier) that the prover knows a value x, without conveying any information apart from the fact that the prover knows the value. [[ZK-STARKS]] is an example of a zero-knowledge proof method. A transaction is a request to execute operations on a blockchain that change the state of one or more accounts. Transactions are a core component of most blockchains, including public Ethereum and Enterprise Ethereum. Nodes processing transactions is the fundamental basis of adding blocks to the chain. A private transaction is a transaction where some information about the transaction, such as the payload data, or the sender or the recipient, is only available to the subset of parties privy to that transaction.Enterprise Ethereum clients support at least one form of private transactions, as outlined in Section . Private transactions can be realized in various ways, controlling which nodes see which private transactions or transaction data.
Enterprise Ethereum implementations can also support off-chain trusted computing, enabling privacy during code execution.
[P] PRIV-220: Enterprise Ethereum clients SHOULD enable encryption of all data
stored by the client.
Since some users will prefer to use a system-wide functionality
to do this, a good implementation will support that choice.
Off-chain trusted computing uses a privacy-enhanced system to handle some of the computation requested by a transaction. Such systems can be hardware-based, software-based, or a hybrid, depending on the use case.
The EEA has developed Trusted Computing APIs for Ethereum-compatible trusted computing [[EEA-OC]].
The `privateFrom` and `privateFor` parameters in the `eea_sendTransactionAsync` and `eea_sendTransaction` calls specify the public keys of the sender and the intended recipients, respectively, of a private transaction. The private transaction type is specified using the `restriction` parameter. The only type of private transaction defined as required is Restricted private transactions, where payload data is transmitted to and readable only by the parties to the transaction.
Note also that several storage requirements apply to private transactions.[P] PRIV-010: Enterprise Ethereum clients MUST support restricted private transactions.
Transaction information consists of two parts:
[P] PRIV-005: Enterprise Ethereum clients MUST implement the method to return receipts for restricted private transactions.
[P] PRIV-011: Enterprise Ethereum clients MUST use the SHA3-512 algorithm [[!SHA3]] to calculate hashes of the payload in restricted private transactions.
[P] PRIV-020: Enterprise Ethereum clients MUST encrypt payload data when stored in restricted private transactions.
[P] PRIV-030: Enterprise Ethereum clients MUST encrypt payload data when in transit in restricted private transactions.
[P] PRIV-050: Enterprise Ethereum clients MAY encrypt metadata when in transit in restricted private transactions.
[P] PRIV-060: Nodes that relay a restricted private transaction, but are not party to that transaction, MUST NOT store the payload data.
[P] PRIV-070: Nodes that relay a restricted private transaction, but are not party to that transaction, SHOULD NOT store the metadata.
[P] PRIV-080: The implementation of the
eea_sendTransactionAsync
,
eea_sendTransaction
,
eea_sendRawTransactionAsync
, or
eea_sendRawTransaction
methods (see Section ) with the
restriction
parameter set to restricted
, MUST
result in a restricted private transaction.
[P] PRIV-180: Enterprise Ethereum clients SHOULD be able to extend the set of parties privy to a private transaction (or forward the private transaction in some way).
[P] PRIV-190: Enterprise Ethereum clients SHOULD provide the ability for nodes to achieve consensus on their mutually private transactions.
Performance is an important requirement for Enterprise Ethereum clients because many use cases for Enterprise Ethereum blockchains imply a high volume of transactions, or computationally-heavy tasks. The overall performance of a blockchain is constrained by the slowest node.
There are many different aspects of performance, and instead of mandating specific requirements, this Specification notes the importance of performance, leaving Enterprise Ethereum client developers free to implement whatever strategies are appropriate for their software. This Specification does not constrain experimentation to improve the performance of Enterprise Ethereum clients. This is an active area of research and it is likely various techniques to improve performance will be developed over time, which cannot be exactly predicted.This Specification does mandate or allow for several optimizations to improve performance. The most important techniques maximize the throughput of transactions.
Techniques to improve performance through scaling are valuable for blockchains where processing is kept on the blockchain and have high transaction throughput requirements.
On-chain (layer 1) scaling techniques, like [[sharding]], are changes or extensions to the public Ethereum protocol to facilitate increased transaction speeds.
On-chain (layer 2) scaling techniques use smart contracts, and approaches like [[Plasma]], or [[state-channels]], to increase transaction speed without changing the underlying Ethereum protocol. For more information, see [[Layer2-Scaling-Solutions]].
Off-chain computing can be used to increase transaction speeds by moving the processing of computationally-intensive tasks from nodes processing transactions to one or more trusted computing services. This reduces the resources needed by nodes, allowing them to produce blocks faster.
Permissioning is the property of a system that ensures operations are executed by and accessible to designated parties. For Enterprise Ethereum, permissioning refers to the ability of a node to join an Enterprise Ethereum blockchain, and the ability of individual accounts or nodes to perform specific functions. For example, an Enterprise Ethereum blockchain might allow only certain nodes to act as validators, and only certain accounts to instantiate smart contracts.
Enterprise Ethereum provides a permissioned implementation of Ethereum supporting peer node connectivity permissioning, account permissioning, and transaction type permissioning.
[C] NODE-010: Enterprise Ethereum implementations MUST provide the ability to specify at startup a list of static peer nodes to establish peer-to-peer connections with.
[C] NODE-020: Enterprise Ethereum clients MUST provide the ability to enable or disable peer-to-peer node discovery.
[P] NODE-090: Enterprise Ethereum clients SHOULD implement transaction ordering according to the "by Price and by Nonce" algorithm, sorting transactions by price while respecting the nonce ordering for each account.
[P] NODE-095: Enterprise Ethereum clients MUST specify explicitly and precisely in documentation any transaction ordering logic that is different from that recommended in NODE-090.
[P] PART-010: Enterprise Ethereum clients MUST provide the ability to specify a list of accounts that are permitted to transact with the blockchain.
[P] PART-015: Enterprise Ethereum clients MUST be able to verify that accounts are present on the list required by PART-010 when adding transactions from the account to a block, and when verifying a received block containing transactions created by that account.
Private State is the state data that is not shared in the clear in the globally replicated state tree. This data can represent bilateral or multilateral arrangements between parties, for example in private transactions.
[P] STOR-040: Enterprise Ethereum clients SHOULD permit a smart contract operating on private state to access private state created by other smart contracts involving the same parties to the transaction.
[P] STOR-050: Enterprise Ethereum clients MUST NOT permit access to private state created by smart contracts except by parties to the transaction.
[P] STOR-070: Enterprise Ethereum clients SHOULD encrypt any private state held in persistent storage.
[P] EXEC-010: Enterprise Ethereum clients MUST provide a smart contract execution environment implementing the public Ethereum EVM opcode set [[!EVM-Opcodes]] that are compatible with the London network upgrade [[!ef-London]].
[P] EXEC-020: Enterprise Ethereum clients that provide a smart contract execution environment extending the public Ethereum EVM opcode set [[!EVM-Opcodes]] MUST register the opcode and the name of the Enterprise Ethereum client in the [[!EEA-extended-opcode-registry]].
[P] EXEC-025: Enterprise Ethereum clients that provide a smart contract execution environment extending the public Ethereum EVM opcode set [[!EVM-Opcodes]] SHOULD register a description of the new functionality, and a URL for a complete specification and test suites in the [[!EEA-extended-opcode-registry]], and create an EIP describing the new opcode.
[P] EXEC-030: Enterprise Ethereum clients SHOULD support the ability to synchronize their public state with the public state held by other public Ethereum nodes.
Trusted computing ensures only authorized parties can execute smart contracts on an execution environment available to a given Enterprise Ethereum blockchain.
Multiple encryption techniques can be used to secure trusted computing and private state.[C] EXEC-060: Enterprise Ethereum clients MAY support configurable alternative cryptographic curves as encryption options for Enterprise Ethereum blockchains.
[P] CONS-092: Enterprise Ethereum clients MUST support the QBFT Byzantine Fault Tolerant consensus algorithm [[!QBFT]].
[P] CONS-093: Enterprise Ethereum clients MUST support the Clique, Proof of Authority consensus algorithm [[EIP-225]].
[P] CONS-110: Enterprise Ethereum clients MUST provide the ability to specify the consensus algorithms, through network configuration, to be used for each public blockchain and private blockchain in use.
[P] PROT-010: Nodes MUST be identified and advertised using the Ethereum [[!enode]] URL format.
[P] PROT-015: Enterprise Ethereum clients MUST implement the [[!DEVp2p-Node-Discovery]] protocol.
The [[Ethereum-Wire-Protocol]] defines higher layer protocols, known as capability protocols, for messaging between nodes to exchange status, including block and transaction information. [[Ethereum-Wire-Protocol]] messages are sent and received over an already established DEVp2p connection between nodes.
[P] PROT-020: Enterprise Ethereum clients MUST use the [[!DEVp2p-Wire-Protocol]] for messaging between nodes to establish and maintain a communications channel for use by capability protocols.
[P] PROT-050: Enterprise Ethereum clients MUST be capable of making direct connections to any number of nodes specified as participants in a private transaction.
[P] PROT-060: Enterprise Ethereum clients SHOULD implement the [[!Whisper-protocol]].
[P] PROT-070: Enterprise Ethereum clients MUST interpret the parameters defined in Section for network configuration when found in the genesis file.
Network configuration
refers to the collection of settings defined for a blockchain as described in
Section , such as the addresses of the
permissioning contracts. It is a set of parameters included as JSON data
in the genesis file (genesis.json
).
[P] XCLI-001: Enterprise Ethereum clients MUST implement [[!EIP-155]] (included in the Spurious Dragon hard fork) to introduce `chain_id` into transaction signing.
[P] XCLI-002: Enterprise Ethereum clients MUST implement [[!EIP-658]] (included in the Byzantium hard fork) to embed the transaction status code in receipts.
[P] XCLI-004: Enterprise Ethereum clients MUST implement the Typed Transaction Envelope defined in [[!EIP-2718]].
[P] XCLI-006: Enterprise Ethereum clients MUST implement the Access List transaction type defined in [[!EIP-2930]].
[P] XCLI-006: Enterprise Ethereum clients MUST reject contracts whose first byte has the hexadecimal value `EF`, as specified in [[!EIP-3541]].
Future versions of this Specification are expected to align with newer versions of public Ethereum as they are deployed.
This Specification extends the capabilities and interfaces of public Ethereum. The requirements relating to supporting and extending the public Ethereum opcode set are outlined in Section .[P] XCLI-020: Enterprise Ethereum clients MAY extend the public Ethereum APIs. To maintain compatibility, Enterprise Ethereum clients SHOULD ensure these new features are a superset of the public Ethereum APIs.
[P] XCLI-030: Enterprise Ethereum clients MUST implement the gas mechanism specified in the [[!Ethereum-Yellow-Paper]].
[P] XCLI-035: Enterprise Ethereum clients MUST implement the same gas cost per opcode used in the main net's London hard fork. [[!ef-London]].
[P] XCLI-040: Enterprise Ethereum clients MUST function correctly when the Gas price is set to zero.
[P] XCLI-050: Enterprise Ethereum clients MUST implement the eight precompiled contracts defined in Appendix E of the [[!Ethereum-Yellow-Paper]]:
[P] XCLI-051: Enterprise Ethereum clients MUST implement the precompiled contract for [[!RFC7693]] Blake 2b F compression defined in [[!EIP-152]]
[P] XCLI-055: Enterprise Ethereum clients MUST register precompiled contracts following the mechanisms defined by [[!EIP-1352]].
[P] XCLI-060: Enterprise Ethereum clients MUST support the Contract Application Binary Interface ([[!ABI]]) for interacting with smart contracts.
[P] XCLI-070: Enterprise Ethereum clients MUST support Recursive Length Prefix ([[!RLP]]) encoding for binary data.
[C] MTRC-010: Enterprise Ethereum clients MUST implement [[!EIP-2159]].
EIP 2159 mandates that certain metrics information is available in a commonly-used format: - `ethereum_blockchain_height` - `ethereum_best_known_block_number` - `ethereum_peer_count` - `ethereum_peer_limit`Cross-chain interoperability broadly refers to the ability to consume data from another chain (read) and to cause an update or another transaction on a distinct chain (write).
Cross-chain interoperability can take two forms: - Ethereum to Ethereum (for example, two or more logically distinct EVM-based chains) - Ethereum to another blockchain architecture. Cross-chain interoperability is seen as a valuable feature by both the Enterprise Ethereum community and outside. Users of blockchain and blockchain-inspired platforms want to make use of data and functionality on heterogenous platforms. The goals for cross-chain interoperability in this specification are to: - Describe the layers of interoperability that are relevant to Enterprise Ethereum blockchains. - Enable data consumption between different blockchains without using a trusted intermediary. - Allow transaction execution across blockchains without a trusted intermediary.The following is a list of terms defined in this Specification.
The following is a list of events, functions, and parameters defined in this Specification: