Vai al contenuto principale
Change page

API JSON-RPC

Affinché un'applicazione software possa interagire con la blockchain di Ethereum - sia leggendo i dati della blockchain che inviando transazioni alla rete - deve connettersi a un nodo Ethereum.

A questo scopo, ogni client Ethereum implementa una specifica JSON-RPC (opens in a new tab), in modo che esista un insieme uniforme di metodi su cui le applicazioni possono fare affidamento indipendentemente dal nodo specifico o dall'implementazione del client.

JSON-RPC (opens in a new tab) è un protocollo di chiamata di procedura remota (RPC) leggero e senza stato. Definisce diverse strutture dati e le regole per la loro elaborazione. È indipendente dal trasporto, in quanto i concetti possono essere utilizzati all'interno dello stesso processo, su socket, su HTTP o in molti ambienti diversi di passaggio di messaggi. Utilizza JSON (RFC 4627) come formato dei dati.

Implementazioni dei client

I client di Ethereum possono utilizzare diversi linguaggi di programmazione nell'implementare le specifiche JSON-RPC. Consulta la documentazione dei singoli client per ulteriori dettagli relativi a specifici linguaggi di programmazione. Consigliamo di controllare la documentazione di ciascun client per le informazioni più recenti sul supporto delle API.

Librerie di utilità

Sebbene si possa scegliere di interagire direttamente con i client Ethereum tramite l'API JSON-RPC, spesso esistono opzioni più semplici per gli sviluppatori di applicazioni decentralizzate (dapp). Esistono molte librerie JavaScript e di API di backend che forniscono wrapper sopra l'API JSON-RPC. Con queste librerie, gli sviluppatori possono scrivere metodi intuitivi di una sola riga nel linguaggio di programmazione che preferiscono per inizializzare richieste JSON-RPC (internamente) che interagiscono con Ethereum.

API dei client di consenso

Questa pagina tratta principalmente l'API JSON-RPC utilizzata dai client di esecuzione di Ethereum. Tuttavia, anche i client di consenso dispongono di un'API RPC che consente agli utenti di richiedere informazioni sul nodo, i blocchi Beacon, lo stato Beacon e altre informazioni relative al consenso direttamente da un nodo. Questa API è documentata nella pagina web dell'API Beacon (opens in a new tab).

Un'API interna viene utilizzata anche per la comunicazione tra client all'interno di un nodo, ovvero consente al client di consenso e al client di esecuzione di scambiare dati. Questa è chiamata 'Engine API' e le specifiche sono disponibili su GitHub (opens in a new tab).

Specifiche del client di esecuzione

Leggi le specifiche complete dell'API JSON-RPC su GitHub (opens in a new tab). Questa API è documentata nella pagina web dell'API di esecuzione (opens in a new tab) e include un Inspector per provare tutti i metodi disponibili.

Convenzioni

Codifica dei valori esadecimali

Due tipi di dati chiave vengono passati tramite JSON: array di byte non formattati e quantità. Entrambi vengono passati con una codifica esadecimale ma con requisiti diversi per la formattazione.

Quantità

Quando si codificano quantità (interi, numeri): codificare in esadecimale, prefissare con "0x", la rappresentazione più compatta (piccola eccezione: lo zero dovrebbe essere rappresentato come "0x0").

Ecco alcuni esempi:

  • 0x41 (65 in decimale)
  • 0x400 (1024 in decimale)
  • SBAGLIATO: 0x (dovrebbe sempre avere almeno una cifra - lo zero è "0x0")
  • SBAGLIATO: 0x0400 (non sono ammessi zeri iniziali)
  • SBAGLIATO: ff (deve essere prefissato con 0x)

Dati non formattati

Quando si codificano dati non formattati (array di byte, indirizzi di account, hash, array di bytecode): codificare in esadecimale, prefissare con "0x", due cifre esadecimali per byte.

Ecco alcuni esempi:

  • 0x41 (dimensione 1, "A")
  • 0x004200 (dimensione 3, "0B0")
  • 0x (dimensione 0, "")
  • SBAGLIATO: 0xf0f0f (deve essere un numero pari di cifre)
  • SBAGLIATO: 004200 (deve essere prefissato con 0x)

Il parametro del blocco

I seguenti metodi hanno un parametro del blocco:

Quando vengono effettuate richieste che interrogano lo stato di Ethereum, il parametro del blocco fornito determina l'altezza del blocco.

Le seguenti opzioni sono possibili per il parametro del blocco:

  • HEX String - un numero di blocco intero
  • String "earliest" per il primo blocco/blocco genesi
  • String "latest" - per l'ultimo blocco proposto
  • String "safe" - per l'ultimo blocco head sicuro
  • String "finalized" - per l'ultimo blocco finalizzato
  • String "pending" - per lo stato/transazioni in sospeso

Esempi

In questa pagina forniamo esempi su come utilizzare i singoli endpoint dell'API JSON_RPC tramite lo strumento a riga di comando curl (opens in a new tab). Questi esempi di singoli endpoint si trovano di seguito nella sezione Esempi con curl. Più in basso nella pagina, forniamo anche un esempio end-to-end per la compilazione e la distribuzione di uno smart contract utilizzando un nodo Geth, l'API JSON_RPC e curl.

Esempi con curl

Di seguito sono forniti esempi di utilizzo dell'API JSON_RPC effettuando richieste curl (opens in a new tab) a un nodo Ethereum. Ogni esempio include una descrizione dell'endpoint specifico, i suoi parametri, il tipo di ritorno e un esempio pratico di come dovrebbe essere utilizzato.

Le richieste curl potrebbero restituire un messaggio di errore relativo al tipo di contenuto. Questo perché l'opzione --data imposta il tipo di contenuto su application/x-www-form-urlencoded. Se il tuo nodo segnala questo problema, imposta manualmente l'intestazione inserendo -H "Content-Type: application/json" all'inizio della chiamata. Inoltre, gli esempi non includono la combinazione di URL/IP e porta, che deve essere l'ultimo argomento fornito a curl (es. 127.0.0.1:8545). Una richiesta curl completa che include questi dati aggiuntivi assume la seguente forma:

curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545

Gossip, stato, cronologia

Una manciata di metodi JSON-RPC principali richiede dati dalla rete Ethereum e si divide ordinatamente in tre categorie principali: Gossip, stato e cronologia. Usa i link in queste sezioni per passare a ciascun metodo, oppure usa il sommario per esplorare l'intero elenco dei metodi.

Metodi di gossip

Questi metodi tracciano la testa della catena. È così che le transazioni si fanno strada nella rete, trovano posto nei blocchi e come i client scoprono i nuovi blocchi.

Metodi di stato

Metodi che riportano lo stato attuale di tutti i dati archiviati. Lo "stato" è come un grande pezzo di RAM condivisa e include i saldi degli account, i dati dei contratti e le stime del gas.

Metodi di cronologia

Recupera i registri storici di ogni blocco fino al blocco genesi. È come un grande file di sola aggiunta e include tutte le intestazioni dei blocchi, i corpi dei blocchi, i blocchi uncle e le ricevute delle transazioni.

Playground dell'API JSON-RPC

Puoi usare lo strumento playground (opens in a new tab) per scoprire e provare i metodi dell'API. Ti mostra anche quali metodi e reti sono supportati dai vari provider di nodi.

Metodi API JSON-RPC

web3_clientVersion

Restituisce la versione attuale del client.

Parametri

Nessuno

Restituisce

String - La versione attuale del client

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'
// Risultato
{
  "id":67,
  "jsonrpc":"2.0",
  "result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1"
}

web3_sha3

Restituisce il Keccak-256 (non lo SHA3-256 standardizzato) dei dati forniti.

Parametri

  1. DATA - I dati da convertire in un hash SHA3
params: ["0x68656c6c6f20776f726c64"]

Restituisce

DATA - Il risultato SHA3 della stringa fornita.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}'
// Risultato
{
  "id":64,
  "jsonrpc": "2.0",
  "result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"
}

net_version

Restituisce l'ID della rete corrente.

Parametri

Nessuno

Restituisce

String - L'ID della rete corrente.

L'elenco completo degli ID di rete correnti è disponibile su chainlist.org (opens in a new tab). Alcuni tra i più comuni sono:

  • 1: Mainnet di Ethereum
  • 11155111: testnet Sepolia
  • 560048 : testnet Hoodi

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'
// Risultato
{
  "id":67,
  "jsonrpc": "2.0",
  "result": "3"
}

net_listening

Restituisce true se il client è in ascolto attivo per le connessioni di rete.

Parametri

Nessuno

Restituisce

Boolean - true quando è in ascolto, altrimenti false.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}'
// Risultato
{
  "id":67,
  "jsonrpc":"2.0",
  "result":true
}

net_peerCount

Restituisce il numero di peer attualmente connessi al client.

Parametri

Nessuno

Restituisce

QUANTITY - numero intero dei peer connessi.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'
// Risultato
{
  "id":74,
  "jsonrpc": "2.0",
  "result": "0x2" // 2
}

eth_protocolVersion

Restituisce la versione attuale del protocollo Ethereum. Nota che questo metodo non è disponibile in Geth (opens in a new tab).

Parametri

Nessuno

Restituisce

String - La versione attuale del protocollo Ethereum

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}'
// Risultato
{
  "id":67,
  "jsonrpc": "2.0",
  "result": "54"
}

eth_syncing

Restituisce un oggetto con i dati sullo stato della sincronizzazione o false.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

Nessuno

Restituisce

I dati precisi restituiti variano tra le implementazioni dei client. Tutti i client restituiscono False quando il nodo non è in sincronizzazione e tutti i client restituiscono i seguenti campi.

Object|Boolean, Un oggetto con i dati sullo stato della sincronizzazione o FALSE, quando non è in sincronizzazione:

  • startingBlock: QUANTITY - Il blocco al quale è iniziata l'importazione (verrà reimpostato solo dopo che la sincronizzazione avrà raggiunto la sua testa)
  • currentBlock: QUANTITY - Il blocco corrente, uguale a eth_blockNumber
  • highestBlock: QUANTITY - Il blocco più alto stimato

Tuttavia, i singoli client potrebbero fornire anche dati aggiuntivi. Ad esempio, Geth restituisce quanto segue:

Mentre Besu restituisce:

Fai riferimento alla documentazione del tuo client specifico per maggiori dettagli.

Esempio

eth_coinbase

Restituisce l'indirizzo coinbase del client.

Prova l'endpoint nel playground (opens in a new tab)

Nota: Questo metodo è stato deprecato a partire dalla versione v1.14.0 e non è più supportato. Il tentativo di utilizzare questo metodo genererà un errore "Method not supported".

Parametri

Nessuno

Restituisce

DATA, 20 byte - l'indirizzo coinbase corrente.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}'
// Risultato
{
  "id":64,
  "jsonrpc": "2.0",
  "result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1"
}

eth_chainId

Restituisce l'ID della catena utilizzato per la firma delle transazioni protette da replay.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

Nessuno

Restituisce

chainId, valore esadecimale come stringa che rappresenta l'intero dell'ID della catena corrente.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}'
// Risultato
{
  "id":67,
  "jsonrpc": "2.0",
  "result": "0x1"
}

eth_mining

Restituisce true se il client sta attivamente minando nuovi blocchi. Questo può restituire true solo per le reti basate su Prova di lavoro (PoW) e potrebbe non essere disponibile in alcuni client da The Merge.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

Nessuno

Restituisce

Boolean - restituisce true se il client sta minando, altrimenti false.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}'
//
{
  "id":71,
  "jsonrpc": "2.0",
  "result": true
}

eth_hashrate

Restituisce il numero di hash al secondo con cui il nodo sta effettuando il minaggio. Questo può restituire true solo per le reti di Prova di lavoro (PoW) e potrebbe non essere disponibile in alcuni client da The Merge.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

Nessuno

Restituisce

QUANTITY - numero di hash al secondo.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}'
// Risultato
{
  "id":71,
  "jsonrpc": "2.0",
  "result": "0x38a"
}

eth_gasPrice

Restituisce una stima del prezzo attuale per gas in Wei. Ad esempio, il client Besu esamina gli ultimi 100 blocchi e restituisce il prezzo mediano dell'unità di gas per impostazione predefinita.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

Nessuno

Restituisce

QUANTITY - numero intero dell'attuale prezzo del gas in Wei.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}'
// Risultato
{
  "id":73,
  "jsonrpc": "2.0",
  "result": "0x1dfd14000" // 8049999872 Wei
}

eth_accounts

Restituisce un elenco di indirizzi posseduti dal client.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

Nessuno

Restituisce

Array of DATA, 20 byte - indirizzi posseduti dal client.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]
}

eth_blockNumber

Restituisce il numero del blocco più recente.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

Nessuno

Restituisce

QUANTITY - intero del numero del blocco corrente su cui si trova il client.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'
// Risultato
{
  "id":83,
  "jsonrpc": "2.0",
  "result": "0x4b7" // 1207
}

eth_getBalance

Restituisce il saldo dell'account a un dato indirizzo.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 20 Byte - indirizzo di cui controllare il saldo.
  2. QUANTITY|TAG - numero di blocco intero, o la stringa "latest", "earliest", "pending", "safe" o "finalized", vedi il parametro del blocco
params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]

Restituisce

QUANTITY - intero del saldo attuale in Wei.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x0234c8a3397aab58" // 158972490234375000
}

eth_getStorageAt

Restituisce il valore da una posizione di storage a un dato indirizzo.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 20 byte - indirizzo dello storage.
  2. QUANTITY - intero della posizione nello storage.
  3. QUANTITY|TAG - numero di blocco intero, o la stringa "latest", "earliest", "pending", "safe", "finalized", vedi il parametro del blocco

Restituisce

DATA - il valore in questa posizione di storage.

Esempio Il calcolo della posizione corretta dipende dallo storage da recuperare. Considera il seguente contratto distribuito in 0x295a70b2de5e3953354a6a8344e616ed314d7251 dall'indirizzo 0x391694e7e0b0cce554cb130d723a9d27458f9298.

contract Storage {
    uint pos0;
    mapping(address => uint) pos1;
    constructor() {
        pos0 = 1234;
        pos1[msg.sender] = 5678;
    }
}

Recuperare il valore di pos0 è semplice:

curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545
{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"}

Recuperare un elemento della mappa è più difficile. La posizione di un elemento nella mappa è calcolata con:

keccak(LeftPad32(key, 0), LeftPad32(map position, 0))

Questo significa che per recuperare lo storage su pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] dobbiamo calcolare la posizione con:

keccak(
  decodeHex(
    "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" +
      "0000000000000000000000000000000000000000000000000000000000000001"
  )
)

La console di Geth fornita con la libreria Web3 può essere utilizzata per effettuare il calcolo:

> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
undefined
> web3.sha3(key, {"encoding": "hex"})
"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"

Ora per recuperare lo storage:

curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545
{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"}

eth_getTransactionCount

Restituisce il numero di transazioni inviate da un indirizzo.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 20 byte - indirizzo.
  2. QUANTITY|TAG - numero di blocco intero, o la stringa "latest", "earliest", "pending", "safe" o "finalized", vedi il parametro del blocco
params: [
  "0x407d73d8a49eeb85d32cf465507dd71d507100c1",
  "latest", // stato all'ultimo blocco
]

Restituisce

QUANTITY - intero del numero di transazioni inviate da questo indirizzo.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x1" // 1
}

eth_getBlockTransactionCountByHash

Restituisce il numero di transazioni presenti in un blocco corrispondente all'hash del blocco fornito.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 32 byte - hash di un blocco
params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]

Restituisce

QUANTITY - numero intero di transazioni in questo blocco.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x8b" // 139
}

eth_getBlockTransactionCountByNumber

Restituisce il numero di transazioni in un blocco corrispondente al numero di blocco fornito.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. QUANTITY|TAG - intero di un numero di blocco, o la stringa "earliest", "latest", "pending", "safe" o "finalized", come nel parametro del blocco.
params: [
  "0x13738ca", // 20396234
]

Restituisce

QUANTITY - intero del numero di transazioni in questo blocco.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x8b" // 139
}

eth_getUncleCountByBlockHash

Restituisce il numero di uncle in un blocco a partire da un blocco che corrisponde all'hash del blocco fornito.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 32 byte - hash di un blocco
params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]

Restituisce

QUANTITY - numero intero di uncle in questo blocco.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x1" // 1
}

eth_getUncleCountByBlockNumber

Restituisce il numero di uncle in un blocco corrispondente al numero di blocco specificato.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. QUANTITY|TAG - intero di un numero di blocco, o la stringa "latest", "earliest", "pending", "safe" o "finalized", vedi il parametro del blocco
params: [
  "0xe8", // 232
]

Restituisce

QUANTITY - intero del numero di uncle in questo blocco.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x0" // 0
}

eth_getCode

Restituisce il codice a un dato indirizzo.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 20 byte - indirizzo
  2. QUANTITY|TAG - numero di blocco intero, o la stringa "latest", "earliest", "pending", "safe" o "finalized", vedi il parametro del blocco
params: [
  "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
  "0x5daf3b", // 6139707
]

Restituisce

DATA - il codice dal dato indirizzo.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"
}

eth_sign

Il metodo sign calcola una firma specifica di Ethereum con: sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))).

L'aggiunta di un prefisso al messaggio rende la firma calcolata riconoscibile come una firma specifica di Ethereum. Ciò previene abusi in cui un'applicazione decentralizzata (dapp) malevola può firmare dati arbitrari (es. una transazione) e utilizzare la firma per impersonare la vittima.

Nota: l'indirizzo con cui firmare deve essere sbloccato.

Parametri

  1. DATA, 20 Byte - indirizzo
  2. DATA, N Byte - messaggio da firmare

Restituisce

DATA: Firma

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
}

eth_signTransaction

Firma una transazione che può essere inviata alla rete in un secondo momento utilizzando eth_sendRawTransaction.

Parametri

  1. Object - L'oggetto della transazione
  • type:
  • from: DATA, 20 byte - L'indirizzo da cui viene inviata la transazione.
  • to: DATA, 20 byte - (opzionale quando si crea un nuovo contratto) L'indirizzo a cui è diretta la transazione.
  • gas: QUANTITY - (opzionale, predefinito: 90000) Numero intero del gas fornito per l'esecuzione della transazione. Restituirà il gas non utilizzato.
  • gasPrice: QUANTITY - (opzionale, predefinito: da determinare) Numero intero del gasPrice utilizzato per ogni gas pagato, in Wei.
  • value: QUANTITY - (opzionale) Numero intero del valore inviato con questa transazione, in Wei.
  • data: DATA - Il codice compilato di un contratto OPPURE l'hash della firma del metodo invocato e dei parametri codificati.
  • nonce: QUANTITY - (opzionale) Numero intero di un nonce. Questo consente di sovrascrivere le proprie transazioni in sospeso che utilizzano lo stesso nonce.

Restituisce

DATA, L'oggetto della transazione codificato in RLP firmato dall'account specificato.

Esempio

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

eth_sendTransaction

Crea una nuova transazione di chiamata di messaggio o la creazione di un contratto, se il campo dati contiene codice, e la firma utilizzando l'account specificato in from.

Parametri

  1. Object - L'oggetto della transazione
  • from: DATA, 20 byte - L'indirizzo da cui viene inviata la transazione.
  • to: DATA, 20 byte - (opzionale quando si crea un nuovo contratto) L'indirizzo a cui è diretta la transazione.
  • gas: QUANTITY - (opzionale, predefinito: 90000) Intero del gas fornito per l'esecuzione della transazione. Restituirà il gas non utilizzato.
  • gasPrice: QUANTITY - (opzionale, predefinito: Da determinare) Intero del gasPrice utilizzato per ogni gas pagato.
  • value: QUANTITY - (opzionale) Intero del valore inviato con questa transazione.
  • input: DATA - Il codice compilato di un contratto OPPURE l'hash della firma del metodo invocato e dei parametri codificati.
  • nonce: QUANTITY - (opzionale) Intero di un nonce. Questo consente di sovrascrivere le proprie transazioni in sospeso che utilizzano lo stesso nonce.

Restituisce

DATA, 32 byte - l'hash della transazione, o l'hash zero se la transazione non è ancora disponibile.

Usa eth_getTransactionReceipt per ottenere l'indirizzo del contratto, dopo che la transazione è stata proposta in un blocco, quando hai creato un contratto.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}

eth_sendRawTransaction

Crea una nuova transazione di chiamata di messaggio o la creazione di un contratto per le transazioni firmate.

Parametri

  1. DATA, I dati della transazione firmata.
params: [
  "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
]

Restituisce

DATA, 32 Byte - l'hash della transazione, o l'hash zero se la transazione non è ancora disponibile.

Usa eth_getTransactionReceipt per ottenere l'indirizzo del contratto, dopo che la transazione è stata proposta in un blocco, quando hai creato un contratto.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}

eth_call

Esegue immediatamente una nuova chiamata di messaggio senza creare una transazione sulla blockchain. Spesso utilizzata per eseguire funzioni di smart contract di sola lettura, ad esempio il balanceOf per un contratto ERC-20.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. Object - L'oggetto della chiamata di transazione
  • from: DATA, 20 Byte - (opzionale) L'indirizzo da cui viene inviata la transazione.
  • to: DATA, 20 Byte - L'indirizzo a cui è diretta la transazione.
  • gas: QUANTITY - (opzionale) Intero del gas fornito per l'esecuzione della transazione. eth_call consuma zero gas, ma questo parametro potrebbe essere necessario per alcune esecuzioni.
  • gasPrice: QUANTITY - (opzionale) Intero del gasPrice utilizzato per ogni gas pagato
  • value: QUANTITY - (opzionale) Intero del valore inviato con questa transazione
  • input: DATA - (opzionale) Hash della firma del metodo e dei parametri codificati. Per i dettagli, vedere l'ABI del contratto Ethereum nella documentazione di Solidity (opens in a new tab).
  1. QUANTITY|TAG - numero di blocco intero o la stringa "latest", "earliest", "pending", "safe" o "finalized", vedere il parametro del blocco

Restituisce

DATA - il valore di ritorno del contratto eseguito.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x"
}

eth_estimateGas

Genera e restituisce una stima di quanto gas sia necessario per consentire il completamento della transazione. La transazione non verrà aggiunta alla blockchain. Nota che la stima potrebbe essere significativamente maggiore della quantità di gas effettivamente utilizzata dalla transazione, per una serie di motivi, tra cui le meccaniche dell'EVM e le prestazioni del nodo.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

Vedi i parametri di eth_call, con l'eccezione che tutte le proprietà sono facoltative. Se non viene specificato alcun limite di gas, geth utilizza il limite di gas del blocco in sospeso come limite massimo. Di conseguenza, la stima restituita potrebbe non essere sufficiente per eseguire la chiamata/transazione quando la quantità di gas è superiore al limite di gas del blocco in sospeso.

Restituisce

QUANTITY - la quantità di gas utilizzata.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x5208" // 21000
}

eth_getBlockByHash

Restituisce informazioni su un blocco tramite hash.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 32 byte - Hash di un blocco.
  2. Boolean - Se true restituisce gli oggetti completi della transazione, se false solo gli hash delle transazioni.
params: [
  "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
  false,
]

Restituisce

Object - Un oggetto blocco, oppure null quando non è stato trovato alcun blocco:

  • number: QUANTITY - il numero del blocco. null quando è un blocco in sospeso.
  • hash: DATA, 32 byte - hash del blocco. null quando è un blocco in sospeso.
  • parentHash: DATA, 32 byte - hash del blocco genitore.
  • nonce: DATA, 8 byte - hash della Prova di lavoro (PoW) generata. null quando è un blocco in sospeso, 0x0 per i blocchi Proof-of-Stake (PoS) (da The Merge)
  • sha3Uncles: DATA, 32 byte - SHA3 dei dati degli uncle nel blocco.
  • logsBloom: DATA, 256 byte - il filtro di bloom per i log del blocco. null quando è un blocco in sospeso.
  • transactionsRoot: DATA, 32 byte - la radice del trie delle transazioni del blocco.
  • stateRoot: DATA, 32 byte - la radice del trie di stato finale del blocco.
  • receiptsRoot: DATA, 32 byte - la radice del trie delle ricevute del blocco.
  • miner: DATA, 20 byte - l'indirizzo del beneficiario a cui sono state date le ricompense del blocco.
  • difficulty: QUANTITY - intero della difficoltà per questo blocco.
  • totalDifficulty: QUANTITY - intero della difficoltà totale della catena fino a questo blocco.
  • extraData: DATA - il campo "extra data" di questo blocco.
  • size: QUANTITY - intero della dimensione di questo blocco in byte.
  • gasLimit: QUANTITY - il gas massimo consentito in questo blocco.
  • gasUsed: QUANTITY - il gas totale utilizzato da tutte le transazioni in questo blocco.
  • timestamp: QUANTITY - il timestamp unix di quando il blocco è stato assemblato.
  • transactions: Array - Array di oggetti transazione, o hash di transazione da 32 byte a seconda dell'ultimo parametro fornito.
  • uncles: Array - Array di hash degli uncle.

Esempio

eth_getBlockByNumber

Restituisce informazioni su un blocco in base al numero del blocco.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. QUANTITY|TAG - intero di un numero di blocco, o la stringa "earliest", "latest", "pending", "safe" o "finalized", come nel parametro del blocco.
  2. Boolean - Se true restituisce gli oggetti completi delle transazioni, se false solo gli hash delle transazioni.
params: [
  "0x1b4", // 436
  true,
]

Restituisce Vedi eth_getBlockByHash

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'

Per il risultato vedi eth_getBlockByHash

eth_getTransactionByHash

Restituisce le informazioni su una transazione richiesta tramite l'hash della transazione.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 32 byte - hash di una transazione
params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"]

Restituisce

Object - Un oggetto transazione, oppure null quando non è stata trovata alcuna transazione:

  • blockHash: DATA, 32 byte - hash del blocco in cui si trovava questa transazione. null quando è in sospeso.
  • blockNumber: QUANTITY - numero del blocco in cui si trovava questa transazione. null quando è in sospeso.
  • from: DATA, 20 byte - indirizzo del mittente.
  • gas: QUANTITY - gas fornito dal mittente.
  • gasPrice: QUANTITY - prezzo del gas fornito dal mittente in Wei.
  • hash: DATA, 32 byte - hash della transazione.
  • input: DATA - i dati inviati insieme alla transazione.
  • nonce: QUANTITY - il numero di transazioni effettuate dal mittente prima di questa.
  • to: DATA, 20 byte - indirizzo del destinatario. null quando è una transazione di creazione del contratto.
  • transactionIndex: QUANTITY - numero intero della posizione dell'indice della transazione nel blocco. null quando è in sospeso.
  • value: QUANTITY - valore trasferito in Wei.
  • v: QUANTITY - ID di recupero ECDSA
  • r: QUANTITY - r della firma ECDSA
  • s: QUANTITY - s della firma ECDSA

Esempio

eth_getTransactionByBlockHashAndIndex

Restituisce informazioni su una transazione in base all'hash del blocco e alla posizione dell'indice della transazione.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 32 byte - hash di un blocco.
  2. QUANTITY - intero della posizione dell'indice della transazione.
params: [
  "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
  "0x0", // 0
]

Restituisce Vedi eth_getTransactionByHash

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'

Per il risultato vedi eth_getTransactionByHash

eth_getTransactionByBlockNumberAndIndex

Restituisce informazioni su una transazione in base al numero del blocco e alla posizione dell'indice della transazione.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. QUANTITY|TAG - un numero di blocco, o la stringa "earliest", "latest", "pending", "safe" o "finalized", come nel parametro del blocco.
  2. QUANTITY - la posizione dell'indice della transazione.
params: [
  "0x9c47cf", // 10241999
  "0x24", // 36
]

Restituisce Vedi eth_getTransactionByHash

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}'

Per il risultato vedi eth_getTransactionByHash

eth_getTransactionReceipt

Restituisce la ricevuta di una transazione tramite l'hash della transazione.

Nota che la ricevuta non è disponibile per le transazioni in sospeso.

Parametri

  1. DATA, 32 byte: hash di una transazione
params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"]

Restituisce Object - Un oggetto della ricevuta della transazione, oppure null quando non è stata trovata alcuna ricevuta:

  • transactionHash : DATA, 32 byte: hash della transazione.
  • transactionIndex: QUANTITY - intero della posizione dell'indice della transazione nel blocco.
  • blockHash: DATA, 32 byte: hash del blocco in cui si trovava questa transazione.
  • blockNumber: QUANTITY - numero del blocco in cui si trovava questa transazione.
  • from: DATA, 20 byte: indirizzo del mittente.
  • to: DATA, 20 byte: indirizzo del destinatario. null quando si tratta di una transazione di creazione del contratto.
  • cumulativeGasUsed : QUANTITY - La quantità totale di gas utilizzata quando questa transazione è stata eseguita nel blocco.
  • effectiveGasPrice : QUANTITY - La somma della commissione di base e della commissione prioritaria pagate per unità di gas.
  • gasUsed : QUANTITY - La quantità di gas utilizzata solo da questa specifica transazione.
  • contractAddress : DATA, 20 byte: L'indirizzo del contratto creato, se la transazione era una creazione di contratto, altrimenti null.
  • logs: Array - Array di oggetti di log generati da questa transazione.
  • logsBloom: DATA, 256 byte: Filtro di Bloom per i client leggeri per recuperare rapidamente i log correlati.
  • type: QUANTITY - intero del tipo di transazione, 0x0 per le transazioni legacy, 0x1 per i tipi di lista di accesso, 0x2 per le commissioni dinamiche.

Restituisce inoltre uno dei seguenti :

  • root : DATA 32 byte della radice di stato post-transazione (pre-Byzantium)
  • status: QUANTITY 1(successo) oppure0` (fallimento)

Esempio

eth_getUncleByBlockHashAndIndex

Restituisce informazioni su un uncle di un blocco in base all'hash e alla posizione dell'indice dell'uncle.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. DATA, 32 byte - L'hash di un blocco.
  2. QUANTITY - La posizione dell'indice dell'uncle.
params: [
  "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
  "0x0", // 0
]

Restituisce Vedi eth_getBlockByHash

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'

Per il risultato vedi eth_getBlockByHash

Nota: Un uncle non contiene singole transazioni.

eth_getUncleByBlockNumberAndIndex

Restituisce informazioni su un uncle di un blocco in base al numero e alla posizione dell'indice dell'uncle.

Prova l'endpoint nel playground (opens in a new tab)

Parametri

  1. QUANTITY|TAG - un numero di blocco, o la stringa "earliest", "latest", "pending", "safe", "finalized", come nel parametro del blocco.
  2. QUANTITY - la posizione dell'indice dell'uncle.
params: [
  "0x29c", // 668
  "0x0", // 0
]

Restituisce Vedi eth_getBlockByHash

Nota: un uncle non contiene transazioni individuali.

Esempio

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

Per il risultato vedi eth_getBlockByHash

eth_newFilter

Crea un oggetto filtro, in base alle opzioni del filtro, per notificare quando lo stato cambia (log). Per verificare se lo stato è cambiato, chiama eth_getFilterChanges.

Una nota sulla specifica dei filtri per topic: I topic dipendono dall'ordine. Una transazione con un log con topic [A, B] corrisponderà ai seguenti filtri per topic:

  • [] "qualsiasi cosa"
  • [A] "A in prima posizione (e qualsiasi cosa dopo)"
  • [null, B] "qualsiasi cosa in prima posizione E B in seconda posizione (e qualsiasi cosa dopo)"
  • [A, B] "A in prima posizione E B in seconda posizione (e qualsiasi cosa dopo)"
  • [[A, B], [A, B]] "(A O B) in prima posizione E (A O B) in seconda posizione (e qualsiasi cosa dopo)"
  • Parametri
  1. Object - Le opzioni del filtro:
  • fromBlock: QUANTITY|TAG - (opzionale, predefinito: "latest") Numero di blocco intero, oppure "latest" per l'ultimo blocco proposto, "safe" per l'ultimo blocco sicuro, "finalized" per l'ultimo blocco finalizzato, o "pending", "earliest" per le transazioni non ancora in un blocco.
  • toBlock: QUANTITY|TAG - (opzionale, predefinito: "latest") Numero di blocco intero, oppure "latest" per l'ultimo blocco proposto, "safe" per l'ultimo blocco sicuro, "finalized" per l'ultimo blocco finalizzato, o "pending", "earliest" per le transazioni non ancora in un blocco.
  • address: DATA|Array, 20 Byte - (opzionale) Indirizzo del contratto o un elenco di indirizzi da cui dovrebbero avere origine i log.
  • topics: Array of DATA, - (opzionale) Array di 32 Byte di topic DATA. I topic dipendono dall'ordine. Ogni topic può anche essere un array di DATI con opzioni "or".

Restituisce QUANTITY - Un id del filtro.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0x1" // 1
}

eth_newBlockFilter

Crea un filtro nel nodo, per notificare quando arriva un nuovo blocco. Per verificare se lo stato è cambiato, chiama eth_getFilterChanges.

Parametri Nessuno

Restituisce QUANTITY - Un ID del filtro.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}'
// Risultato
{
  "id":1,
  "jsonrpc":  "2.0",
  "result": "0x1" // 1
}

eth_newPendingTransactionFilter

Crea un filtro nel nodo, per notificare quando arrivano nuove transazioni in sospeso. Per verificare se lo stato è cambiato, chiama eth_getFilterChanges.

Parametri Nessuno

Restituisce QUANTITY - Un ID del filtro.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}'
// Risultato
{
  "id":1,
  "jsonrpc":  "2.0",
  "result": "0x1" // 1
}

eth_uninstallFilter

Disinstalla un filtro con l'id specificato. Dovrebbe sempre essere chiamato quando il monitoraggio non è più necessario. Inoltre, i filtri scadono quando non vengono richiesti con eth_getFilterChanges per un certo periodo di tempo.

Parametri

  1. QUANTITY - L'id del filtro.
params: [
  "0xb", // 11
]

Restituisce Boolean - true se il filtro è stato disinstallato con successo, altrimenti false.

Esempio

// Richiesta
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}'
// Risultato
{
  "id":1,
  "jsonrpc": "2.0",
  "result": true
}

eth_getFilterChanges

Metodo di polling per un filtro, che restituisce un array di log verificatisi dall'ultimo polling.

Parametri

  1. QUANTITY - l'id del filtro.
params: [
  "0x16", // 22
]

Restituisce Array - Array di oggetti log, o un array vuoto se nulla è cambiato dall'ultimo polling.

  • Per i filtri creati con eth_newBlockFilter vengono restituiti gli hash dei blocchi (DATA, 32 Byte), ad es., ["0x3454645634534..."].

  • Per i filtri creati con eth_newPendingTransactionFilter vengono restituiti gli hash delle transazioni (DATA, 32 Byte), ad es., ["0x6345343454645..."].

  • Per i filtri creati con eth_newFilter i log sono oggetti con i seguenti parametri:

    • removed: TAG - true quando il log è stato rimosso, a causa di una riorganizzazione della catena. false se è un log valido.
    • logIndex: QUANTITY - intero della posizione dell'indice del log nel blocco. null quando è un log in sospeso.
    • transactionIndex: QUANTITY - intero della posizione dell'indice della transazione da cui è stato creato il log. null quando è un log in sospeso.
    • transactionHash: DATA, 32 Byte - hash della transazione da cui è stato creato questo log. null quando è un log in sospeso.
    • blockHash: DATA, 32 Byte - hash del blocco in cui si trovava questo log. null quando è in sospeso. null quando è un log in sospeso.
    • blockNumber: QUANTITY - il numero del blocco in cui si trovava questo log. null quando è in sospeso. null quando è un log in sospeso.
    • address: DATA, 20 Byte - indirizzo da cui ha avuto origine questo log.
    • data: DATA - dati del log non indicizzati a lunghezza variabile. (In Solidity: zero o più argomenti del log non indicizzati da 32 Byte.)
    • topics: Array of DATA - Array da 0 a 4 DATA da 32 Byte di argomenti del log indicizzati. (In Solidity: Il primo topic è l'hash della firma dell'evento (ad es., Deposit(address,bytes32,uint256)), a meno che l'evento non sia stato dichiarato con lo specificatore anonymous.)
  • Esempio

eth_getFilterLogs

Restituisce un array di tutti i log che corrispondono al filtro con l'id specificato.

Parametri

  1. QUANTITY - L'id del filtro.
params: [
  "0x16", // 22
]

Restituisce Vedi eth_getFilterChanges

Esempio

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

Per il risultato vedi eth_getFilterChanges

eth_getLogs

Restituisce un array di tutti i log che corrispondono a un dato oggetto filtro.

Parametri

  1. Object - Le opzioni del filtro:
  • fromBlock: QUANTITY|TAG - (opzionale, predefinito: "latest") Numero intero del blocco, o "latest" per l'ultimo blocco proposto, "safe" per l'ultimo blocco sicuro, "finalized" per l'ultimo blocco finalizzato, o "pending", "earliest" per le transazioni non ancora in un blocco.
  • toBlock: QUANTITY|TAG - (opzionale, predefinito: "latest") Numero intero del blocco, o "latest" per l'ultimo blocco proposto, "safe" per l'ultimo blocco sicuro, "finalized" per l'ultimo blocco finalizzato, o "pending", "earliest" per le transazioni non ancora in un blocco.
  • address: DATA|Array, 20 Byte - (opzionale) Indirizzo del contratto o un elenco di indirizzi da cui dovrebbero provenire i log.
  • topics: Array of DATA, - (opzionale) Array di topic DATA di 32 Byte. I topic dipendono dall'ordine. Ogni topic può anche essere un array di DATA con opzioni "or".
  • blockHash: DATA, 32 Byte - (opzionale, futuro) Con l'aggiunta dell'EIP-234, blockHash sarà una nuova opzione di filtro che restringe i log restituiti al singolo blocco con l'hash di 32 byte blockHash. L'uso di blockHash è equivalente a fromBlock = toBlock = il numero del blocco con hash blockHash. Se blockHash è presente nei criteri di filtro, allora non sono consentiti né fromBlocktoBlock.
params: [
  {
    topics: [
      "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
    ],
  },
]

Restituisce Vedi eth_getFilterChanges

Esempio

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

Per il risultato vedi eth_getFilterChanges

Esempio di utilizzo

Distribuire un contratto usando JSON_RPC

Questa sezione include una dimostrazione di come distribuire un contratto usando solo l'interfaccia RPC. Ci sono percorsi alternativi per distribuire contratti in cui questa complessità viene astratta, ad esempio, usando librerie costruite sopra l'interfaccia RPC come Web3.js (opens in a new tab) e Web3.py (opens in a new tab). Queste astrazioni sono generalmente più facili da comprendere e meno soggette a errori, ma è comunque utile capire cosa succede dietro le quinte.

Il seguente è un semplice smart contract chiamato Multiply7 che verrà distribuito usando l'interfaccia JSON-RPC su un nodo Ethereum. Questo tutorial presuppone che il lettore stia già eseguendo un nodo Geth. Maggiori informazioni su nodi e client sono disponibili qui. Fai riferimento alla documentazione dei singoli client per vedere come avviare l'HTTP JSON-RPC per i client diversi da Geth. La maggior parte dei client per impostazione predefinita serve su localhost:8545.

contract Multiply7 {
    event Print(uint);
    function multiply(uint input) returns (uint) {
        Print(input * 7);
        return input * 7;
    }
}

La prima cosa da fare è assicurarsi che l'interfaccia HTTP RPC sia abilitata. Questo significa che forniamo a Geth il flag --http all'avvio. In questo esempio usiamo il nodo Geth su una catena di sviluppo privata. Usando questo approccio non abbiamo bisogno di ether sulla rete reale.

geth --http --dev console 2>>geth.log

Questo avvierà l'interfaccia HTTP RPC su http://localhost:8545.

Possiamo verificare che l'interfaccia sia in esecuzione recuperando l'indirizzo Coinbase (ottenendo il primo indirizzo dall'array degli account) e il saldo usando curl (opens in a new tab). Nota che i dati in questi esempi differiranno sul tuo nodo locale. Se vuoi provare questi comandi, sostituisci i parametri di richiesta nella seconda richiesta curl con il risultato restituito dalla prima.

curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545
{"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]}

curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545
{"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"}

Poiché i numeri sono codificati in esadecimale, il saldo viene restituito in Wei come stringa esadecimale. Se vogliamo avere il saldo in ether come numero, possiamo usare Web3 dalla console di Geth.

web3.fromWei("0x1639e49bba16280000", "ether")
// "410"

Ora che c'è un po' di ether sulla nostra catena di sviluppo privata, possiamo distribuire il contratto. Il primo passo è compilare il contratto Multiply7 in bytecode che può essere inviato all'EVM. Per installare solc, il compilatore Solidity, segui la documentazione di Solidity (opens in a new tab). (Potresti voler usare una versione precedente di solc per farla corrispondere alla versione del compilatore usata per il nostro esempio (opens in a new tab).)

Il passo successivo è compilare il contratto Multiply7 in bytecode che può essere inviato all'EVM.

echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin

======= <stdin>:Multiply7 =======
Binary:
6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029

Ora che abbiamo il codice compilato, dobbiamo determinare quanto gas costa distribuirlo. L'interfaccia RPC ha un metodo eth_estimateGas che ci darà una stima.

curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545
{"jsonrpc":"2.0","id":5,"result":"0x1c31e"}

E infine distribuire il contratto.

curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "gas": "0x1c31e", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 6}' -H "Content-Type: application/json" localhost:8545
{"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"}

La transazione viene accettata dal nodo e viene restituito un hash della transazione. Questo hash può essere usato per tracciare la transazione. Il passo successivo è determinare l'indirizzo in cui è distribuito il nostro contratto. Ogni transazione eseguita creerà una ricevuta. Questa ricevuta contiene varie informazioni sulla transazione, come in quale blocco è stata inclusa la transazione e quanto gas è stato usato dall'EVM. Se una transazione crea un contratto, conterrà anche l'indirizzo del contratto. Possiamo recuperare la ricevuta con il metodo RPC eth_getTransactionReceipt.

curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545
{"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}}

Il nostro contratto è stato creato su 0x4d03d617d700cf81935d7f797f4e2ae719648262. Un risultato nullo invece di una ricevuta significa che la transazione non è ancora stata inclusa in un blocco. Attendi un momento, controlla se il tuo client di consenso è in esecuzione e riprova.

Interagire con gli smart contract

In questo esempio invieremo una transazione usando eth_sendTransaction al metodo multiply del contratto.

eth_sendTransaction richiede diversi argomenti, in particolare from, to e data. From è l'indirizzo pubblico del nostro account e to è l'indirizzo del contratto. L'argomento data contiene un payload che definisce quale metodo deve essere chiamato e con quali argomenti. È qui che entra in gioco l'ABI (Application Binary Interface) (opens in a new tab). L'ABI è un file JSON che definisce come definire e codificare i dati per l'EVM.

I byte del payload definiscono quale metodo nel contratto viene chiamato. Questi sono i primi 4 byte dell'hash Keccak sul nome della funzione e sui tipi dei suoi argomenti, codificati in esadecimale. La funzione multiply accetta un uint che è un alias per uint256. Questo ci lascia con:

web3.sha3("multiply(uint256)").substring(0, 10)
// "0xc6888fa1"

Il passo successivo è codificare gli argomenti. C'è solo un uint256, diciamo, il valore 6. L'ABI ha una sezione che specifica come codificare i tipi uint256.

int<M>: enc(X) è la codifica in complemento a due big-endian di X, riempita sul lato di ordine superiore (sinistra) con 0xff per X negativo e con zero byte per X positivo in modo tale che la lunghezza sia un multiplo di 32 byte.

Questo si codifica in 0000000000000000000000000000000000000000000000000000000000000006.

Combinando il selettore della funzione e l'argomento codificato, i nostri dati saranno 0xc6888fa10000000000000000000000000000000000000000000000000000000000000006.

Questo può ora essere inviato al nodo:

curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' -H "Content-Type: application/json" localhost:8545
{"id":8,"jsonrpc":"2.0","result":"0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74"}

Poiché è stata inviata una transazione, è stato restituito un hash della transazione. Recuperando la ricevuta si ottiene:

La ricevuta contiene un log. Questo log è stato generato dall'EVM durante l'esecuzione della transazione e incluso nella ricevuta. La funzione multiply mostra che l'evento Print è stato sollevato con l'input moltiplicato per 7. Poiché l'argomento per l'evento Print era un uint256, possiamo decodificarlo secondo le regole dell'ABI, il che ci lascerà con il decimale atteso 42. Oltre ai dati, vale la pena notare che i topic possono essere usati per determinare quale evento ha creato il log:

web3.sha3("Print(uint256)")
// "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"

Questa era solo una breve introduzione ad alcune delle attività più comuni, che dimostra l'uso diretto della JSON-RPC.