Interacting with Ethereum

Interacting with the network via the Cloudflare Distributed Web Gateway is as simple as specifying the correct JSON blob for your query!

Reading from the network

The Cloudflare Ethereum Gateway allows HTTP requests where the body of the request is set to be the JSON body of the request you would like to make. For example, if you would like to read the block that is at number 0x2244, then your JSON blob takes the form:

{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x2244", true],"id":1}

Each blob must contain a valid method parameter, the Cloudflare supported methods are given below. The params contains here contains the block number that we would like to locate, and a boolean expressing whether each individual transaction in the block should be shown in their entirety (true), or as stubs (false).

If we wanted to send this query to the Ethereum Gateway, then we could use a simple cURL command:

curl https://cloudflare-eth.com -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'

You can also write the same query using the JS fetch API:

await fetch(new Request("https://cloudflare-eth.com", {
	method: "POST",
	body: JSON.stringify({
		"jsonrpc":"2.0",
		"method":"eth_getBlockByNumber",
		"params":["0x2244", true],
		"id":64
	}),
	headers: {
		"Content-Type": "application/json"
	}
})).then((resp) => {
	return resp.json()
});

The response in both cases will be a JSON blob of the form:

{
	"jsonrpc": "2.0",
	"id": 64,
	"result": {
		"difficulty": "0x746ef15b66",
		"extraData": "0x476574682f76312e302e302f6c696e75782f676f312e342e32",
		"gasLimit": "0x1388",
		"gasUsed": "0x0",
		"hash": "0xd6bb42034740c5d728e774e43a01f26222e0fcc279c504ca5963dc34fe70f392",
		"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
		"miner": "0xf927a40c8b7f6e07c5af7fa2155b4864a4112b13",
		"mixHash": "0x975da446e302e6da6cedb3fbaa763c3c203ae88d6fab4924e2a3d34a568c4361",
		"nonce": "0x88a7f12f49151c83",
		"number": "0x2244",
		"parentHash": "0x067fd84ecdbc7491bf5ec7d5d4ead361b1f590eec74797a7f90b4a7d7004a48d",
		"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
		"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
		"size": "0x21b",
		"stateRoot": "0x828dade2067283e370993ec6a1bda0e65c1310e404a6d5bbb030b596eb80017c",
		"timestamp": "0x55bb040f",
		"totalDifficulty": "0x5c328da43525d",
		"transactions": [],
		"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
		"uncles": []
	}
}

For a full list of possible queries, along with examples see the official RPC documentation.

Writing to the network

Currently the Ethereum Gateway allows you to write to the network using the eth_sendRawTransaction RPC method. This creates a new message call transaction or a contract creation for signed transactions. The transactions are signed using a secret key corresponding to your own Ethereum wallet. There are guides available at the previous link describing how to set up such a wallet.

Once you have a wallet set up, and a method of signing your own transactions, you can write that transaction to the Ethereum network via the Cloudflare Ethereum Gateway. Signed transactions we hexadecimal strings of the form:

"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"

Then you can use the Gateway to send the transaction to the network with a cURL command:

curl https://cloudflare-eth.com -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"],"id":1}'

or using a JS fetch API request:

await fetch(new Request("https://cloudflare-eth.com", {
	method: "POST",
	body: JSON.stringify({
		"jsonrpc":"2.0",
		"method":"eth_sendRawTransaction",
		"params":["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", true],
		"id":1
	}),
	headers: {
		"Content-Type": "application/json"
	}
})).then((resp) => {
	return resp.json()
});

(The actual command above will not work, you need to provide your own signed transaction!)

Cloudflare supported API

The full list of API methods that are supported by the Distributed Web Gateway is given below. The Gateway returns a 403 if a method is specified that is not supported.

RPC API method Cloudflare Distributed Web Gateway support
web3_clientVersion X
web3_sha3 X
net_version X
net_peerCount X
net_listening X
eth_protocolVersion X
eth_syncing X
eth_coinbase
eth_mining X
eth_hashrate X
eth_gasPrice X
eth_accounts X
eth_blockNumber X
eth_getBalance X
eth_getStorageAt X
eth_getTransactionCount X
eth_getBlockTransactionCountByHash X
eth_getBlockTransactionCountByNumber X
eth_getUncleCountByBlockHash X
eth_getUncleCountByBlockNumber X
eth_getCode X
eth_sign
eth_sendTransaction
eth_sendRawTransaction X
eth_call X
eth_estimateGas X
eth_getBlockByHash X
eth_getBlockByNumber X
eth_getTransactionByHash X
eth_getTransactionByBlockHashAndIndex X
eth_getTransactionByBlockNumberAndIndex X
eth_getTransactionReceipt X
eth_pendingTransactions X
eth_getUncleByBlockHashAndIndex X
eth_getUncleByBlockNumberAndIndex X
eth_getCompilers
eth_compileLLL
eth_compileSolidity
eth_compileSerpent
eth_newFilter
eth_newBlockFilter
eth_newPendingTransactionFilter
eth_uninstallFilter
eth_getFilterChanges
eth_getFilterLogs
eth_getLogs X
eth_getWork X
eth_submitWork X
eth_submitHashrate X
eth_getProof X