ethereum-api

Solidity API contract design information for utilizing RPC/RESTful Node Interaction and GraphQL

Stars
23

:url-project: https://sambacha.github.io/besu-api :url-docs: https://sambacha.github.io/besu-api :url-org: https://sambacha.github.io/ :url-group: {url-org}/besu-api :url-site-readme: {url-group}/besu-api/blob/master/README.adoc :url-besu: https://besu.hyperledger.org/ :public-key: /gpg/6F6EB43E.asc :active-key: {url-group}{public-key} :docbook:

:toc: = API-first Smart Contract Design

== Run JSON RPC in Postman

image::https://run.pstmn.io/button.svg[link="https://god.postman.co/run-collection/1231c564d4789c586507"]

== View the JSON RPC API

link:https://api.besu.io[View Postman Catalog]

link:https://sambacha.github.io/besu-api/[View the JSON RPC Catalog]

:description: Optimizing solidity contracts for API access, focusing on Hyperledger Besu

3 Main Ways of Designing an API for Contract Interaction

  • Direct RPC / IPC (e.g. direct polling to a client such as Geth)
  • 3rd Party Provider (e.g. Infura/Alchemey/Quicknode) also The Graph.
  • Middleware Client (e.g. Kafka Broker or some other MQ)

== Service Providers

link:https://dashboard.alchemyapi.io/signup?referral=496d4069-ca19-4c95-9cee-cd15c699a355[Alchemyapi Referral]

== Schemas

Use these to help design how to best interact with a node

  • Truffle Contract Object
  • Chain State
  • Sample Postman API's
  • Besu RPC Postman Deff.

== Connectivity to Ethereum Mainnet

=== Cloudflare JSON-RPC Gateway

link:cloudflare-eth.com/[cloudflare-eth.com]

link:https://www.cloudflare.com/distributed-web-gateway/#ethereum-gateway[cloudflare.com/distributed-web-gateway/#ethereum-gateway]

==== Setup DNS Go to your DNS settings for your domain. If your website is on Cloudflare, the DNS settings are accessible from your dashboard. If your website is not on Cloudflare, and you need help finding the DNS records, see here.

==== Create CNAME Record Pointing to https://cloudflare-eth.com/

Add a CNAME record from your domain (e.g. www.example.com) to cloudflare-eth.com Note: if your website is on Cloudflare, the little cloud next to this record will automatically turn gray. Because you’ve CNAME’d to our gateway, you’ll automatically receive Cloudflare's enterprise-level performance and security enhancements, but you won’t be able to control those settings yourself.

Once you have added those records:

  • Type your domain name (e.g. www.example.com) into the text box below and click "Submit".

This will generate an SSL certificate, which will allow traffic from your domain to be served securely over HTTPS. Be prepared to wait up to 90 seconds. You will receive a confirmation message when the certificate has been successfully issued. When this has been issued, then any Ethereum RPC query to your website will automatically resolve to https://cloudflare-eth.com/ and the response will be served from the Ethereum network.

Note: Ensure you have configured any CAA Policies to enable Cloudflare to issue a certificate

== API Design Overview

  • JSON RPC
  • RESTful API
  • GraphQL

Transaction mining causes smart contracts to emit events and write logs to the blockchain.

The smart contract address is the link to the logs and the blockchain includes the logs, but contracts cannot access logs. Log storage is cheaper than contract storage (that is, it costs less gas) so storing and accessing the required data in logs reduces the cost. For example, use logs to display all transfers made using a specific contract, but not the current state of the contract.

A Dapp front end can either access logs using the xref:../HowTo/Interact/Filters/Accessing-Logs-Using-JSON-RPC.adoc[JSON-RPC API filter methods] or subscribe to logs using the link:../HowTo/Interact/APIs/RPC-PubSub.md#logs[RPC Pub/Sub API].

Use link:../Reference/API-Methods.md#admin_generatelogbloomcache[admin_generateLogBloomCache] to improve log retrieval performance.

== Events in Solidity

Solidity provides two types of events, anonymous and non-anonymous. The default is non-anonymous, and most developers will not need to worry about anonymous events.

For non-anonymous events, up to 3 topics may be indexed (instead of 4), since the first topic is reserved to specify the event signature. This allows non-anonymous events to always be filtered by their event signature.

This topic hash is always in the first slot of the indexed data, and is computed by normalizing the Event signature and taking the keccak256 hash of it.

For anonymous events, up to 4 topics may be indexed, and there is no signature topic hash, so the events cannot be filtered by the event signature.

Each additional indexed property is processed depending on whether its length is fixed or dynamic.

For fixed length types (e.g. uint, bytes5), all of which are internally exactly 32 bytes (shorter types are padded with zeros; numeric values are padded on the left, data values padded on the right), these are included directly by their actual value, 32 bytes of data.

For dynamic types (e.g. string, uint256[]) , the value is hashed using keccak256 and this hash is used.

Because dynamic types are hashed, there are important consequences in parsing events that should be kept in mind. Mainly that the original value is lost in the event. So, it is possible to tell is a topic is equal to a given string, but if they do not match, there is no way to determine what the value was.

If a developer requires that a string value is required to be both able to be filtered and also able to be read, the value must be included in the signature twice, once indexed and once non-indexed (e.g. someEvent(string indexed searchBy, string clearText)).

For a more detailed description, please refer to the https://docs.soliditylang.org/en/v0.8.1/abi-spec.html#events Solidity Event Documentation

=== Example of Event Indexing

[source, javascript]

// Short example of manually creating filters for an ERC-20 // Transfer event. // // Most users should generally use the Contract API to // compute filters, as it is much simpler, but this is // provided as an illustration for those curious. See // below for examples of the equivalent Contract API.

// ERC-20: // Transfer(address indexed src, address indexed dst, uint val // // -------------------^ // ----------------------------------------^ // // Notice that only src and dst are indexed, so ONLY they // qualify for filtering. // // Also, note that in Solidity an Event uses the first topic to // identify the Event name; for Transfer this will be: // id("Transfer(address,address,uint256)") // // Other Notes: // - A topic must be 32 bytes; so shorter types must be padded

// List all token transfers from myAddress filter = { address: tokenAddress, topics: [ id("Transfer(address,address,uint256)"), hexZeroPad(myAddress, 32) ] }

// List all token transfers to myAddress: filter = { address: tokenAddress, topics: [ id("Transfer(address,address,uint256)"), null, hexZeroPad(myAddress, 32) ] }

// List all token transfers to myAddress or myOtherAddress:
filter = {
address: tokenAddress,
topics: [
id("Transfer(address,address,uint256)"),
null,
[
hexZeroPad(myAddress, 32),
hexZeroPad(myOtherAddress, 32),
]
]
}

== DotEnv Configuration

These settings directly affect query/response time for Hyperledger Besu

[source, cfg]

BLOCKS_PER_BLOOM_CACHE=
export BESU_OPTS="--add-opens java.base/sun.security.provider=ALL-UNNAMED"
set BESU_OPTS="--add-opens java.base/sun.security.provider=ALL-UNNAMED"
BLOCKS_PER_BLOOM_CACHE
BESU_AUTO_LOG_BLOOM_CACHING_ENABLED=false
BESU_KEY_VALUE_STORAGE=rocksdb
BESU_LOGGING=DEBUG

== Topics

Log entries contain up to four topics. The first topic is the <<event-signature-hash,event signature hash>> and up to three topics are the indexed <<event-parameters,event parameters>>.

Example 1

A log entry for an event with one indexed parameter:

[source,json]

{
"logIndex": "0x0",
"removed": false,
"blockNumber": "0x84",
"blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336",
"transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a",
"transactionIndex": "0x0",
"address": "0x42699a7612a82f1d9c36148af9c77354759b210b",
"data": "0x",
"topics": [
"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3",
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
}

== Event parameters

Up to three event parameters can have the indexed attribute. Logs store these indexed parameters as topics. Indexed parameters are searchable and filterable.

Topics are 32 bytes. If an indexed argument is an array (including string and byte datatypes), the log stores the keccak-256 hash of the paramater as a topic.

Log data includes non-indexed parameters but is difficult to search or filter.

Example 2

A Solidity contract storing one indexed and one non-indexed parameter and has an event emitting the value of each parameter:

  • Storage.sol:

[source, solidity]

pragma solidity ^0.5.1; contract Storage { uint256 public valueIndexed; uint256 public valueNotIndexed;

event Event1(uint256 indexed valueIndexed, uint256 valueNotIndexed);

function setValue(uint256 _valueIndexed, uint256 _valueNotIndexed) public {
valueIndexed = _valueIndexed;
valueNotIndexed = _valueNotIndexed;
emit Event1(_valueIndexed, _valueNotIndexed);
}
}

Example 3

A log entry created by invoking the contract in the previous example with valueIndexed set to 5 and valueNotIndexed set to 7:

[source,json]

{
"logIndex": "0x0",
"removed": false,
"blockNumber": "0x4d6",
"blockHash": "0x7d0ac7c12ac9f622d346d444c7e0fa4dda8d4ed90de80d6a28814613a4884a67",
"transactionHash": "0xe994022ada94371ace00c4e1e20663a01437846ced02f18b3f3afec827002781",
"transactionIndex": "0x0",
"address": "0x43d1f9096674b5722d359b6402381816d5b22f28",
"data": "0x0000000000000000000000000000000000000000000000000000000000000007",
"topics": [
"0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8",
"0x0000000000000000000000000000000000000000000000000000000000000005"
]
}

== Event signature hash

The first topic in a log entry is always the event signature hash. The event signature hash is a keccak-256 hash of the event name and input argument types, with argument names ignored. For example, the event Hello(uint256 worldId) has the signature hash keccak('Hello(uint256)'). The signature identifies to which event log topics belong.

Example 4

A Solidity contract with two different events:

  • Storage.sol:

[source, solidity]

pragma solidity ^0.5.1;

contract Storage {

uint256 public valueA; uint256 public valueB;

 event Event1(uint256 indexed valueA);
 event Event2(uint256 indexed valueB);

 function setValue(uint256 _valueA) public {
   valueA = _valueA;
   emit Event1(_valueA);
 }

 function setValueAgain(uint256 _valueB) public {
   valueB = _valueB;
   emit Event2(_valueB);
 }

}

The event signature hash for event 1 is keccak('Event1(uint256)') and the event signature hash for event 2 is keccak('Event2(uint256)'). The hashes are:

  • 04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3 for event 1
  • 06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e for event 2.

Informative

You can use a library keccak (sha3) hash function, such as provided in Web3.js, or an online tool, such as link:https://emn178.github.io/online-tools/keccak_256.html, to generate event signature hashes.

Example 5

Log entries from invoking the Solidity contract in the previous example:

[source, json]

[
{
"logIndex": "0x0",
"removed": false,
"blockNumber": "0x84",
"blockHash": "0x5fc573d76ec48ec80cbc43f299ebc306a8168112e3a4485c23e84e9a40f5d336",
"transactionHash": "0xcb52f02342c2498df82c49ac26b2e91e182155c8b2a2add5b6dc4c249511f85a",
"transactionIndex": "0x0",
"address": "0x42699a7612a82f1d9c36148af9c77354759b210b",
"data": "0x",
"topics": [
"0x04474795f5b996ff80cb47c148d4c5ccdbe09ef27551820caa9c2f8ed149cce3",
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
},
{
"logIndex": "0x0",
"removed": false,
"blockNumber": "0x87",
"blockHash": "0x6643a1e58ad857f727552e4572b837a85b3ca64c4799d085170c707e4dad5255",
"transactionHash": "0xa95295fcea7df3b9e47ab95d2dadeb868145719ed9cc0e6c757c8a174e1fcb11",
"transactionIndex": "0x0",
"address": "0x42699a7612a82f1d9c36148af9c77354759b210b",
"data": "0x",
"topics": [
"0x06df6fb2d6d0b17a870decb858cc46bf7b69142ab7b9318f7603ed3fd4ad240e",
"0x0000000000000000000000000000000000000000000000000000000000000002"
]
}
]

== Topic filters

link:../Reference/API-Objects.md#filter-options-object[Filter options objects] have a topics key to filter logs by topics.

Topics are order-dependent. A transaction with a log containing topics [A, B] matches with the following topic filters:

  • [] - Match any topic
  • [A] - Match A in first position
  • [[null], [B]] - Match any topic in first position AND B in second position
  • [[A],[B]] - Match A in first position AND B in second position
  • [[A, C], [B, D]] - Match (A OR C) in first position AND (B OR D) in second position.

Example 6

The following filter option object returns log entries for the Event Parameters example contract with valueIndexed set to 5 or 9:

[source, json]

{
"fromBlock":"earliest",
"toBlock":"latest",
"address":"0x43d1f9096674b5722d359b6402381816d5b22f28",
"topics":[
["0xd3610b1c54575b7f4f0dc03d210b8ac55624ae007679b7a928a4f25a709331a8"],
["0x0000000000000000000000000000000000000000000000000000000000000005", "0x0000000000000000000000000000000000000000000000000000000000000009"]
]
}

== Hyperledger Besu EVM API Objects

The following objects are parameters for or returned by Besu API methods.

=== Block object

Returned by link:API-Methods.md#eth_getblockbyhash[eth_getBlockByHash] and link:API-Methods.md#eth_getblockbynumber[eth_getBlockByNumber].

|=== | Key | Type | Value

| number | Quantity, Integer | Block number. null when block is pending.

| hash | Data, 32 bytes | Hash of the block. null when block is pending.

| parentHash | Data, 32 bytes | Hash of the parent block.

| nonce | Data, 8 bytes | Hash of the generated proof of work. null when block is pending.

| sha3Uncles | Data, 32 bytes | SHA3 of the uncle's data in the block.

| logsBloom | Data, 256 bytes | Bloom filter for the block logs. null when block is pending.

| transactionsRoot | Data, 32 bytes | Root of the transaction trie for the block.

| stateRoot | Data, 32 bytes | Root of the final state trie for the block.

| receiptsRoot | Data, 32 bytes | Root of the receipts trie for the block.

| miner | Data, 20 bytes | Address to pay mining rewards to.

| difficulty | Quantity, Integer | Difficulty for this block.

| totalDifficulty | Quantity, Integer | Total difficulty of the chain until this block.

| extraData | Data | Extra data field for this block. The first 32 bytes is vanity data you can set using the link:../Reference/CLI/CLI-Syntax.md#miner-extra-data[--miner-extra-data] command line option. Stores extra data when used with link:../HowTo/Configure/Consensus-Protocols/Clique.md#genesis-file[Clique] and link:../HowTo/Configure/Consensus-Protocols/IBFT.md#genesis-file[IBFT].

| size | Quantity, Integer | Size of block in bytes.

| gasLimit | Quantity | Maximum gas allowed in this block.

| gasUsed | Quantity | Total gas used by all transactions in this block.

| timestamp | Quantity | Unix timestamp for block assembly.

| transactions | Array | Array of <<transaction-object,transaction objects>>, or 32 byte transaction hashes depending on the specified boolean parameter.

| uncles | Array | Array of uncle hashes. |===

= Filter options object

Parameter for link:API-Methods.md#eth_newfilter[eth_newFilter], link:API-Methods.md#eth_getlogs[eth_getLogs], and link:API-Methods.md#priv_getlogs[priv_getLogs]. Used to link:../HowTo/Interact/Filters/Accessing-Logs-Using-JSON-RPC.xml[filter logs].

|=== | Key | Type | Required/Optional | Value |

| fromBlock | Quantity | Tag | Optional | Integer block number or latest, pending, earliest. See link:../HowTo/Interact/APIs/Using-JSON-RPC-API.md#block-parameter[Block Parameter]. Default is latest.

| toBlock | Quantity | Tag | Optional | Integer block number or latest, pending, earliest. See link:../HowTo/Interact/APIs/Using-JSON-RPC-API.md#block-parameter[Block Parameter]. Default is latest.

| address | Data | Array | Optional | Contract address or array of addresses from which link:../Concepts/Events-and-Logs.xml[logs] originate.

| topics | Array of Data, 32 bytes each | Optional | Array of topics by which to link:../Concepts/Events-and-Logs.md#topic-filters[filter logs]. | |===

link:API-Methods.md#eth_getlogs[eth_getLogs] and link:API-Methods.md#priv_getlogs[priv_getLogs] have an extra key.

|=== | Key | Type | Required/Optional | Value

| blockhash | Data, 32 bytes | Optional. | Hash of block for which to return logs. If you specify blockhash, you cannot specify fromBlock and toBlock. |===

= Log object

Returned by link:API-Methods.md#eth_getfilterchanges[eth_getFilterChanges] and link:API-Methods.md#priv_getlogs[priv_getLogs]. <<transaction-receipt-object,Transaction receipt objects>> can contain an array of log objects.

|=== | Key | Type | Value

| removed | Tag | true if log removed because of a chain reorganization. false if a valid log.

| logIndex | Quantity, Integer | Log index position in the block. null when log is pending.

| transactionIndex | Quantity, Integer | Index position of the starting transaction for the log. null when log is pending.

| transactionHash | Data, 32 bytes | Hash of the starting transaction for the log. null when log is pending.

| blockHash | Data, 32 bytes | Hash of the block that includes the log. null when log is pending.

| blockNumber | Quantity | Number of block that includes the log. null when log is pending.

| address | Data, 20 bytes | Address the log originated from.

| data | Data | Non-indexed arguments of the log.

| topics | Array of Data, 32 bytes each | link:../Concepts/Events-and-Logs.md#event-signature-hash[Event signature hash] and 0 to 3 link:../Concepts/Events-and-Logs.md#event-parameters[indexed log arguments]. |===

= Pending transaction object

Returned by link:API-Methods.md#txpool_besupendingtransactions[txpool_besuPendingTransactions].

|=== | Key | Type | Value

| from | Data, 20 bytes | Address of the sender.

| gas | Quantity | Gas provided by the sender.

| gasPrice | Quantity | Gas price, in wei, provided by the sender.

| hash | Data, 32 bytes | Hash of the transaction.

| input | Data | Data sent with the transaction to create or invoke a contract.

| nonce | Quantity | Number of transactions made by the sender before this one.

| to | Data, 20 bytes | Address of the receiver. null if a contract creation transaction.

| value | Quantity | Value transferred, in wei.

| v | Quantity | ECDSA Recovery ID.

| r | Data, 32 bytes | ECDSA signature r.

| s | Data, 32 bytes | ECDSA signature s. |===

= Private transaction object

Returned by link:API-Methods.md#priv_getprivatetransaction[priv_getPrivateTransaction].

|=== | Key | Type | Value

| from | Data, 20 bytes | Address of the sender.

| gas | Quantity | Gas provided by the sender.

| gasPrice | Quantity | Gas price, in Wei, provided by the sender.

| hash | Data, 32 bytes | Hash of the transaction.

| input | Data | The data to create or invoke a contract.

| nonce | Quantity | Number of transactions made by the sender to the privacy group before this one.

| to | Data, 20 bytes | null if a contract creation transaction, otherwise, the contract address.

| value | Quantity | null because private transactions cannot transfer Ether.

| v | Quantity | ECDSA Recovery ID.

| r | Data, 32 bytes | ECDSA signature r.

| s | Data, 32 bytes | ECDSA signature s.

| privateFrom | Data, 32 bytes | https://docs.orion.pegasys.tech/en/stable/[Orion] public key of the sender.

| privateFor | Array of Data, 32 bytes each | https://docs.orion.pegasys.tech/en/stable/[Orion] public keys of recipients. Not returned if using privacyGroupId to link:../Concepts/Privacy/Privacy-Groups.md#privacy-types[send the transaction].

| privacyGroupId | Data, 32 bytes | https://docs.orion.pegasys.tech/en/stable/[Orion] privacy group ID of recipients. Not returned if using privateFor to link:../Concepts/Privacy/Privacy-Groups.md#privacy-types[send the transaction].

| restriction | String | Must be link:../Concepts/Privacy/Private-Transactions.xml[restricted]. |===

= Range object

Returned by link:API-Methods.md#debug_storagerangeat[debug_storageRangeAt].

|=== | Key | Type | Value

| storage | Object | Key hash and value. Preimage key is null if it falls outside the cache.

| nextKey | Hash | Hash of next key if further storage in range. Otherwise, not included. |===

== Structured log object

Log information returned as part of the <<trace-object,Trace object>>.

|=== | Key | Type | Value

| pc | Integer | Current program counter.

| op | String | Current OpCode.

| gas | Integer | Gas remaining.

| gasCost | Integer | Cost in wei of each gas unit.

| depth | Integer | Execution depth.

| exceptionalHaltReasons | Array | One or more strings representing an error condition causing the EVM execution to terminate. These strings suggest that EVM execution terminated for reasons such as running out of gas or attempting to execute an unknown instruction. Generally a single exceptional halt reason returns but it's possible for more than one to occur at once.

| stack | Array of 32 byte arrays | EVM execution stack before executing current operation.

| memory | Array of 32 byte arrays | Memory space of the contract before executing current operation.

| storage | Object | Storage entries changed by the current transaction. |===

= Trace object

Returned by link:API-Methods.md#debug_traceblock[debug_traceBlock], link:API-Methods.md#debug_traceblockbyhash[debug_traceBlockByHash], link:API-Methods.md#debug_traceblockbynumber[debug_traceBlockByNumber], and link:API-Methods.md#debug_tracetransaction[debug_traceTransaction].

|=== | Key | Type | Value

| gas | Integer | Gas used by the transaction.

| failed | Boolean | True if transaction failed, otherwise, false.

| returnValue | String | Bytes returned from transaction execution (without a 0x prefix).

| structLogs | Array | Array of structured log objects. |===

= Transaction object

Returned by link:API-Methods.md#eth_gettransactionbyhash[eth_getTransactionByHash], link:API-Methods.md#eth_gettransactionbyblockhashandindex[eth_getTransactionByBlockHashAndIndex], and link:API-Methods.md#eth_gettransactionbyblocknumberandindex[eth_getTransactionsByBlockNumberAndIndex].

|=== | Key | Type | Value

| blockHash | Data, 32 bytes | Hash of the block containing this transaction. null when transaction is pending.

| blockNumber | Quantity | Block number of the block containing this transaction. null when transaction is pending.

| from | Data, 20 bytes | Address of the sender.

| gas | Quantity | Gas provided by the sender.

| gasPrice | Quantity | Gas price, in wei, provided by the sender.

| hash | Data, 32 bytes | Hash of the transaction.

| input | Data | Data sent with the transaction to create or invoke a contract. For link:../Concepts/Privacy/Privacy-Overview.xml[private transactions], it's a pointer to the transaction location in https://docs.orion.pegasys.tech/en/stable/[Orion].

| nonce | Quantity | Number of transactions made by the sender before this one.

| to | Data, 20 bytes | Address of the receiver. null if a contract creation transaction.

| transactionIndex | Quantity, Integer | Index position of the transaction in the block. null when transaction is pending.

| value | Quantity | Value transferred, in wei.

| v | Quantity | ECDSA Recovery ID.

| r | Data, 32 bytes | ECDSA signature r.

| s | Data, 32 bytes | ECDSA signature s. |===

= Transaction call object

Parameter for link:API-Methods.md#eth_call[eth_call] and link:API-Methods.md#eth_estimategas[eth_estimateGas].

!!!note

All parameters are optional for eth_estimateGas.

|=== | Key | Type | Required/Optional | Value

| from | Data, 20 bytes | Optional | Address of the transaction sender.

| to | Data, 20 bytes | Required | Address of the transaction receiver.

| gas | Quantity, Integer | Optional | Gas provided for the transaction execution. eth_call consumes zero gas, but other executions might need this parameter. eth_estimateGas ignores this value.

| gasPrice | Quantity, Integer | Optional | Price used for each paid gas.

| value | Quantity, Integer | Optional | Value sent with this transaction.

| data | Data | Optional | Hash of the method signature and encoded parameters. For details, see https://solidity.readthedocs.io/en/develop/abi-spec.html[Ethereum Contract ABI]. |===

= Transaction receipt object

Returned by link:API-Methods.md#eth_gettransactionreceipt[eth_getTransactionReceipt].

|=== | Key | Type | Value

| blockHash | Data, 32 bytes | Hash of block containing this transaction.

| blockNumber | Quantity | Block number of block containing this transaction.

| contractAddress | Data, 20 bytes | Contract address created, if contract creation transaction, otherwise, null.

| cumulativeGasUsed | Quantity | Total amount of gas used by previous transactions in the block and this transaction.

| from | Data, 20 bytes | Address of the sender.

| gasUsed | Quantity | Amount of gas used by this specific transaction.

| logs | Array | Array of <<log-object,log objects>> generated by this transaction.

| logsBloom | Data, 256 bytes | Bloom filter for light clients to quickly retrieve related logs.

| status | Quantity | Either 0x1 (success) or 0x0 (failure)

| to | Data, 20 bytes | Address of the receiver, if sending ether, otherwise, null.

| transactionHash | Data, 32 bytes | Hash of the transaction.

| transactionIndex | Quantity, Integer | Index position of transaction in the block.

| revertReason | String | ABI-encoded string that displays the link:../HowTo/Send-Transactions/Revert-Reason.xml[reason for reverting the transaction]. Only available if revert reason is link:../Reference/CLI/CLI-Syntax.md#revert-reason-enabled[enabled]. |===

!!!note

For pre-Byzantium transactions, the transaction receipt object includes the following instead of status:

|=== | Key | Type | Value

| root | Data, 32 bytes | Post-transaction stateroot |===

= Transaction trace object

Returned by link:API-Methods.md#trace_replayblocktransactions[trace_replayBlockTransactions].

|=== | Key | Type | Value

| output | Boolean | Transaction result. 1 for success and 0 for failure.

| stateDiff | Object | link:Trace-Types.md#statediff[State changes in the requested block].

| trace | Array | link:Trace-Types.md#trace[Ordered list of calls to other contracts].

| vmTrace | Object | link:Trace-Types.md#vmtrace[Ordered list of EVM actions].

| transactionHash | Data, 32 bytes | Hash of the replayed transaction. |===

= Private transaction receipt object

Returned by link:API-Methods.md#priv_getTransactionReceipt[priv_getTransactionReceipt].

|=== | Key | Type | Value

| contractAddress | Data, 20 bytes | Contract address created if a contract creation transaction, otherwise, null.

| from | Data, 20 bytes | Address of the sender.

| 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.

| transactionHash | Data, 32 bytes | Hash of the private transaction.

| privateFrom | Data, 32 bytes | https://docs.orion.pegasys.tech/en/stable/[Orion] public key of the sender.

| privateFor or privacyGroupId | Array or Data, 32 bytes | https://docs.orion.pegasys.tech/en/stable/[Orion] public keys or privacy group ID of the recipients.

| status | Quantity | Either 0x1 (success) or 0x0 (failure).

| logs | Array | Array of <<log-object,log objects>> generated by this private transaction. |=== == Data Model

This section serves to describe the relationships between the various components in an . It seeks to present an explicit set of named resource types and how they relate to one another.

This data model seeks to identify explicitly any implicit relationships and to add semantic color to these. It is a work in progress and likely to be incomplete and/or wrong.

=== Projects and Named Resources

Certain resources are named, meaning that these entities may be referenced by user-defined semantic identifiers. Since Truffle targets the full development lifecycle, this means names refer to different things at different times.

and , for example, both use names. These resources represent entities that change over time. Contracts are written, rewritten, and/or updated many times between a project's start and past its production deployment. Development networks reset, and public networks fork.

To represent these entities across the entire project lifecycle, Truffle DB models names as a linked list of references to immutable entities.

Each Named resource contains the non-nullable string attribute name, used to index by type.

NameRecord can be considered generically to represent a linked list of current and past resource name references for a given resource type T. Each NameRecord has the same name, plus the following: - type to represent the underlying named resource type - resource to point to the underlying resource - previous to point to the previous name

In order to track the current NameRecords for a given type, the Project resource serves as the aggregation point for the heads of these linked lists.

!define SHOW_PROJECT !define SHOW_NAME_RECORD !define SHOW_NAME_RECORD_INTERNAL

!include uml/macros.iuml

=== Data Model Resources

==== Contracts, Constructors, and Instances

scale 0.75

!define SHOW_CONTRACT !define SHOW_INSTANCE !define SHOW_CONSTRUCTOR !define SHOW_INTERFACE

!define SHOW_COMPILATION !define EXTERN_COMPILATION !define SHOW_SOURCE_MAP

!define SHOW_BYTECODE !define EXTERN_BYTECODE

!define SHOW_NETWORK !define EXTERN_NETWORK

!include uml/macros.iuml

==== Sources, Bytecodes, and Compilations

scale 0.75

!define SHOW_CONTRACT !define EXTERN_CONTRACT

!define SHOW_BYTECODE !define SHOW_SOURCE !define SHOW_COMPILATION !define SHOW_COMPILER !define SHOW_SOURCE_MAP

!include uml/macros.iuml

==== Contract Interfaces

Contract Interfaces have not been implemented in the first version of Truffle DB, but will be added in a future iteration.

scale 0.75

!define SHOW_INTERFACE !define SHOW_INTERFACE_INTERNAL

!include uml/macros.iuml

==== Network

scale 0.75

!define SHOW_NETWORK !define SHOW_NETWORK_INTERNAL

!include uml/macros.iuml

A network resource comprises a friendly name, a network ID, and a known historic block.

=== Combined Data Model

scale 0.75

!define SHOW_PROJECT !define SHOW_NAME_RECORD !define SHOW_NETWORK !define SHOW_NETWORK_INTERNAL

!define SHOW_BYTECODE

!define SHOW_COMPILATION !define SHOW_COMPILER

!define SHOW_SOURCE

!define SHOW_CONTRACT !define SHOW_INTERFACE !define SHOW_INSTANCE !define SHOW_ABI !define SHOW_AST !define SHOW_INSTRUCTION !define SHOW_SOURCE_MAP !define SHOW_SOURCE_RANGE !define SHOW_CONSTRUCTOR

!include uml/macros.iuml

== JSON RPC

Nodes created by the current generation of Ethereum clients expose inconsistent and incompatible remote procedure call (RPC) methods because no formal Ethereum RPC specification exists. This proposal standardizes such a specification to provide developers with a predictable Ethereum RPC interface regardless of underlying node implementation.

== Specification

[[eip-1474-title-remote-procedure-call-specification-author-paul-bouchon-mailbitpshrnet-erik-marks-rekmarks-discussions-to-httpsethereum-magiciansorgteip-remote-procedure-call-specification1537-status-draft-type-standards-track-category-interface-created-2018-10-02]] ==== eip: 1474 title: Remote procedure call specification author: Paul Bouchon [email protected], Erik Marks (@rekmarks) discussions-to: https://ethereum-magicians.org/t/eip-remote-procedure-call-specification/1537[https://ethereum-magicians.org/t/eip-remote-procedure-call-specification/1537] status: Draft type: Standards Track category: Interface created: 2018-10-02

=== Concepts

==== RFC-2119

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in https://www.ietf.org/rfc/rfc2119.txt[RFC-2119].

==== JSON-RPC

Communication with Ethereum nodes is accomplished using https://www.jsonrpc.org/specification[JSON-RPC], a stateless, lightweight https://en.wikipedia.org/wiki/Remote_procedure_call[remote procedure call] protocol that uses http://www.json.org/[JSON] as its data format. Ethereum RPC methods MUST be called using https://www.jsonrpc.org/specification#request_object[JSON-RPC request objects] and MUST respond with https://www.jsonrpc.org/specification#response_object[JSON-RPC response objects].

==== Error codes

If an Ethereum RPC method encounters an error, the error member included on the response object MUST be an object containing a code member and descriptive message member. The following list contains all possible error codes and associated messages:

[cols=",,,",options="header",] |=== |Code |Message |Meaning |Category |-32700 |Parse error |Invalid JSON |standard

|-32600 |Invalid request |JSON is not a valid request object |standard

|-32601 |Method not found |Method does not exist |standard

|-32602 |Invalid params |Invalid method parameters |standard

|-32603 |Internal error |Internal JSON-RPC error |standard

|-32000 |Invalid input |Missing or invalid parameters |non-standard

|-32001 |Resource not found |Requested resource not found |non-standard

|-32002 |Resource unavailable |Requested resource not available |non-standard

|-32003 |Transaction rejected |Transaction creation failed |non-standard

|-32004 |Method not supported |Method is not implemented |non-standard

|-32005 |Limit exceeded |Request exceeds defined limit |non-standard

|-32006 |JSON-RPC version not supported |Version of JSON-RPC protocol is not supported |non-standard |===

Example error response:

[source,sh]

{
"id": 1337
"jsonrpc": "2.0",
"error": {
"code": -32003,
"message": "Transaction rejected"
}
}

==== Value encoding

Specific types of values passed to and returned from Ethereum RPC methods require special encoding:

===== Quantity

  • A Quantity value MUST be hex-encoded.
  • A Quantity value MUST be "0x"-prefixed.
  • A Quantity value MUST be expressed using the fewest possible hex
    digits per byte.
  • A Quantity value MUST express zero as "0x0".

Examples Quantity values:

[cols=",,",options="header",] |=== |Value |Valid |Reason |0x |invalid |empty not a valid quantity |0x0 |valid |interpreted as a quantity of zero |0x00 |invalid |leading zeroes not allowed |0x41 |valid |interpreted as a quantity of 65 |0x400 |valid |interpreted as a quantity of 1024 |0x0400 |invalid |leading zeroes not allowed |ff |invalid |values must be prefixed |===

===== Block Identifier

The RPC methods below take a default block identifier as a parameter.

  • eth_getBalance
  • eth_getStorageAt
  • eth_getTransactionCount
  • eth_getCode
  • eth_call
  • eth_getProof

Since there is no way to clearly distinguish between a Data parameter and a Quantity parameter, link:./eip-1898.md[EIP-1898] provides a format to specify a block either using the block hash or block number. The block identifier is a JSON object with the following fields:

[cols=",,",options="header",] |=== |Property |Type |Description |[blockNumber] |{link:#quantity[Quantity]} |The block in the canonical chain with this number

|OR [blockHash] |{link:#data[Data]} |The block uniquely identified by this hash. The blockNumber and blockHash properties are mutually exclusive; exactly one of them must be set.

|requireCanonical |{boolean} |(optional) Whether or not to throw an error if the block is not in the canonical chain as described below. Only allowed in conjunction with the blockHash tag. Defaults to false. |===

If the block is not found, the callee SHOULD raise a JSON-RPC error (the recommended error code is -32001: Resource not found. If the tag is blockHash and requireCanonical is true, the callee SHOULD additionally raise a JSON-RPC error if the block is not in the canonical chain (the recommended error code is -32000: Invalid input and in any case should be different than the error code for the block not found case so that the caller can distinguish the cases). The block-not-found check SHOULD take precedence over the block-is-canonical check, so that if the block is not found the callee raises block-not-found rather than block-not-canonical.

===== Data

  • A Data value MUST be hex-encoded.
  • A Data value MUST be "0x"-prefixed.
  • A Data value MUST be expressed using two hex digits per byte.

Examples Data values:

[cols=",,",options="header",] |=== |Value |Valid |Reason |0x |valid |interpreted as empty data |0x0 |invalid |each byte must be represented using two hex digits |0x00 |valid |interpreted as a single zero byte |0x41 |true |interpreted as a data value of 65 |0x004200 |true |interpreted as a data value of 16896 |0xf0f0f |false |bytes require two hex digits |004200 |false |values must be prefixed |===

===== Proposing changes

New Ethereum RPC methods and changes to existing methods MUST be proposed via the traditional EIP process. This allows for community consensus around new method implementations and proposed method modifications. RPC method proposals MUST reach "draft" status before being added to this proposal and the official Ethereum RPC specification defined herein.

=== Methods

==== web3_clientVersion

===== Description

Returns the version of the current client

===== Parameters

(none)

===== Returns

{string} - client version

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "Mist/v0.9.3/darwin/go1.4.1"
}

'''''

==== web3_sha3

===== Description

Hashes data using the Keccak-256 algorithm

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |data to hash |===

===== Returns

{link:#data[Data]} - Keccak-256 hash of the given data

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "web3_sha3", "params": ["0x68656c6c6f20776f726c64"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc94770007dda54cF92009BFF0dE90c06F603a09f"
}

'''''

==== net_listening

===== Description

Determines if this client is listening for new network connections

===== Parameters

(none)

===== Returns

{boolean} - true if listening is active or false if listening is not active

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "net_listening", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": true
}

'''''

==== net_peerCount

===== Description

Returns the number of peers currently connected to this client

===== Parameters

(none)

===== Returns

{link:#quantity[Quantity]} - number of connected peers

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "net_peerCount", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x2"
}

'''''

==== net_version

===== Description

Returns the chain ID associated with the current network

===== Parameters

(none)

===== Returns

{string} - chain ID associated with the current network

Common chain IDs:

  • "1" - Ethereum mainnet
  • "3" - Ropsten testnet
  • "4" - Rinkeby testnet
  • "42" - Kovan testnet

Note: See EIP-155 for a link:./eip-155.md#list-of-chain-ids[complete list] of possible chain IDs.

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337 "jsonrpc": "2.0", "method": "net_version", "params": [], }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "3"
}

'''''

==== eth_accounts

===== Description

Returns a list of addresses owned by this client

===== Parameters

(none)

===== Returns

{link:#data[Data[]]} - array of addresses

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_accounts", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f"]
}

'''''

==== eth_blockNumber

===== Description

Returns the number of the most recent block seen by this client

===== Parameters

(none)

===== Returns

{link:#quantity[Quantity]} - number of the latest block

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc94"
}

'''''

==== eth_call

===== Description

Executes a new message call immediately without submitting a transaction to the network

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{object} |@property {link:#data[Data]} [from] - transaction sender@property {link:#data[Data]} to - transaction recipient or null if deploying a contract@property {link:#quantity[Quantity]} [gas] - gas provided for transaction execution@property {link:#quantity[Quantity]} [gasPrice] - price in wei of each gas used@property {link:#quantity[Quantity]} [value] - value in wei sent with this transaction@property {link:#data[Data]} [data] - contract code or a hashed method call with encoded args

|2 |{link:#quantity[Quantity]|string|link:#block-identifier[Block Identifier]} |block number, or one of "latest", "earliest" or "pending", or a block identifier as described in link:#block-identifier[Block Identifier] |===

===== Returns

{link:#data[Data]} - return value of executed contract

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_call", "params": [{ "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155", "gas": "0x76c0", "gasPrice": "0x9184e72a000", "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", "value": "0x9184e72a" }] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x"
}

'''''

==== eth_coinbase

===== Description

Returns the coinbase address for this client

===== Parameters

(none)

===== Returns

{link:#data[Data]} - coinbase address

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_coinbase", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc94770007dda54cF92009BFF0dE90c06F603a09f"
}

'''''

==== eth_estimateGas

===== Description

Estimates the gas necessary to complete a transaction without submitting it to the network

Note: The resulting gas estimation may be significantly more than the amount of gas actually used by the transaction. This is due to a variety of reasons including EVM mechanics and node performance.

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{object} |@property {link:#data[Data]} [from] - transaction sender@property {link:#data[Data]} [to] - transaction recipient@property {link:#quantity[Quantity]} [gas] - gas provided for transaction execution@property {link:#quantity[Quantity]} [gasPrice] - price in wei of each gas used@property {link:#quantity[Quantity]} [value] - value in wei sent with this transaction@property {link:#data[Data]} [data] - contract code or a hashed method call with encoded args

|2 |{link:#quantity[Quantity]|string} |block number, or one of "latest", "earliest" or "pending" |===

===== Returns

{link:#quantity[Quantity]} - amount of gas required by transaction

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_estimateGas", "params": [{ "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155", "gas": "0x76c0", "gasPrice": "0x9184e72a000", "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", "value": "0x9184e72a" }] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x5208"
}

'''''

==== eth_gasPrice

===== Description

Returns the current price of gas expressed in wei

===== Parameters

(none)

===== Returns

{link:#quantity[Quantity]} - current gas price in wei

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x09184e72a000"
}

'''''

==== eth_getBalance

===== Description

Returns the balance of an address in wei

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |address to query for balance

|2 |{link:#quantity[Quantity]|string|link:#block-identifier[Block Identifier]} |block number, or one of "latest", "earliest" or "pending", or a block identifier as described in link:#block-identifier[Block Identifier] |===

===== Returns

{link:#quantity[Quantity]} - balance of the provided account in wei

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getBalance", "params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f", "latest"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x0234c8a3397aab58"
}

'''''

==== eth_getBlockByHash

===== Description

Returns information about a block specified by hash

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |hash of a block

|2 |{boolean} |true will pull full transaction objects, false will pull transaction hashes |===

===== Returns

{null|object} - null if no block is found, otherwise a block object with the following members:

  • {link:#data[Data]} extraData - "extra data" field of this block
  • {link:#data[Data]} hash - block hash or null if pending
  • {link:#data[Data]} logsBloom - logs bloom filter or null if
    pending
  • {link:#data[Data]} miner - address that received this block's
    mining rewards
  • {link:#data[Data]} nonce - proof-of-work hash or null if
    pending
  • {link:#data[Data]} parentHash - parent block hash
  • {link:#data[Data]} receiptsRoot -root of the this block's
    receipts trie
  • {link:#data[Data]} sha3Uncles - SHA3 of the uncles data in this
    block
  • {link:#data[Data]} stateRoot - root of this block's final state
    trie
  • {link:#data[Data]} transactionsRoot - root of this block's
    transaction trie
  • {link:#quantity[Quantity]} difficulty - difficulty for this block
  • {link:#quantity[Quantity]} gasLimit - maximum gas allowed in this
    block
  • {link:#quantity[Quantity]} gasUsed - total used gas by all
    transactions in this block
  • {link:#quantity[Quantity]} number - block number or null if
    pending
  • {link:#quantity[Quantity]} size - size of this block in bytes
  • {link:#quantity[Quantity]} timestamp - unix timestamp of when
    this block was collated
  • {link:#quantity[Quantity]} totalDifficulty - total difficulty of
    the chain until this block
  • {Array<Transaction>} transactions - list of transaction objects
    or hashes
  • {Array<Transaction>} uncles - list of uncle hashes

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getBlockByHash", "params":["0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", true] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"difficulty": "0x027f07",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x9f759",
"gasUsed": "0x9f759",
"hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"miner": "0x4e65fda2159562a496f9f3522f89122a3088497a",
"nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2",
"number": "0x1b4",
"parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x027f07",
"stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff",
"timestamp": "0x54e34e8e"
"totalDifficulty": "0x027f07",
"transactions": []
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncles": ["0x1606e5...", "0xd5145a9..."]
}
}

'''''

==== eth_getBlockByNumber

===== Description

Returns information about a block specified by number

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#quantity[Quantity]|string} |block number, or one of "latest", "earliest" or "pending"

|2 |{boolean} |true will pull full transaction objects, false will pull transaction hashes |===

===== Returns

{null|object} - null if no block is found, otherwise a block object with the following members:

  • {link:#data[Data]} extraData - "extra data" field of this block
  • {link:#data[Data]} hash - block hash or null if pending
  • {link:#data[Data]} logsBloom - logs bloom filter or null if
    pending
  • {link:#data[Data]} miner - address that received this block's
    mining rewards
  • {link:#data[Data]} nonce - proof-of-work hash or null if
    pending
  • {link:#data[Data]} parentHash - parent block hash
  • {link:#data[Data]} receiptsRoot -root of the this block's
    receipts trie
  • {link:#data[Data]} sha3Uncles - SHA3 of the uncles data in this
    block
  • {link:#data[Data]} stateRoot - root of this block's final state
    trie
  • {link:#data[Data]} transactionsRoot - root of this block's
    transaction trie
  • {link:#quantity[Quantity]} difficulty - difficulty for this block
  • {link:#quantity[Quantity]} gasLimit - maximum gas allowed in this
    block
  • {link:#quantity[Quantity]} gasUsed - total used gas by all
    transactions in this block
  • {link:#quantity[Quantity]} number - block number or null if
    pending
  • {link:#quantity[Quantity]} size - size of this block in bytes
  • {link:#quantity[Quantity]} timestamp - unix timestamp of when
    this block was collated
  • {link:#quantity[Quantity]} totalDifficulty - total difficulty of
    the chain until this block
  • {Array<Transaction>} transactions - list of transaction objects
    or hashes
  • {Array<Transaction>} uncles - list of uncle hashes

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params":["0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", true] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"difficulty": "0x027f07",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x9f759",
"gasUsed": "0x9f759",
"hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"miner": "0x4e65fda2159562a496f9f3522f89122a3088497a",
"nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2",
"number": "0x1b4",
"parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x027f07",
"stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff",
"timestamp": "0x54e34e8e"
"totalDifficulty": "0x027f07",
"transactions": []
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncles": ["0x1606e5...", "0xd5145a9..."]
}
}

'''''

==== eth_getBlockTransactionCountByHash

===== Description

Returns the number of transactions in a block specified by block hash

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |hash of a block |===

===== Returns

{link:#quantity[Quantity]} - number of transactions in the specified block

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByHash", "params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc"
}

'''''

==== eth_getBlockTransactionCountByNumber

===== Description

Returns the number of transactions in a block specified by block number

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#quantity[Quantity]|string} |block number, or one of "latest", "earliest" or "pending" |===

===== Returns

{link:#quantity[Quantity]} - number of transactions in the specified block

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByNumber", "params": ["0xe8"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xa"
}

'''''

==== eth_getCode

===== Description

Returns the contract code stored at a given address

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |address to query for code

|2 |{link:#quantity[Quantity]|string|link:#block-identifier[Block Identifier]} |block number, or one of "latest", "earliest" or "pending", or a block identifier as described in link:#block-identifier[Block Identifier] |===

===== Returns

{link:#data[Data]} - code from the specified address

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getCode", "params": ["0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", "0x2"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056"
}

'''''

==== eth_getFilterChanges

===== Description

Returns a list of all logs based on filter ID since the last log retrieval

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#quantity[Quantity]} |ID of the filter |===

===== Returns

{Array<Log>} - array of log objects with the following members:

  • {link:#data[Data]} address - address from which this log
    originated
  • {link:#data[Data]} blockHash - hash of block containing this log
    or null if pending
  • {link:#data[Data]} data - contains the non-indexed arguments of
    the log
  • {link:#data[Data]} transactionHash - hash of the transaction that
    created this log or null if pending
  • {link:#quantity[Quantity]} blockNumber - number of block
    containing this log or null if pending
  • {link:#quantity[Quantity]} logIndex - index of this log within
    its block or null if pending
  • {link:#quantity[Quantity]} transactionIndex - index of the
    transaction that created this log or null if pending
  • {link:#data[Data[]]} topics - list of order-dependent topics
  • {boolean} removed - true if this filter has been destroyed and
    is invalid

Note: The return value of eth_getFilterChanges when retrieving logs from eth_newBlockFilter and eth_newPendingTransactionFilter filters will be an array of hashes, not an array of Log objects.

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getFilterChanges", "params": ["0x16"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": [{
"address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockNumber":"0x1b4",
"data":"0x0000000000000000000000000000000000000000000000000000000000000000",
"logIndex": "0x1",
"topics": [],
"transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
"transactionIndex": "0x0"
}]
}

'''''

==== eth_getFilterLogs

===== Description

Returns a list of all logs based on filter ID

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#quantity[Quantity]} |ID of the filter |===

===== Returns

{Array<Log>} - array of log objects with the following members:

  • {link:#data[Data]} address - address from which this log originated
  • {link:#data[Data]} blockHash - hash of block containing this log or
    null if pending
  • {link:#data[Data]} data - contains the non-indexed arguments of the
    log
  • {link:#data[Data]} transactionHash - hash of the transaction that
    created this log or null if pending
  • {link:#quantity[Quantity]} blockNumber - number of block containing
    this log or null if pending
  • {link:#quantity[Quantity]} logIndex - index of this log within its
    block or null if pending
  • {link:#quantity[Quantity]} transactionIndex - index of the
    transaction that created this log or null if pending
  • {Array<Data>} topics - list of order-dependent topics
  • {boolean} removed - true if this filter has been destroyed and is
    invalid

Note: The return value of eth_getFilterLogs when retrieving logs from eth_newBlockFilter and eth_newPendingTransactionFilter filters will be an array of hashes, not an array of Log objects.

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getFilterLogs", "params": ["0x16"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": [{
"address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockNumber":"0x1b4",
"data":"0x0000000000000000000000000000000000000000000000000000000000000000",
"logIndex": "0x1",
"topics": [],
"transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
"transactionIndex": "0x0"
}]
}

'''''

==== eth_getLogs

===== Description

Returns a list of all logs based on a filter object

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{object} |@property {link:#quantity[Quantity]|string} [fromBlock] - block number, or one of "latest", "earliest" or "pending"@property {link:#quantity[Quantity]|string} [toBlock]

  • block number, or one of "latest", "earliest" or
    "pending"@property {link:#data[Data]|link:#data[Data[]]}
    [address] - contract address or a list of addresses from which logs
    should originate@property {link:#data[Data[]]} [topics] - list of
    order-dependent topics@property {link:#data[Data]} [blockhash] -
    restrict logs to a block by hash
    |===

Note: If blockhash is passed, neither fromBlock nor toBlock are allowed or respected.

===== Returns

{Array<Log>} - array of log objects with the following members:

  • {link:#data[Data]} address - address from which this log
    originated
  • {link:#data[Data]} blockHash - hash of block containing this log
    or null if pending
  • {link:#data[Data]} data - contains the non-indexed arguments of
    the log
  • {link:#data[Data]} transactionHash - hash of the transaction that
    created this log or null if pending
  • {link:#quantity[Quantity]} blockNumber - number of block
    containing this log or null if pending
  • {link:#quantity[Quantity]} logIndex - index of this log within
    its block or null if pending
  • {link:#quantity[Quantity]} transactionIndex - index of the
    transaction that created this log or null if pending
  • {link:#data[Data]} topics - list of order-dependent topics
  • {boolean} removed - true if this filter has been destroyed and
    is invalid

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getLogs", "params": [{ "topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"] }] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": [{
"address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockNumber":"0x1b4",
"data":"0x0000000000000000000000000000000000000000000000000000000000000000",
"logIndex": "0x1",
"topics": [],
"transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
"transactionIndex": "0x0"
}]
}

'''''

==== eth_getStorageAt

===== Description

Returns the value from a storage position at an address

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |address of stored data

|2 |{link:#quantity[Quantity]} |index into stored data

|3 |{link:#quantity[Quantity]|string|link:#block-identifier[Block Identifier]} |block number, or one of "latest", "earliest" or "pending", or a block identifier as described in link:#block-identifier[Block Identifier] |===

===== Returns

{link:#data[Data]} - value stored at the given address and data index

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x00000000000000000000000000000000000000000000000000000000000004d2"
}

'''''

==== eth_getTransactionByBlockHashAndIndex

===== Description

Returns information about a transaction specified by block hash and transaction index

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |hash of a block

|2 |{link:#quantity[Quantity]} |index of a transaction in the specified block |===

===== Returns

{null|object} - null if no transaction is found, otherwise a transaction object with the following members:

  • {link:#data[Data]} r - ECDSA signature r
  • {link:#data[Data]} s - ECDSA signature s
  • {link:#data[Data]} blockHash - hash of block containing this
    transaction or null if pending
  • {link:#data[Data]} from - transaction sender
  • {link:#data[Data]} hash - hash of this transaction
  • {link:#data[Data]} input - contract code or a hashed method call
  • {link:#data[Data]} to - transaction recipient or null if
    deploying a contract
  • {link:#quantity[Quantity]} v - ECDSA recovery ID
  • {link:#quantity[Quantity]} blockNumber - number of block
    containing this transaction or null if pending
  • {link:#quantity[Quantity]} gas - gas provided for transaction
    execution
  • {link:#quantity[Quantity]} gasPrice - price in wei of each gas
    used
  • {link:#quantity[Quantity]} nonce - unique number identifying this
    transaction
  • {link:#quantity[Quantity]} transactionIndex - index of this
    transaction in the block or null if pending
  • {link:#quantity[Quantity]} value - value in wei sent with this
    transaction

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getTransactionByBlockHashAndIndex", "params":["0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", "0x0"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"blockHash": "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"blockNumber": "0x5daf3b",
"from": "0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",
"gas": "0xc350",
"gasPrice": "0x4a817c800",
"hash": "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
"input": "0x68656c6c6f21",
"nonce": "0x15",
"r": "0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",
"s": "0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c",
"to": "0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",
"transactionIndex": "0x41",
"v": "0x25",
"value": "0xf3dbb76162000"
}
}

'''''

==== eth_getTransactionByBlockNumberAndIndex

===== Description

Returns information about a transaction specified by block number and transaction index

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#quantity[Quantity]|string} |block number, or one of "latest", "earliest" or "pending"

|2 |{link:#quantity[Quantity]} |index of a transaction in the specified block |===

===== Returns

{null|object} - null if no transaction is found, otherwise a transaction object with the following members:

  • {link:#data[Data]} r - ECDSA signature r
  • {link:#data[Data]} s - ECDSA signature s
  • {link:#data[Data]} blockHash - hash of block containing this
    transaction or null if pending
  • {link:#data[Data]} from - transaction sender
  • {link:#data[Data]} hash - hash of this transaction
  • {link:#data[Data]} input - contract code or a hashed method call
  • {link:#data[Data]} to - transaction recipient or null if
    deploying a contract
  • {link:#quantity[Quantity]} v - ECDSA recovery ID
  • {link:#quantity[Quantity]} blockNumber - number of block
    containing this transaction or null if pending
  • {link:#quantity[Quantity]} gas - gas provided for transaction
    execution
  • {link:#quantity[Quantity]} gasPrice - price in wei of each gas
    used
  • {link:#quantity[Quantity]} nonce - unique number identifying this
    transaction
  • {link:#quantity[Quantity]} transactionIndex - index of this
    transaction in the block or null if pending
  • {link:#quantity[Quantity]} value - value in wei sent with this
    transaction

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getTransactionByBlockNumberAndIndex", "params":["0x29c", "0x0"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"blockHash": "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"blockNumber": "0x5daf3b",
"from": "0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",
"gas": "0xc350",
"gasPrice": "0x4a817c800",
"hash": "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
"input": "0x68656c6c6f21",
"nonce": "0x15",
"r": "0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",
"s": "0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c",
"to": "0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",
"transactionIndex": "0x41",
"v": "0x25",
"value": "0xf3dbb76162000"
}
}

'''''

==== eth_getTransactionByHash

===== Description

Returns information about a transaction specified by hash

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |hash of a transaction |===

===== Returns

{null|object} - null if no transaction is found, otherwise a transaction object with the following members:

  • {link:#data[Data]} r - ECDSA signature r
  • {link:#data[Data]} s - ECDSA signature s
  • {link:#data[Data]} blockHash - hash of block containing this
    transaction or null if pending
  • {link:#data[Data]} from - transaction sender
  • {link:#data[Data]} hash - hash of this transaction
  • {link:#data[Data]} input - contract code or a hashed method call
  • {link:#data[Data]} to - transaction recipient or null if
    deploying a contract
  • {link:#quantity[Quantity]} v - ECDSA recovery ID
  • {link:#quantity[Quantity]} blockNumber - number of block
    containing this transaction or null if pending
  • {link:#quantity[Quantity]} gas - gas provided for transaction
    execution
  • {link:#quantity[Quantity]} gasPrice - price in wei of each gas
    used
  • {link:#quantity[Quantity]} nonce - unique number identifying this
    transaction
  • {link:#quantity[Quantity]} transactionIndex - index of this
    transaction in the block or null if pending
  • {link:#quantity[Quantity]} value - value in wei sent with this
    transaction

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getTransactionByHash", "params": ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"blockHash": "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"blockNumber": "0x5daf3b",
"from": "0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",
"gas": "0xc350",
"gasPrice": "0x4a817c800",
"hash": "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
"input": "0x68656c6c6f21",
"nonce": "0x15",
"r": "0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",
"s": "0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c",
"to": "0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",
"transactionIndex": "0x41",
"v": "0x25",
"value": "0xf3dbb76162000"
}
}

'''''

==== eth_getTransactionCount

===== Description

Returns the number of transactions sent from an address

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |address to query for sent transactions

|2 |{link:#quantity[Quantity]|string|link:#block-identifier[Block Identifier]} |block number, or one of "latest", "earliest" or "pending", or a block identifier as described in link:#block-identifier[Block Identifier] |===

===== Returns

{link:#quantity[Quantity]} - number of transactions sent from the specified address

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getTransactionCount", "params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f", "latest"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}

'''''

==== eth_getTransactionReceipt

===== Description

Returns the receipt of a transaction specified by hash

Note: Transaction receipts are unavailable for pending transactions.

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |hash of a transaction |===

===== Returns

{null|object} - null if no transaction is found, otherwise a transaction receipt object with the following members:

  • {link:#data[Data]} blockHash - hash of block containing this
    transaction
  • {link:#data[Data]} contractAddress - address of new contract or
    null if no contract was created
  • {link:#data[Data]} from - transaction sender
  • {link:#data[Data]} logsBloom - logs bloom filter
  • {link:#data[Data]} to - transaction recipient or null if
    deploying a contract
  • {link:#data[Data]} transactionHash - hash of this transaction
  • {link:#quantity[Quantity]} blockNumber - number of block
    containing this transaction
  • {link:#quantity[Quantity]} cumulativeGasUsed - gas used by this
    and all preceding transactions in this block
  • {link:#quantity[Quantity]} gasUsed - gas used by this transaction
  • {link:#quantity[Quantity]} status - 1 if this transaction was
    successful or 0 if it failed
  • {link:#quantity[Quantity]} transactionIndex - index of this
    transaction in the block
  • {Array<Log>} logs - list of log objects generated by this
    transaction

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getTransactionReceipt", "params": ["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"blockHash": '0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b',
"blockNumber": '0xb',
"contractAddress": '0xb60e8dd61c5d32be8058bb8eb970870f07233155',
"cumulativeGasUsed": '0x33bc',
"gasUsed": '0x4dc',
"logs": [],
"logsBloom": "0x00...0",
"status": "0x1",
"transactionHash": '0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238',
"transactionIndex": '0x1'
}
}

'''''

==== eth_getUncleByBlockHashAndIndex

===== Description

Returns information about an uncle specified by block hash and uncle index position

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |hash of a block |2 |{link:#quantity[Quantity]} |index of uncle |===

===== Returns

{null|object} - null if no block or uncle is found, otherwise an uncle object with the following members:

  • {link:#data[Data]} extraData - "extra data" field of this block
  • {link:#data[Data]} hash - block hash or null if pending
  • {link:#data[Data]} logsBloom - logs bloom filter or null if
    pending
  • {link:#data[Data]} miner - address that received this block's
    mining rewards
  • {link:#data[Data]} nonce - proof-of-work hash or null if
    pending
  • {link:#data[Data]} parentHash - parent block hash
  • {link:#data[Data]} receiptsRoot -root of the this block's
    receipts trie
  • {link:#data[Data]} sha3Uncles - SHA3 of the uncles data in this
    block
  • {link:#data[Data]} stateRoot - root of this block's final state
    trie
  • {link:#data[Data]} transactionsRoot - root of this block's
    transaction trie
  • {link:#quantity[Quantity]} difficulty - difficulty for this block
  • {link:#quantity[Quantity]} gasLimit - maximum gas allowed in this
    block
  • {link:#quantity[Quantity]} gasUsed - total used gas by all
    transactions in this block
  • {link:#quantity[Quantity]} number - block number or null if
    pending
  • {link:#quantity[Quantity]} size - size of this block in bytes
  • {link:#quantity[Quantity]} timestamp - unix timestamp of when
    this block was collated
  • {link:#quantity[Quantity]} totalDifficulty - total difficulty of
    the chain until this block
  • {Array<Transaction>} uncles - list of uncle hashes

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getUncleByBlockHashAndIndex", "params": ["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "0x0"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"difficulty": "0x027f07",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x9f759",
"gasUsed": "0x9f759",
"hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"miner": "0x4e65fda2159562a496f9f3522f89122a3088497a",
"nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2",
"number": "0x1b4",
"parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x027f07",
"stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff",
"timestamp": "0x54e34e8e"
"totalDifficulty": "0x027f07",
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncles": []
}
}

'''''

==== eth_getUncleByBlockNumberAndIndex

===== Description

Returns information about an uncle specified by block number and uncle index position

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#quantity[Quantity]|string} |block number, or one of "latest", "earliest" or "pending"

|2 |{link:#quantity[Quantity]} |index of uncle |===

===== Returns

{null|object} - null if no block or uncle is found, otherwise an uncle object with the following members:

  • {link:#data[Data]} extraData - "extra data" field of this block
  • {link:#data[Data]} hash - block hash or null if pending
  • {link:#data[Data]} logsBloom - logs bloom filter or null if
    pending
  • {link:#data[Data]} miner - address that received this block's
    mining rewards
  • {link:#data[Data]} nonce - proof-of-work hash or null if
    pending
  • {link:#data[Data]} parentHash - parent block hash
  • {link:#data[Data]} receiptsRoot -root of the this block's
    receipts trie
  • {link:#data[Data]} sha3Uncles - SHA3 of the uncles data in this
    block
  • {link:#data[Data]} stateRoot - root of this block's final state
    trie
  • {link:#data[Data]} transactionsRoot - root of this block's
    transaction trie
  • {link:#quantity[Quantity]} difficulty - difficulty for this block
  • {link:#quantity[Quantity]} gasLimit - maximum gas allowed in this
    block
  • {link:#quantity[Quantity]} gasUsed - total used gas by all
    transactions in this block
  • {link:#quantity[Quantity]} number - block number or null if
    pending
  • {link:#quantity[Quantity]} size - size of this block in bytes
  • {link:#quantity[Quantity]} timestamp - unix timestamp of when
    this block was collated
  • {link:#quantity[Quantity]} totalDifficulty - total difficulty of
    the chain until this block
  • {Array<Transaction>} uncles - list of uncle hashes

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getUncleByBlockNumberAndIndex", "params": ["0x29c", "0x0"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"difficulty": "0x027f07",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x9f759",
"gasUsed": "0x9f759",
"hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"miner": "0x4e65fda2159562a496f9f3522f89122a3088497a",
"nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2",
"number": "0x1b4",
"parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x027f07",
"stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff",
"timestamp": "0x54e34e8e"
"totalDifficulty": "0x027f07",
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncles": []
}
}

'''''

==== eth_getUncleCountByBlockHash

===== Description

Returns the number of uncles in a block specified by block hash

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |hash of a block |===

===== Returns

{link:#quantity[Quantity]} - number of uncles in the specified block

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getUncleCountByBlockHash", "params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc"
}

'''''

==== eth_getUncleCountByBlockNumber

===== Description

Returns the number of uncles in a block specified by block number

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#quantity[Quantity]|string} |block number, or one of "latest", "earliest" or "pending" |===

===== Returns

{link:#quantity[Quantity]} - number of uncles in the specified block

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getUncleCountByBlockNumber", "params": ["0xe8"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}

'''''

==== eth_getWork

===== Description

Returns a list containing relevant information for proof-of-work

===== Parameters

none

===== Returns

{link:#data[Data[]]} - array with the following items:

. {link:#data[Data]} - current block header pow-hash . {link:#data[Data]} - seed hash used for the DAG . {link:#data[Data]} - boundary condition ("target"), 2^256 / difficulty

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_getWork", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": [
"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"0x5EED00000000000000000000000000005EED0000000000000000000000000000",
"0xd1ff1c01710000000000000000000000d1ff1c01710000000000000000000000"
]
}

'''''

==== eth_hashrate

===== Description

Returns the number of hashes-per-second this node is mining at

===== Parameters

(none)

===== Returns

{link:#quantity[Quantity]} - number of hashes-per-second

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_hashrate", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x38a"
}

'''''

==== eth_mining

===== Description

Determines if this client is mining new blocks

===== Parameters

(none)

===== Returns

{boolean} - true if this client is mining or false if it is not mining

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_mining", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": true
}

'''''

==== eth_newBlockFilter

===== Description

Creates a filter to listen for new blocks that can be used with eth_getFilterChanges

===== Parameters

none

===== Returns

{link:#quantity[Quantity]} - ID of the newly-created filter that can be used with eth_getFilterChanges

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337 "jsonrpc": "2.0", "method": "eth_newBlockFilter", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}

'''''

==== eth_newFilter

===== Description

Creates a filter to listen for specific state changes that can then be used with eth_getFilterChanges

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{object} |@property {link:#quantity[Quantity]|string} [fromBlock] - block number, or one of "latest", "earliest" or "pending"@property {link:#quantity[Quantity]|string} [toBlock]

  • block number, or one of "latest", "earliest" or
    "pending"@property {link:#data[Data]|link:#data[Data[]]}
    [address] - contract address or a list of addresses from which logs
    should originate@property {link:#data[Data[]]} [topics] - list of
    order-dependent topics
    |===

Note: Topics are order-dependent. A transaction with a log with topics [A, B] will be matched by the following topic filters:

  • [] - "anything"
  • [A] - "A in first position (and anything after)"
  • [null, B] - "anything in first position AND B in second position
    (and anything after)"
  • [A, B] - "A in first position AND B in second position (and anything
    after)"
  • [[A, B], [A, B]] - "(A OR B) in first position AND (A OR B) in
    second position (and anything after)"

===== Returns

{link:#quantity[Quantity]} - ID of the newly-created filter that can be used with eth_getFilterChanges

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337 "jsonrpc": "2.0", "method": "eth_newFilter", "params": [{ "topics": ["0x0000000000000000000000000000000000000000000000000000000012341234"] }] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}

'''''

==== eth_newPendingTransactionFilter

===== Description

Creates a filter to listen for new pending transactions that can be used with eth_getFilterChanges

===== Parameters

none

===== Returns

{link:#quantity[Quantity]} - ID of the newly-created filter that can be used with eth_getFilterChanges

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337 "jsonrpc": "2.0", "method": "eth_newPendingTransactionFilter", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}

'''''

==== eth_protocolVersion

===== Description

Returns the current Ethereum protocol version

===== Parameters

(none)

===== Returns

{string} - current Ethereum protocol version

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_protocolVersion", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "54"
}

'''''

==== eth_sendRawTransaction

===== Description

Sends and already-signed transaction to the network

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |signed transaction data |===

===== Returns

{link:#data[Data]} - transaction hash, or the zero hash if the transaction is not yet available

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_sendRawTransaction", "params": ["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}

'''''

==== eth_sendTransaction

===== Description

Creates, signs, and sends a new transaction to the network

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{object} |@property {link:#data[Data]} from - transaction sender@property {link:#data[Data]} [to] - transaction recipient@property {link:#quantity[Quantity]} [gas="0x15f90"] - gas provided for transaction execution@property {link:#quantity[Quantity]} [gasPrice] - price in wei of each gas used@property {link:#quantity[Quantity]} [value] - value in wei sent with this transaction@property {link:#data[Data]} [data] - contract code or a hashed method call with encoded args@property {link:#quantity[Quantity]} [nonce] - unique number identifying this transaction |===

===== Returns

{link:#data[Data]} - transaction hash, or the zero hash if the transaction is not yet available

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_sendTransaction", "params": [{ "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155", "gas": "0x76c0", "gasPrice": "0x9184e72a000", "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", "value": "0x9184e72a" }] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}

'''''

==== eth_sign

===== Description

Calculates an Ethereum-specific signature in the form of keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |address to use for signing |2 |{link:#data[Data]} |data to sign |===

===== Returns

{link:#data[Data]} - signature hash of the provided data

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_sign", "params": ["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
}

'''''

==== eth_signTransaction

===== Description

Signs a transaction that can be submitted to the network at a later time using with eth_sendRawTransaction

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{object} |@property {link:#data[Data]} from - transaction sender@property {link:#data[Data]} [to] - transaction recipient@property {link:#quantity[Quantity]} [gas="0x15f90"] - gas provided for transaction execution@property {link:#quantity[Quantity]} [gasPrice] - price in wei of each gas used@property {link:#quantity[Quantity]} [value] - value in wei sent with this transaction@property {link:#data[Data]} [data] - contract code or a hashed method call with encoded args@property {link:#quantity[Quantity]} [nonce] - unique number identifying this transaction |===

===== Returns

{link:#data[Data]} - signature hash of the transaction object

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_signTransaction", "params": [{ "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155", "gas": "0x76c0", "gasPrice": "0x9184e72a000", "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", "value": "0x9184e72a" }] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
}

'''''

==== eth_signTypedData

===== Description

Calculates an Ethereum-specific signature in the form of keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |address to use for signing

|2 |{link:#data[Data]} |message to sign containing type information, a domain separator, and data |===

Note: Client developers should refer to EIP-712 for complete semantics around link:./eip-712.md#specification[encoding and signing data]. Dapp developers should refer to EIP-712 for the expected structure of link:./eip-712.md#parameters[RPC method input parameters].

===== Returns

{link:#data[Data]} - signature hash of the provided message

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337 "jsonrpc": "2.0", "method": "eth_signTypedData", "params": ["0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", { "types": { "EIP712Domain": [{ "name": "name", "type": "string" }, { "name": "version", "type": "string" }, { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" }], "Person": [{ "name": "name", "type": "string" }, { "name": "wallet", "type": "address" }], "Mail": [{ "name": "from", "type": "Person" }, { "name": "to", "type": "Person" }, { "name": "contents", "type": "string" }] }, "primaryType": "Mail", "domain": { "name": "Ether Mail", "version": "1", "chainId": 1, "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" }, "message": { "from": { "name": "Cow", "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" }, "to": { "name": "Bob", "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" }, "contents": "Hello, Bob!" } }] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x4355c47d63924e8a72e509b65029052eb6c299d53a04e167c5775fd466751c9d07299936d304c153f6443dfa05f40ff007d72911b6f72307f996231605b915621c"
}

'''''

==== eth_submitHashrate

===== Description

Submit a mining hashrate

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |hash rate |2 |{link:#data[Data]} |random ID identifying this node |===

===== Returns

{boolean} - true if submitting went through successfully, false otherwise

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_submitHashrate", "params": [ "0x0000000000000000000000000000000000000000000000000000000000500000", "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c" ] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": true
}

'''''

==== eth_submitWork

===== Description

Submit a proof-of-work solution

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#data[Data]} |nonce found |2 |{link:#data[Data]} |header's pow-hash |3 |{link:#data[Data]} |mix digest |===

===== Returns

{boolean} - true if the provided solution is valid, false otherwise

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_submitWork", "params": [ "0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000" ] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": true
}

'''''

==== eth_syncing

===== Description

Returns information about the status of this client's network synchronization

===== Parameters

(none)

===== Returns

{boolean|object} - false if this client is not syncing with the network, otherwise an object with the following members:

  • {link:#quantity[Quantity]} currentBlock - number of the
    most-recent block synced
  • {link:#quantity[Quantity]} highestBlock - number of latest block
    on the network
  • {link:#quantity[Quantity]} startingBlock - block number at which
    syncing started

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_syncing", "params": [] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"currentBlock": '0x386',
"highestBlock": '0x454',
"startingBlock": '0x384'
}
}

'''''

==== eth_uninstallFilter

===== Description

Destroys a filter based on filter ID

Note: This should only be called if a filter and its notifications are no longer needed. This will also be called automatically on a filter if its notifications are not retrieved using eth_getFilterChanges for a period of time.

===== Parameters

[cols=",,",options="header",] |=== |# |Type |Description |1 |{link:#quantity[Quantity]} |ID of the filter to destroy |===

===== Returns

{boolean} - true if the filter is found and successfully destroyed or false if it is not

===== Example

[source,sh]

Request

curl -X POST --data '{ "id": 1337, "jsonrpc": "2.0", "method": "eth_uninstallFilter", "params": ["0xb"] }'

Response

{
"id": 1337,
"jsonrpc": "2.0",
"result": true
}

'''''

== Rationale

Much of Ethereum's effectiveness as an enterprise-grade application platform depends on its ability to provide a reliable and predictable developer experience. Nodes created by the current generation of Ethereum clients expose RPC endpoints with differing method signatures; this forces applications to work around method inconsistencies to maintain compatibility with various Ethereum RPC implementations.

Both Ethereum client developers and downstream dapp developers lack a formal Ethereum RPC specification. This proposal standardizes such a specification in a way that's versionable and modifiable through the traditional EIP process.

== Backwards compatibility

This proposal impacts Ethereum client developers by requiring that any exposed RPC interface adheres to this specification. This proposal impacts dapp developers by requiring that any RPC calls currently used in applications are made according to this specification.

== Implementation

The current generation of Ethereum clients includes several implementations that attempt to expose this RPC specification:

[cols=",,",options="header",] |=== |Client Name |Language |Homepage |Geth |Go |https://geth.ethereum.org[geth.ethereum.org] |Parity |Rust |https://parity.io/ethereum[parity.io/ethereum] |Aleth |C++ |https://cpp-ethereum.org[cpp-ethereum.org] |===

'''''

[[eip-1767-title-graphql-interface-to-ethereum-node-data-author-nick-johnson-arachnid-raúl-kripalani-raulk-kris-shinn-kshinn-discussions-to-httpsethereum-magiciansorgtgraphql-interface-to-ethereum-node-data2710-status-draft-type-standards-track-category-interface-created-2019-02-14]] == eip: 1767 title: GraphQL interface to Ethereum node data author: Nick Johnson (@arachnid), Raúl Kripalani (@raulk), Kris Shinn (@kshinn) discussions-to: https://ethereum-magicians.org/t/graphql-interface-to-ethereum-node-data/2710[https://ethereum-magicians.org/t/graphql-interface-to-ethereum-node-data/2710] status: Draft type: Standards Track category: Interface created: 2019-02-14

== GraphQL

This EIP specifies a GraphQL schema for accessing data stored on an Ethereum node. It aims to provide a complete replacement to the read-only information exposed via the present JSON-RPC interface, while improving on usability, consistency, efficiency, and future-proofing.

== Motivation

The current JSON-RPC interface for Ethereum nodes has a number of shortcomings. It's informally and incompletely specified in areas, which has led to incompatibilities around issues such as representation of empty byte strings ("" vs "0x" vs "0x0"), and it has to make educated guesses about the data a user will request, which often leads to unnecessary work.

For example, the totalDifficulty field is stored separately from the block header in common Ethereum node implementations, and many callers do not require this field. However, every call to eth_getBlock still retrieves this field, requiring a separate disk read, because the RPC server has no way of knowing if the user requires this field or not.

Similarly, transaction receipts in go-ethereum are stored on disk as a single binary blob for each block. Fetching a receipt for a single transaction requires fetching and deserializing this blob, then finding the relevant entry and returning it; this is accomplished by the eth_getTransactionReceipt API call. A common task for API consumers is to fetch all the receipts in a block; as a result, node implementations end up fetching and deserializing the same data repeatedly, leading to O(n^2) effort to fetch all transaction receipts from a block instead of O(n).

Some of these issues could be fixed with changes to the existing JSON-RPC interface, at the cost of complicating the interface somewhat. Instead, we propose adopting a standard query language, GraphQL, which facilitates more efficient API implementations, while also increasing flexibility.

== Prior Art

Nick Johnson and https://github.com/ConsenSys/ethql[EthQL] independently developed a GraphQL schema for node data. Once the parties were made aware of the shared effort, they made efforts to bring their schemas into alignment. The current schema proposed in this EIP is derived primarily from the EthQL schema.

== Specification

=== Node API

Compatible nodes MUST provide a GraphQL endpoint available over HTTP. This SHOULD be offered on port 8547 by default. The path to the GraphQL endpoint SHOULD be '/graphql'.

Compatible nodes MAY offer a GraphiQL interactive query explorer on the root path ('/').

=== Schema

The GraphQL schema for this service is defined as follows:

....

Bytes32 is a 32 byte binary string, represented as 0x-prefixed hexadecimal.

scalar Bytes32

Address is a 20 byte Ethereum address, represented as 0x-prefixed hexadecimal.

scalar Address

Bytes is an arbitrary length binary string, represented as 0x-prefixed hexadecimal.

An empty byte string is represented as '0x'. Byte strings must have an even number of hexadecimal nybbles.

scalar Bytes

BigInt is a large integer. Input is accepted as either a JSON number or as a string.

Strings may be either decimal or 0x-prefixed hexadecimal. Output values are all

0x-prefixed hexadecimal.

scalar BigInt

Long is a 64 bit unsigned integer.

scalar Long

schema { query: Query mutation: Mutation }

Account is an Ethereum account at a particular block.

type Account { # Address is the address owning the account. address: Address! # Balance is the balance of the account, in wei. balance: BigInt! # TransactionCount is the number of transactions sent from this account, # or in the case of a contract, the number of contracts created. Otherwise # known as the nonce. transactionCount: Long! # Code contains the smart contract code for this account, if the account # is a (non-self-destructed) contract. code: Bytes! # Storage provides access to the storage of a contract account, indexed # by its 32 byte slot identifier. storage(slot: Bytes32!): Bytes32! }

Log is an Ethereum event log.

type Log { # Index is the index of this log in the block. index: Int! # Account is the account which generated this log - this will always # be a contract account. account(block: Long): Account! # Topics is a list of 0-4 indexed topics for the log. topics: [Bytes32!]! # Data is unindexed data for this log. data: Bytes! # Transaction is the transaction that generated this log entry. transaction: Transaction! }

Transaction is an Ethereum transaction.

type Transaction { # Hash is the hash of this transaction. hash: Bytes32! # Nonce is the nonce of the account this transaction was generated with. nonce: Long! # Index is the index of this transaction in the parent block. This will # be null if the transaction has not yet been mined. index: Int # From is the account that sent this transaction - this will always be # an externally owned account. from(block: Long): Account! # To is the account the transaction was sent to. This is null for # contract-creating transactions. to(block: Long): Account # Value is the value, in wei, sent along with this transaction. value: BigInt! # GasPrice is the price offered to miners for gas, in wei per unit. gasPrice: BigInt! # Gas is the maximum amount of gas this transaction can consume. gas: Long! # InputData is the data supplied to the target of the transaction. inputData: Bytes! # Block is the block this transaction was mined in. This will be null if # the transaction has not yet been mined. block: Block

# Status is the return status of the transaction. This will be 1 if the
# transaction succeeded, or 0 if it failed (due to a revert, or due to
# running out of gas). If the transaction has not yet been mined, this
# field will be null.
status: Long
# GasUsed is the amount of gas that was used processing this transaction.
# If the transaction has not yet been mined, this field will be null.
gasUsed: Long
# CumulativeGasUsed is the total gas used in the block up to and including
# this transaction. If the transaction has not yet been mined, this field
# will be null.
cumulativeGasUsed: Long
# CreatedContract is the account that was created by a contract creation
# transaction. If the transaction was not a contract creation transaction,
# or it has not yet been mined, this field will be null.
createdContract(block: Long): Account
# Logs is a list of log entries emitted by this transaction. If the
# transaction has not yet been mined, this field will be null.
logs: [Log!]

}

BlockFilterCriteria encapsulates log filter criteria for a filter applied

to a single block.

input BlockFilterCriteria { # Addresses is list of addresses that are of interest. If this list is # empty, results will not be filtered by address. addresses: [Address!] # Topics list restricts matches to particular event topics. Each event has a list

of topics. Topics matches a prefix of that list. An empty element array matches any

topic. Non-empty elements represent an alternative that matches any of the

contained topics.

Examples:

- [] or nil matches any topic list

- [[A]] matches topic A in first position

- [[], [B]] matches any topic in first position, B in second position

- [[A], [B]] matches topic A in first position, B in second position

- [[A, B]], [C, D]] matches topic (A OR B) in first position, (C OR D) in second position

topics: [[Bytes32!]!]

}

Block is an Ethereum block.

type Block { # Number is the number of this block, starting at 0 for the genesis block. number: Long! # Hash is the block hash of this block. hash: Bytes32! # Parent is the parent block of this block. parent: Block # Nonce is the block nonce, an 8 byte sequence determined by the miner. nonce: Bytes! # TransactionsRoot is the keccak256 hash of the root of the trie of transactions in this block. transactionsRoot: Bytes32! # TransactionCount is the number of transactions in this block. if # transactions are not available for this block, this field will be null. transactionCount: Int # StateRoot is the keccak256 hash of the state trie after this block was processed. stateRoot: Bytes32! # ReceiptsRoot is the keccak256 hash of the trie of transaction receipts in this block. receiptsRoot: Bytes32! # Miner is the account that mined this block. miner(block: Long): Account! # ExtraData is an arbitrary data field supplied by the miner. extraData: Bytes! # GasLimit is the maximum amount of gas that was available to transactions in this block. gasLimit: Long! # GasUsed is the amount of gas that was used executing transactions in this block. gasUsed: Long! # Timestamp is the unix timestamp at which this block was mined. timestamp: BigInt! # LogsBloom is a bloom filter that can be used to check if a block may # contain log entries matching a filter. logsBloom: Bytes! # MixHash is the hash that was used as an input to the PoW process. mixHash: Bytes32! # Difficulty is a measure of the difficulty of mining this block. difficulty: BigInt! # TotalDifficulty is the sum of all difficulty values up to and including # this block. totalDifficulty: BigInt! # OmmerCount is the number of ommers (AKA uncles) associated with this # block. If ommers are unavailable, this field will be null. ommerCount: Int # Ommers is a list of ommer (AKA uncle) blocks associated with this block. # If ommers are unavailable, this field will be null. Depending on your # node, the transactions, transactionAt, transactionCount, ommers, # ommerCount and ommerAt fields may not be available on any ommer blocks. ommers: [Block] # OmmerAt returns the ommer (AKA uncle) at the specified index. If ommers # are unavailable, or the index is out of bounds, this field will be null. ommerAt(index: Int!): Block # OmmerHash is the keccak256 hash of all the ommers (AKA uncles) # associated with this block. ommerHash: Bytes32! # Transactions is a list of transactions associated with this block. If # transactions are unavailable for this block, this field will be null. transactions: [Transaction!] # TransactionAt returns the transaction at the specified index. If # transactions are unavailable for this block, or if the index is out of # bounds, this field will be null. transactionAt(index: Int!): Transaction # Logs returns a filtered set of logs from this block. logs(filter: BlockFilterCriteria!): [Log!]! # Account fetches an Ethereum account at the current block's state. account(address: Address!): Account # Call executes a local call operation at the current block's state. call(data: CallData!): CallResult # EstimateGas estimates the amount of gas that will be required for # successful execution of a transaction at the current block's state. estimateGas(data: CallData!): Long! }

CallData represents the data associated with a local contract call.

All fields are optional.

input CallData { # From is the address making the call. from: Address # To is the address the call is sent to. to: Address # Gas is the amount of gas sent with the call. gas: Long # GasPrice is the price, in wei, offered for each unit of gas. gasPrice: BigInt # Value is the value, in wei, sent along with the call. value: BigInt # Data is the data sent to the callee. data: Bytes }

CallResult is the result of a local call operation.

type CallResult { # Data is the return data of the called contract. data: Bytes! # GasUsed is the amount of gas used by the call, after any refunds. gasUsed: Long! # Status is the result of the call - 1 for success or 0 for failure. status: Long! }

FilterCriteria encapsulates log filter criteria for searching log entries.

input FilterCriteria { # FromBlock is the block at which to start searching, inclusive. Defaults # to the latest block if not supplied. fromBlock: Long # ToBlock is the block at which to stop searching, inclusive. Defaults # to the latest block if not supplied. toBlock: Long # Addresses is a list of addresses that are of interest. If this list is # empty, results will not be filtered by address. addresses: [Address!] # Topics list restricts matches to particular event topics. Each event has a list

of topics. Topics matches a prefix of that list. An empty element array matches any

topic. Non-empty elements represent an alternative that matches any of the

contained topics.

Examples:

- [] or nil matches any topic list

- [[A]] matches topic A in first position

- [[], [B]] matches any topic in first position, B in second position

- [[A], [B]] matches topic A in first position, B in second position

- [[A, B]], [C, D]] matches topic (A OR B) in first position, (C OR D) in second position

topics: [[Bytes32!]!]

}

SyncState contains the current synchronisation state of the client.

type SyncState{ # StartingBlock is the block number at which synchronisation started. startingBlock: Long! # CurrentBlock is the point at which synchronisation has presently reached. currentBlock: Long! # HighestBlock is the latest known block number. highestBlock: Long! # PulledStates is the number of state entries fetched so far, or null # if this is not known or not relevant. pulledStates: Long # KnownStates is the number of states the node knows of so far, or null # if this is not known or not relevant. knownStates: Long }

Pending represents the current pending state.

type Pending {

TransactionCount is the number of transactions in the pending state.

transactionCount: Int!

Transactions is a list of transactions in the current pending state.

transactions: [Transaction!]

Account fetches an Ethereum account for the pending state.

account(address: Address!): Account

Call executes a local call operation for the pending state.

call(data: CallData!): CallResult

EstimateGas estimates the amount of gas that will be required for

successful execution of a transaction for the pending state.

estimateGas(data: CallData!): Long! }

type Query { # Block fetches an Ethereum block by number or by hash. If neither is # supplied, the most recent known block is returned. block(number: Long, hash: Bytes32): Block # Blocks returns all the blocks between two numbers, inclusive. If # to is not supplied, it defaults to the most recent known block. blocks(from: Long!, to: Long): [Block!]! # Pending returns the current pending state. pending: Pending! # Transaction returns a transaction specified by its hash. transaction(hash: Bytes32!): Transaction # Logs returns log entries matching the provided filter. logs(filter: FilterCriteria!): [Log!]! # GasPrice returns the node's estimate of a gas price sufficient to # ensure a transaction is mined in a timely fashion. gasPrice: BigInt! # ProtocolVersion returns the current wire protocol version number. protocolVersion: Int! # Syncing returns information on the current synchronisation state. syncing: SyncState }

type Mutation { # SendRawTransaction sends an RLP-encoded transaction to the network. sendRawTransaction(data: Bytes!): Bytes32! } ....

Nodes MAY offer a superset of this schema, by adding new fields or types. Experimental or client-specific fields MUST be prefixed with 'client' (eg, 'geth' or 'parity'). Unprefixed fields MUST be specified in a new EIP that extends this one.

== Rationale

Ethereum nodes have been moving away from providing read-write functionality such as transaction and message signing, and from other services such as code compilation, in favor of a more 'unix-like' approach where each task is performed by a dedicated process. We have thus specified a core set of types and fields that reflects this trend, leaving out functionality that is presently, or intended to be, deprecated:

  • eth_compile* calls are deprecated, and hence not provided here.
  • eth_accounts, eth_sign, and eth_sendTransaction are considered
    by many to be deprecated, and are not provided here; callers should use
    local accounts or a separate signing daemon instead.

Further, two areas of the current API interface have been omitted for simplicity in this initial standard, with the intention that they will be defined in a later EIP:

  • Filters will require use of GraphQL subscriptions, and require careful
    consideration around the desire for nodes without local per-caller
    state.
  • Mining functionality is less-used and benefits less from
    reimplementation in GraphQL, and should be specified in a separate EIP.

== Backwards Compatibility

This schema implements the bulk of the current read-only functionality provided by the JSON-RPC node interface. Existing RPC calls can be mapped to GraphQL queries as follows:

[cols=",,",options="header",] |=== |RPC |Status |Description |eth_blockNumber |IMPLEMENTED |{ block { number } }

|eth_call |IMPLEMENTED |{ call(data: { to: "0x...", data: "0x..." }) { data status gasUsed } }

|eth_estimateGas |IMPLEMENTED |{ estimateGas(data: { to: "0x...", data: "0x..." }) }

|eth_gasPrice |IMPLEMENTED |{ gasPrice }

|eth_getBalance |IMPLEMENTED |{ account(address: "0x...") { balance } }

|eth_getBlockByHash |IMPLEMENTED |{ block(hash: "0x...") { ... } }

|eth_getBlockByNumber |IMPLEMENTED |{ block(number: 123) { ... } }

|eth_getBlockTransactionCountByHash |IMPLEMENTED |{ block(hash: "0x...") { transactionCount } }

|eth_getBlockTransactionCountByNumber |IMPLEMENTED |{ block(number: x) { transactionCounnt } }

|eth_getCode |IMPLEMENTED |{ account(address: "0x...") { code } }

|eth_getLogs |IMPLEMENTED |{ logs(filter: { ... }) { ... } } or { block(...) { logs(filter: { ... }) { ... } } }

|eth_getStorageAt |IMPLEMENTED |{ account(address: "0x...") { storage(slot: "0x...") } }

|eth_getTransactionByBlockHashAndIndex |IMPLEMENTED |{ block(hash: "0x...") { transactionAt(index: x) { ... } } }

|eth_getTransactionByBlockNumberAndIndex |IMPLEMENTED |{ block(number: n) { transactionAt(index: x) { ... } } }

|eth_getTransactionByHash |IMPLEMENTED |{ transaction(hash: "0x...") { ... } }

|eth_getTransactionCount |IMPLEMENTED |{ account(address: "0x...") { transactionCount } }

|eth_getTransactionReceipt |IMPLEMENTED |{ transaction(hash: "0x...") { ... } }

|eth_getUncleByBlockHashAndIndex |IMPLEMENTED |{ block(hash: "0x...") { ommerAt(index: x) { ... } } }

|eth_getUncleByBlockNumberAndIndex |IMPLEMENTED |{ block(number: n) { ommerAt(index: x) { ... } } }

|eth_getUncleCountByBlockHash |IMPLEMENTED |{ block(hash: "0x...") { ommerCount } }

|eth_getUncleCountByBlockNumber |IMPLEMENTED |{ block(number: x) { ommerCount } }

|eth_protocolVersion |IMPLEMENTED |{ protocolVersion }

|eth_sendRawTransaction |IMPLEMENTED |mutation { sendRawTransaction(data: data) }

|eth_syncing |IMPLEMENTED |{ syncing { ... } }

|eth_getCompilers |NOT IMPLEMENTED |Compiler functionality is deprecated in JSON-RPC.

|eth_compileLLL |NOT IMPLEMENTED |Compiler functionality is deprecated in JSON-RPC.

|eth_compileSolidity |NOT IMPLEMENTED |Compiler functionality is deprecated in JSON-RPC.

|eth_compileSerpent |NOT IMPLEMENTED |Compiler functionality is deprecated in JSON-RPC.

|eth_newFilter |NOT IMPLEMENTED |Filter functionality may be specified in a future EIP.

|eth_newBlockFilter |NOT IMPLEMENTED |Filter functionality may be specified in a future EIP.

|eth_newPendingTransactionFilter |NOT IMPLEMENTED |Filter functionality may be specified in a future EIP.

|eth_uninstallFilter |NOT IMPLEMENTED |Filter functionality may be specified in a future EIP.

|eth_getFilterChanges |NOT IMPLEMENTED |Filter functionality may be specified in a future EIP.

|eth_getFilterLogs |NOT IMPLEMENTED |Filter functionality may be specified in a future EIP.

|eth_accounts |NOT IMPLEMENTED |Accounts functionality is not part of the core node API.

|eth_sign |NOT IMPLEMENTED |Accounts functionality is not part of the core node API.

|eth_sendTransaction |NOT IMPLEMENTED |Accounts functionality is not part of the core node API.

|eth_coinbase |NOT IMPLEMENTED |Mining functionality to be defined separately.

|eth_getWork |NOT IMPLEMENTED |Mining functionality to be defined separately.

|eth_hashRate |NOT IMPLEMENTED |Mining functionality to be defined separately.

|eth_mining |NOT IMPLEMENTED |Mining functionality to be defined separately.

|eth_submitHashrate |NOT IMPLEMENTED |Mining functionality to be defined separately.

|eth_submitWork |NOT IMPLEMENTED |Mining functionality to be defined separately. |===

For specific reasoning behind omitted functionality, see the Rationale section.

== Test Cases

TBD.

== Implementation

== Copyright

Copyright and related rights waived via https://creativecommons.org/publicdomain/zero/1.0/[CC0].