API di JSON-RPC
Ultima modifica: @Herbie_23(opens in a new tab), 3 ottobre 2024
Affinché un'applicazione software interagisca con la blockchain di Ethereum, leggendo i dati della blockchain o inviando transazioni alla rete, deve connettersi a un nodo di Ethereum.
Per questo scopo, ogni client di Ethereum implementa una specifica JSON-RPC(opens in a new tab), quindi esiste un insieme uniforme di metodi cui le applicazioni possono affidarsi, indipendentemente dagli specifici nodi o implementazioni del client.
JSON-RPC(opens in a new tab) è un protocollo di chiamata a procedura remota (RPC) leggero e privo di stato. Definisce diverse strutture di dati e le regole per la loro elaborazione. È indipendente dal trasporto, poiché i concetti sono utilizzabili entro lo stesso processo, su prese, via HTTP o in svariati ambienti di passaggio dei messaggi. Usa JSON (RFC 4627) come formato dei dati.
Implementazioni del client
I client di Ethereum possono usare linguaggi di programmazione diversi per l'implementazione della specifica di JSON-RPC. Visualizza la documentazione dei singoli client per ulteriori dettagli sui linguaggi di programmazione specifici. Consigliamo di consultare la documentazione di ogni client per le informazioni più aggiornate sul supporto dell'API.
Librerie utili
Anche se è possibile scegliere di interagire direttamente con i client di Ethereum tramite l'API di JSON-RPC, spesso esistono opzioni più semplici per gli sviluppatori di dApp. Esistono molte librerie di JavaScript e dell'API del backend che forniscono wrapper sull'API di JSON-RPC. Con queste librerie, gli sviluppatori possono scrivere metodi intuitivi di una riga nel linguaggio di programmazione di loro scelta per inizializzare le richieste di JSON-RPC (sottostanti) che interagiscono con Ethereum.
API del client di consenso
Questa pagina tratta principalmente dell'API di JSON-RPC usata dai client di esecuzione di Ethereum. Tuttavia, anche i client del consenso hanno un'API RPC che consente agli utenti di interrogare le informazioni sul nodo, richiedere blocchi della Beacon, lo stato della Beacon e altre informazioni correlate al consenso, direttamente da un nodo. Questa API è documentata sulla pagina web dell'API Beacon(opens in a new tab).
Inoltre, un'API interna viene usata per la comunicazione tra client in un nodo, ovvero consente al client di consenso e al client di esecuzione di scambiarsi dati. Questa è detta "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 ispettore per provare tutti i metodi disponibili.
Convenzioni
Codifica del valore esadecimale
Su JSON vengono passati due tipi di dati chiave: insiemi di byte non formattati e quantità. Entrambi vengono passati con una codifica esadecimale, ma con requisiti di formattazione differenti.
Quantità
Per la codifica delle quantità (interi, numeri): codifica come esadecimali, prefisso "0x", la rappresentazione più compatta (lieve eccezione: zero dovrebbe essere rappresentato come "0x0").
Ecco alcuni esempi:
- 0x41 (65 in decimale)
- 0x400 (1024 in decimale)
- ERRATO: 0x (dovrebbe sempre avere almeno una cifra: zero è "0x0")
- ERRATO: 0x0400 (nessuno zero iniziale consentito)
- ERRATO: ff (deve avere il prefisso 0x)
Dati non formattati
Codificando i dati non formattati (insiemi di dati, indirizzi dei conti, hash, insiemi di bytecode): codifica come esadecimali, prefisso "0x", due cifre esadecimali per byte.
Ecco alcuni esempi:
- 0x41 (dimensione 1, "A")
- 0x004200 (dimensione 3, "0B0")
- 0x (dimensione 0, "")
- ERRATO: 0xf0f0f (dev'essere un numero di cifre pari)
- ERRATO: 004200 (deve avere il prefisso 0x)
Il parametro del blocco predefinito
I seguenti metodi hanno un parametro del blocco predefinito aggiuntivo:
Quando sono effettuate richieste che agiscono sullo stato di Ethereum, il parametro dell'ultimo blocco predefinito determina l'altezza del blocco.
Le seguenti opzioni sono possibili per il parametro defaultBlock:
HEX String
- un numero intero del bloccoString "earliest"
per il primo blocco o quello di genesiString "latest"
- per l'ultimo blocco propostoString "safe"
- per l'ultimo blocco di testa sicuroString "finalized"
- per l'ultimo blocco finalizzatoString "pending"
- per lo stato/le transazioni in sospeso
Esempi
Su questa pagina forniamo esempi su come usare gli endpoint individuali dell'API JSON_RPC usando lo strumento della riga di comando, curl(opens in a new tab). Questi esempi di endpoint individuali si trovano di seguito nella sezione esempi di Curl. In seguito nella pagina, forniamo anche un esempio completo per la compilazione e la distribuzione di un contratto intelligente usando un nodo di Geth, l'API JSON_RPC e curl.
Esempi di Curl
Di seguito sono riportati esempi dell'uso dell'API di JSON_RPC effettuando richieste di curl(opens in a new tab) a un nodo di Ethereum. Ogni esempio include una descrizione dell'endpoint specifico, i suoi parametri, il tipo di restituzione e un esempio definito di come dovrebbe essere utilizzato.
Le richieste di curl potrebbero restituire un messaggio d'errore correlato al tipo di contenuto. Ciò avviene perché l'opzione --data
imposta il tipo di contenuto su application/x-www-form-urlencoded
. Se il tuo nodo se ne lamenta, imposta manualmente l'intestazione posizionando -H "Content-Type: application/json"
all'inizio della chiamata. Gli esempi, inoltre, non includono la combinazione di URL/IP e porta, che deve essere l'ultimo argomento fornito al curl (ad es. 127.0.0.1:8545
). Una richiesta di curl completa, comprensiva di questi dati aggiuntivi, assume la seguente forma:
1curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545
Gossip, Stato, Storico
Alcuni metodi base del protocollo JSON-RPC richiedono dati dalla rete di Ethereum e rientrano in tre importanti categorie:Gossip, Stato e Storico. Usa i collegamenti in questa sezione per passare da un metodo all'altro oppure usa la tabella di contenuti per esplorare l'intera lista di metodi.
Metodi di Gossip
Questi metodi tracciano la testa della catena. Ecco come le transazioni si fanno strada all'interno della rete ed entrano nei blocchi e come i Client fanno ricerche sui nuovi blocchi.
Metodi di Stato
Metodi che indicano lo stato corrente di tutti i dati immagazzinati. Lo "stato" è come una grande porzione di RAM condivisa, che include i saldi dei conti, i dati dei contratti e le stime del gas.
Metodi dello Storico
Recupera lo storico dei record di ogni blocco fino alla genesi. Può essere paragonato a un grande file Append-Only contenente tutte le intestazioni del blocco, i corpi del blocco, i blocchi ommer (zio) e le ricevute delle transazioni.
- eth_getBlockTransactionCountByHash
- eth_getBlockTransactionCountByNumber
- eth_getUncleCountByBlockHash
- eth_getUncleCountByBlockNumber
- eth_getBlockByHash
- eth_getBlockByNumber
- eth_getTransactionByHash
- eth_getTransactionByBlockHashAndIndex
- eth_getTransactionByBlockNumberAndIndex
- eth_getTransactionReceipt
- eth_getUncleByBlockHashAndIndex
- eth_getUncleByBlockNumberAndIndex
Playground dell'API di JSON-RPC
Puoi utilizzare lo strumento playground(opens in a new tab) per scoprire e provare i metodi dell'API. Inoltre, ti mostra le reti e i metodi supportati dai vari fornitori di nodi.
I metodi dell'API JSON-RPC
web3_clientVersion
Restituisce la versione del client corrente.
Parametri
Nessuno
Restituisce
String
- La versione del client corrente
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'3// Risultato4{5 "id":67,6 "jsonrpc":"2.0",7 "result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1"8}Copia
web3_sha3
Restituisce Keccak-256 (non lo SHA3-256 standardizzato) dei dati forniti.
Parametri
DATA
- I dati da convertire in un hash SHA3
1params: ["0x68656c6c6f20776f726c64"]Copia
Restituisce
DATA
- Il risultato di SHA3 della stringa data.
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}'3// Result4{5 "id":64,6 "jsonrpc": "2.0",7 "result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"8}Copia
net_version
Restituisce l'id di rete corrente.
Parametri
Nessuno
Restituisce
String
- L'id di rete corrente.
L'elenco completo degli ID di rete correnti è disponibile su chainlist.org(opens in a new tab). Alcuni ID comuni sono:
1
: Rete Principale di Ethereum5
: rete di prova Goerli11155111
: rete di prova Sepolia
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'3// Result4{5 "id":67,6 "jsonrpc": "2.0",7 "result": "3"8}Copia
net_listening
Restituisce true
se il client sta ascoltando attivamente le connessioni di rete.
Parametri
Nessuno
Restituisce
Boolean
- true
quando è in ascolto, altrimenti false
.
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}'3// Result4{5 "id":67,6 "jsonrpc":"2.0",7 "result":true8}Copia
net_peerCount
Restituisce il numero di pari attualmente connessi al client.
Parametri
Nessuno
Restituisce
QUANTITY
- intero del numero di pari connessi.
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'3// Result4{5 "id":74,6 "jsonrpc": "2.0",7 "result": "0x2" // 28}Copia
eth_protocolVersion
Restituisce la versione corrente del protocollo di Ethereum. Si noti che questo metodo non è disponibile su Geth(opens in a new tab).
Parametri
Nessuno
Restituisce
String
- La versione del protocollo di Ethereum corrente
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}'3// Result4{5 "id":67,6 "jsonrpc": "2.0",7 "result": "54"8}Copia
eth_syncing
Restituisce un oggetto con i dati sullo stato di sincronizzazione o false
.
Parametri
Nessuno
Restituisce
I dati restituiti precisi variano a seconda delle implementazioni del client. Tutti i client restituiscono False
quando il nodo non si sta sincronizzando, e tutti i client restituiscono i seguenti campi.
Object|Boolean
, un oggetto con i dati dello stato di sincronizzazione o FALSE
, quando non è in sincronizzazione:
startingBlock
:QUANTITY
- Il blocco in cui è iniziata l'importazione (si ripristina soltanto dopo che la sincronizzazione ha raggiunto la sua testa)currentBlock
:QUANTITY
- Il blocco corrente, uguale a eth_blockNumberhighestBlock
:QUANTITY
- Il blocco più alto stimato
Tuttavia, i singoli client potrebbero anche fornire ulteriori dati. Ad esempio, Geth, restituisce quanto segue:
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": {5 "currentBlock": "0x3cf522",6 "healedBytecodeBytes": "0x0",7 "healedBytecodes": "0x0",8 "healedTrienodes": "0x0",9 "healingBytecode": "0x0",10 "healingTrienodes": "0x0",11 "highestBlock": "0x3e0e41",12 "startingBlock": "0x3cbed5",13 "syncedAccountBytes": "0x0",14 "syncedAccounts": "0x0",15 "syncedBytecodeBytes": "0x0",16 "syncedBytecodes": "0x0",17 "syncedStorage": "0x0",18 "syncedStorageBytes": "0x0"19 }20}Mostra tuttoCopia
Mentre Besu restituisce:
1{2 "jsonrpc": "2.0",3 "id": 51,4 "result": {5 "startingBlock": "0x0",6 "currentBlock": "0x1518",7 "highestBlock": "0x9567a3",8 "pulledStates": "0x203ca",9 "knownStates": "0x200636"10 }11}Mostra tuttoCopia
Si rimanda alla documentazione del client specifico per ulteriori dettagli.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": {8 startingBlock: '0x384',9 currentBlock: '0x386',10 highestBlock: '0x454'11 }12}13// O quando non sta sincronizzando14{15 "id":1,16 "jsonrpc": "2.0",17 "result": false18}Mostra tuttoCopia
eth_coinbase
Restituisce l'indirizzo di coinbase del client.
Parametri
Nessuno
Restituisce
DATA
, 20 byte - l'indirizzo di coinbase corrente.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}'3// Risultato4{5 "id":64,6 "jsonrpc": "2.0",7 "result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1"8}Copia
eth_chainId
Restituisce l'ID della catena utilizzato per firmare le transazioni protette da riproduzione.
Parametri
Nessuno
Restituisce
chainId
, valore esadecimale come stringa rappresentante l'intero dell'ID della catena corrente.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}'3// Risultato4{5 "id":67,6 "jsonrpc": "2.0",7 "result": "0x1"8}Copia
eth_mining
Restituisce true
se il client sta minando attivamente nuovi blocchi. Può restituire true
soltanto per le reti di proof-of-work e potrebbe non essere disponibile in alcuni client da La Fusione.
Parametri
Nessuno
Restituisce
Boolean
- restituisce true
se il client sta minando, altrimenti false
.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}'3//4{5 "id":71,6 "jsonrpc": "2.0",7 "result": true8}Copia
eth_hashrate
Restituisce il numero di hash al secondo con cui il nodo sta minando. Può restituire true
soltanto per le reti di proof-of-work e potrebbe non essere disponibile in alcuni client da La Fusione.
Parametri
Nessuno
Restituisce
QUANTITY
- numero di hash al secondo.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}'3// Risultato4{5 "id":71,6 "jsonrpc": "2.0",7 "result": "0x38a"8}Copia
eth_gasPrice
Restituisce una stima del prezzo corrente per gas, in wei. Ad esempio, il client di Besu esamina gli ultimi 100 blocchi e restituisce il prezzo unitario medio del gas di default.
Parametri
Nessuno
Restituisce
QUANTITY
- intero del prezzo corrente del gas in wei.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}'3// Risultato4{5 "id":73,6 "jsonrpc": "2.0",7 "result": "0x1dfd14000" // 8049999872 Wei8}Copia
eth_accounts
Restituisce un elenco di indirizzi posseduti dal client.
Parametri
Nessuno
Restituisce
Array of DATA
, 20 Byte - indirizzi posseduti dal client.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]8}Copia
eth_blockNumber
Restituisce il numero del blocco più recente.
Parametri
Nessuno
Restituisce
QUANTITY
- intero del numero di blocco corrente su cui è attivo il client.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'3// Risultato4{5 "id":83,6 "jsonrpc": "2.0",7 "result": "0x4b7" // 12078}Copia
eth_getBalance
Restituisce il saldo del conto del dato indirizzo.
Parametri
DATA
, 20 byte - indirizzo per controllare il saldo.QUANTITY|TAG
- intero del numero di blocco, o la stringa"latest"
,"earliest"
,"pending"
,"safe"
o"finalized"
, vedi il parametro del blocco predefinito
1params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]Copia
Restituisce
QUANTITY
- intero del saldo corrente in wei.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x0234c8a3397aab58" // 1589724902343750008}Copia
eth_getStorageAt
Restituisce il valore da una posizione di archiviazione a un dato indirizzo.
Parametri
DATA
, 20 byte - Indirizzo di archiviazione.QUANTITY
- intero della posizione di archiviazione.QUANTITY|TAG
- intero del numero di blocco, o la stringa"latest"
,"earliest"
,"pending"
,"safe"
,"finalized"
, vedi il parametro del blocco predefinito
Restituisce
DATA
- il valore in questa posizione di archiviazione.
Esempio Il calcolo della posizione corretta dipende dall'archiviazione da recuperare. Considera il seguente contratto distribuito su 0x295a70b2de5e3953354a6a8344e616ed314d7251
dall'indirizzo 0x391694e7e0b0cce554cb130d723a9d27458f9298
.
1contract Storage {2 uint pos0;3 mapping(address => uint) pos1;4 function Storage() {5 pos0 = 1234;6 pos1[msg.sender] = 5678;7 }8}
Recuperare il valore di pos0 è semplice:
1curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:85452{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"}Copia
Recuperare un elemento della mappa è più difficile. La posizione di un elemento nella mappa è calcolata con:
1keccak(LeftPad32(key, 0), LeftPad32(map position, 0))Copia
Ciò significa che per recuperare l'archiviazione in pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] dobbiamo calcolare la posizione con:
1keccak(2 decodeHex(3 "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" +4 "0000000000000000000000000000000000000000000000000000000000000001"5 )6)Copia
La console geth che viene fornita con la libreria web3 può essere utilizzata per effettuare il calcolo:
1> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"2undefined3> web3.sha3(key, {"encoding": "hex"})4"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"Copia
A questo punto, per recuperare l'archiviazione:
1curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:85452{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"}Copia
eth_getTransactionCount
Restituisce il numero di transazioni _inviate_da un indirizzo.
Parametri
DATA
, 20 byte - indirizzo.QUANTITY|TAG
- intero del numero di blocco, o la stringa"latest"
,"earliest"
,"pending"
,"safe"
o"finalized"
, vedi il parametro del blocco predefinito
1params: [2 "0x407d73d8a49eeb85d32cf465507dd71d507100c1",3 "latest", // stato all'ultimo blocco4]Copia
Restituisce
QUANTITY
- intero del numero di transazioni inviate da questo indirizzo.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}Copia
eth_getBlockTransactionCountByHash
Restituisce il numero di transazioni in un blocco da un blocco corrispondente al dato hash del blocco.
Parametri
DATA
, 32 byte - hash di un blocco
1params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]Copia
Restituisce
QUANTITY
- intero del numero di transazioni in questo blocco.
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}'3// Result4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x8b" // 1398}Copia
eth_getBlockTransactionCountByNumber
Restituisce il numero di transazioni in un blocco corrispondente al numero di blocco specificato.
Parametri
QUANTITY|TAG
- intero del numero di un blocco, o la stringa"earliest"
,"latest"
,"pending"
,"safe"
o"finalized"
, come nel parametro del blocco predefinito.
1params: [2 "0x13738ca", // 203962343]Copia
Restituisce
QUANTITY
- intero del numero di transazioni in questo blocco.
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}'3// Result4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x8b" // 1398}Copia
eth_getUncleCountByBlockHash
Restituisce il numero di ommer in un blocco da un blocco che corrisponde all'hash del blocco specificato.
Parametri
DATA
, 32 Bytes - Hash di un blocco
1params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]Copia
Restituisce
QUANTITY
- intero del numero di ommer in questo blocco.
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}'3// Result4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}Copia
eth_getUncleCountByBlockNumber
Restituisce il numero di ommer in un blocco da un blocco che corrisponde all'hash del blocco specificato.
Parametri
QUANTITY|TAG
- intero del numero di un blocco, o la stringa"latest"
,"earliest"
,"pending"
,"safe"
o"finalized"
, vedi il parametro del blocco predefinito
1params: [2 "0xe8", // 2323]Copia
Restituisce
QUANTITY
- intero del numero di ommer in questo blocco.
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}'3// Result4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x0" // 08}Copia
eth_getCode
Restituisce il codice ad un dato indirizzo.
Parametri
DATA
, 20 byte - indirizzoQUANTITY|TAG
- intero del numero di blocco, o la stringa"latest"
,"earliest"
,"pending"
,"safe"
o"finalized"
, vedi il parametro del blocco predefinito
1params: [2 "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",3 "0x5daf3b", // 61397074]Copia
Restituisce
DATA
- il codice dal dato indirizzo.
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}'3// Result4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"8}Copia
eth_sign
Il metodo della firma calcola una firma specifica di Ethereum con: sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))
.
Aggiungendo un prefisso al messaggio si rende la firma calcolata riconoscibile come firma specifica di Ethereum. Ciò impedisce l'uso improprio in cui una dapp malevola può firmare i dati arbitrari (es. la transazione) e usare la firma per impersonare la vittima.
Nota: l'indirizzo con cui firmare deve essere sbloccato.
Parametri
DATA
, 20 Bytes - indirizzoDATA
, N byte - messaggio da firmare
Restituisce
DATA
: Firma
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"8}Copia
eth_signTransaction
Firma una transazione che può essere inviata alla rete in un secondo momento utilizzando eth_sendRawTransaction.
Parametri
Object
- L'oggetto della transazione
type
:from
:DATA
, 20 byte - L'indirizzo da cui viene inviata la transazione.to
:DATA
, 20 byte - (facoltativo quando si crea un nuovo contratto) L'indirizzo a cui è indirizzata la transazione.gas
:QUANTITY
- (facoltativo, predefinito: 90000) Intero del carburante fornito per l'esecuzione della transazione. Restituirà il carburante inutilizzato.gasPrice
:QUANTITY
- (facoltativo, predefinito: To-Be-Determined) Intero del gasPrice usato per ogni unità di carburante pagata, in Wei.value
:QUANTITY
- (facoltativo) Intero del valore inviato con questa transazione, in Wei.data
:DATA
- Il codice compilato di un contratto OPPURE l'hash della firma del metodo richiamato e i parametri codificati.nonce
:QUANTITY
- (facoltativo) Intero di un nonce. Ciò permette di sovrascrivere le proprie transazioni in sospeso che utilizzano lo stesso nonce.
Restituisce
DATA
, L'oggetto della transazione codificata in RLP, firmato dal conto specificato.
Esempio
1// Richiesta2curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction","params": [{"data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675","from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155","gas": "0x76c0","gasPrice": "0x9184e72a000","to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567","value": "0x9184e72a"}]}'3// Risultato4{5 "id": 1,6 "jsonrpc": "2.0",7 "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"8}Copia
eth_sendTransaction
Crea la transazione di chiamata del nuovo messaggio o la creazione di un contratto, se il campo dei dati contiene del codice, e la firma utilizzando il conto specificato in from
.
Parametri
Oggetto
- L'oggetto della transazione
from
:DATA
, 20 byte - L'indirizzo da cui viene inviata la transazione.to
:DATA
, 20 byte - (facoltativo quando si crea un nuovo contratto) L'indirizzo a cui è indirizzata la transazione.gas
:QUANTITY
- (facoltativo, predefinito: 90000) Intero del carburante fornito per l'esecuzione della transazione. Restituirà il carburante inutilizzato.gasPrice
:QUANTITY
- (facoltativo, predefinito: To-Be-Determined) Intero del gasPrice usato per ogni unità di carburante pagata.value
:QUANTITY
- (facoltativo) Intero del valore inviato con questa transazione, in Wei.input
:DATA
- Il codice compilato di un contratto O l'hash della firma del metodo invocato e i parametri codificati.nonce
:QUANTITY
- (facoltativo) Intero di un nonce. Ciò permette di sovrascrivere le proprie transazioni in sospeso che utilizzano lo stesso nonce.
1params: [2 {3 from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155",4 to: "0xd46e8dd67c5d32be8058bb8eb970870f07244567",5 gas: "0x76c0", // 304006 gasPrice: "0x9184e72a000", // 100000000000007 value: "0x9184e72a", // 24414062508 input:9 "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",10 },11]Mostra tuttoCopia
Restituisce
DATA
, 32 Bytes - l'hash della transazione, o l'hash zero se la transazione non è ancora disponibile.
Usa eth_getTransactionReceipt quando hai creato un contratto per ottenere l'indirizzo del contratto dopo che la transazione è stata proposta in un blocco.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"8}Copia
eth_sendRawTransaction
Crea una nuova transazione di chiamata di messaggio o la stipula di un contratto, per le transazioni firmate.
Parametri
DATA
, L'oggetto transazione firmato.
1params: [2 "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",3]Copia
Restituisce
DATA
, 32 Bytes - l'hash della transazione, o l'hash zero se la transazione non è ancora disponibile.
Usa eth_getTransactionReceipt quando hai creato un contratto per ottenere l'indirizzo del contratto dopo che la transazione è stata proposta in un blocco.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"8}Copia
eth_call
Esegue immediatamente una nuova chiamata di messaggio senza creare una transazione nella blockchain. Spesso utilizzato per eseguire le funzioni dei contratti intelligenti di sola lettura, ad esempio balanceOf
per un contratto ERC-20.
Parametri
Object
- L'oggetto della chiamata della transazione
from
:DATA
, 20 byte - (facoltativo) L'indirizzo da cui viene inviata la transazione.to
:DATA
, 20 byte - L'indirizzo a cui è indirizzata la transazione.gas
:QUANTITY
- (facoltativo) Intero del carburante fornito per l'esecuzione della transazione. eth_call consuma zero carburante, ma questo parametro potrebbe essere necessario per alcune esecuzioni.gasPrice
:QUANTITY
- (facoltativo) Intero del gasPrice usato per ogni unità di carburante pagatavalue
:QUANTITY
- (facoltativo) Intero del valore inviato con questa transazioneinput
:DATA
- (facoltativo) Hash della firma del metodo e dei parametri codificati. Per i dettagli, consulta ABI del Contratto di Ethereum nella documentazione di Solidity(opens in a new tab).
QUANTITY|TAG
- intero del numero di blocco, o la stringa"latest"
,"earliest"
,"pending"
,"safe"
o"finalized"
, vedi il parametro del blocco predefinito
Restituisce
DATA
- Il valore di ritorno del contratto eseguito.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x"8}Copia
eth_estimateGas
Genera e restituisce una stima di quanto gas è necessario per consentire il completamento della transazione. La transazione non verrà aggiunta alla blockchain. Si noti che la stima potrebbe esser significativamente superiore all'importo di gas effettivamente usato dalla transazione, per vari motivi, incluse le meccaniche dell'EVM e le prestazioni del nodo.
Parametri
Vedi i parametri di eth_call, tranne che tutte le proprietà sono facoltative. Se non è specificato alcun limite di gas, geth usa il limite di gas del blocco dal blocco in sospeso come limite massimo. Di conseguenza, la stima restituita potrebbe non esser sufficiente per eseguire la chiamata/transazione quando l'importo di gas è superiore al limite di gas del blocco.
Restituisce
QUANTITY
- la quantità di gas utilizzato.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x5208" // 210008}Copia
eth_getBlockByHash
Restituisce informazioni su un blocco tramite hash.
Parametri
DATA
, 32 byte - Hash di un blocco.Boolean
- Setrue
restituisce gli oggetti di transazione completi, sefalso
solo gli hash delle transazioni.
1params: [2 "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",3 false,4]Copia
Restituisce
Object
- Un oggetto blocco, o null
quando non viene trovato alcun blocco:
number
:QUANTITY
- il numero di blocco.null
quando è in attesa del blocco.hash
:DATA
, 32 byte - hash del blocco.null
quando è in attesa del blocco.hash
:DATA
, 32 byte - hash del blocco genitore.nonce
:DATA
, 8 byte - hash del proof-of-work generato.null
quando è in attesa del blocco.sha3Uncles
:DATA
, 32 byte - SHA3 dei dati ommer del blocco.logsBloom
:DATA
, 256 byte - il filtro bloom per i registri del blocco.null
quando è in attesa del blocco.transactionsRoot
:DATA
, 32 byte - la radice dell'albero delle transazioni del blocco.stateRoot
:DATA
, 32 byte - la radice dell'albero di stato finale del blocco.receiptsRoot
:DATA
, 32 byte - la radice dell'albero delle ricevute del blocco.miner
:DATA
, 20 byte - l'indirizzo del beneficiario a cui sono state fornite le ricompense di mining.difficulty
:QUANTITY
- intero della difficoltà per questo blocco.totalDifficulty
:QUANTITY
- intero della difficoltà totale della catena fino a questo blocco.extraData
:DATA
- il campo "dati extra" di questo blocco.size
:QUANTITY
- intero in bytes della dimensione di questo blocco.gasLimit
:QUANTITY
- il carburante massimo consentito in questo blocco.gasUsed
:QUANTITY
- il carburante totale usato da tutte le transazioni in questo blocco.timestamp
:QUANTITY
- la marca temporale unix relativa a quando il blocco è stato collazionato.transactions
:Array
- Array di oggetti transazione, o hash di transazione da 32 byte a seconda dell'ultimo parametro specificato.uncles
:Array
- Array di hash ommer.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}'3// Risultato4{5{6"jsonrpc": "2.0",7"id": 1,8"result": {9 "difficulty": "0x4ea3f27bc",10 "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32",11 "gasLimit": "0x1388",12 "gasUsed": "0x0",13 "hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",14 "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",15 "miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171",16 "mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843",17 "nonce": "0x689056015818adbe",18 "number": "0x1b4",19 "parentHash": "0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54",20 "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",21 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",22 "size": "0x220",23 "stateRoot": "0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d",24 "timestamp": "0x55ba467c",25 "totalDifficulty": "0x78ed983323d",26 "transactions": [27 ],28 "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",29 "uncles": [30 ]31}32}Mostra tuttoCopia
eth_getBlockByNumber
Restituisce informazioni su un blocco per numero di blocco.
Parametri
QUANTITY|TAG
- intero del numero di un blocco, o la stringa"earliest"
,"latest"
,"pending"
,"safe"
o"finalized"
, come nel parametro del blocco predefinito.Boolean
- Setrue
restituisce gli oggetti di transazione completi, sefalso
solo gli hash delle transazioni.
1params: [2 "0x1b4", // 4363 true,4]Copia
Restituisce Vedi eth_getBlockByHash
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'Copia
Per il risultato vedi eth_getBlockByHash
eth_getTransactionByHash
Restituisce le informazioni su una transazione richiesta dall'hash della transazione.
Parametri
DATA
, 32 byte - hash di una transazione
1params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"]Copia
Restituisce
Object
- Un oggetto transazione, oppure null
quando non viene trovata alcuna transazione:
blockHash
:DATA
, 32 byte - hash del blocco in cui si trovava questa transazione.null
quando è in sospeso.blockNumber
:QUANTITY
- numero di blocco in cui si trovava questa transazione.null
quando è in sospeso.from
:DATA
, 20 byte - indirizzo del mittente.gas
:QUANTITY
- carburante fornito dal mittente.gasPrice
:QUANTITY
- prezzo del carburante 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 - l'indirizzo del destinatario.null
quando è una transazione di creazione del contratto.transactionIndex
:QUANTITY
- intero della posizione dell'indice delle transazioni nel blocco.null
quando è in sospeso.value
:QUANTITY
- valore trasferito in Wei.v
:QUANTITY
- ID di recupero ECDSAr
:QUANTITY
- firma r ECDSAs
:QUANTITY
- firma s ECDSA
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}'3// Risultato4{5 "jsonrpc":"2.0",6 "id":1,7 "result":{8 "blockHash":"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",9 "blockNumber":"0x5daf3b", // 613970710 "from":"0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",11 "gas":"0xc350", // 5000012 "gasPrice":"0x4a817c800", // 2000000000013 "hash":"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",14 "input":"0x68656c6c6f21",15 "nonce":"0x15", // 2116 "to":"0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",17 "transactionIndex":"0x41", // 6518 "value":"0xf3dbb76162000", // 429000000000000019 "v":"0x25", // 3720 "r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",21 "s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c"22 }23}Mostra tuttoCopia
eth_getTransactionByBlockHashAndIndex
Restituisce informazioni su una transazione per hash del blocco e posizione dell'indice della transazione.
Parametri
DATA
, 32 byte - hash di un blocco.QUANTITY
- intero della posizione dell'indice della transazione.
1params: [2 "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",3 "0x0", // 04]Copia
Restituisce Vedi eth_getTransactionByHash
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'Copia
Risultato vedi eth_getBlockByHash
eth_getTransactionByBlockNumberAndIndex
Restituisce informazioni su una transazione per hash del blocco e posizione dell'indice della transazione.
Parametri
QUANTITY|TAG
: il numero di un blocco, o la stringa"earliest"
,"latest"
,"pending"
,"safe"
o"finalized"
, come nel parametro del blocco predefinito.QUANTITY
- la posizione dell'indice della transazione.
1params: [2 "0x9c47cf", // 102419993 "0x24", // 364]Copia
Restituisce Vedi eth_getTransactionByHash
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}'Copia
Risultato vedi eth_getBlockByHash
eth_getTransactionReceipt
Restituisce la ricevuta di una transazione tramite l'hash di transazione.
Nota che la ricevuta non è disponibile per le transazioni in sospeso.
Parametri
DATA
, 32 Bytes - hash di una transazione
1params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"]Copia
Restituisce Object
- Un oggetto ricevuta della transazione, o null
quando non è stata trovata nessuna ricevuta:
transactionHash
:DATA
, 32 byte - hash della transazione.transactionIndex
:QUANTITY
- intero della posizione dell'indice delle transazioni nel blocco.blockHash
:DATA
, 32 byte - hash del blocco in cui si trovava questa transazione.blockNumber
:QUANTITY
- numero di blocco in cui si trovava questa transazione.from
:DATA
, 20 byte - indirizzo del mittente.to
:DATA
, 20 byte - l'indirizzo del destinatario. null quando è una transazione di creazione del contratto.cumulativeGasUsed
:QUANTITY
- La quantità totale di carburante usato nel blocco per l'esecuzione della transazione.effectiveGasPrice
:QUANTITY
- La somma della commissione di base e delle mance pagata per unità di carburante.gasUsed
:QUANTITY
- La quantità di carburante usato solo da questa specifica transazione.contractAddress
:DATA
, 20 byte - L'indirizzo del contratto creato, se la transazione consisteva nella creazione di un contratto, altrimentinull
.logs
:Array
- Array di oggetti di registro generati da questa transazione.logsBloom
:DATA
, 256 byte - Filtro Bloom per i client leggeri per recuperare rapidamente i registri correlati.type
:QUANTITY
: intero del tipo di transazione,0x0
per le transazioni ereditarie,0x1
per i tipi di elenco d'accesso,0x2
per le commissioni dinamiche.
Restituisce anche in alternativa:
root
:DATA
32 bytes dello stateRoot post-transazione (pre Byzantium)status
:QUANTITY
o1
(successo) o0
(insuccesso)
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}'3// Risultato4{5 "jsonrpc": "2.0",6 "id": 1,7 "result": {8 "blockHash":9 "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3",10 "blockNumber": "0xeff35f",11 "contractAddress": null, // string of the address if it was created12 "cumulativeGasUsed": "0xa12515",13 "effectiveGasPrice": "0x5a9c688d4",14 "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7",15 "gasUsed": "0xb4c8",16 "logs": [{17 // logs as returned by getFilterLogs, etc.18 }],19 "logsBloom": "0x00...0", // 256 byte bloom filter20 "status": "0x1",21 "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",22 "transactionHash":23 "0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5",24 "transactionIndex": "0x66",25 "type": "0x2"26 }27}Mostra tuttoCopia
eth_getUncleByBlockHashAndIndex
Restituisce informazioni su un ommer di un blocco in base all'hash e alla posizione dell'indice dell'ommer.
Parametri
DATA
, 32 byte - hash di un blocco.QUANTITY
- La posizione dell'indice dell'ommer.
1params: [2 "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",3 "0x0", // 04]Copia
Restituisce Vedi eth_getBlockByHash
Esempio
1// Request2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'Copia
Per il risultato vedi eth_getBlockByHash
Nota: Un ommer non contiene transazioni individuali.
eth_getUncleByBlockNumberAndIndex
Restituisce informazioni su un ommer di un blocco in base al numero e alla posizione dell'indice dell'ommer.
Parametri
QUANTITY|TAG
- il numero di un blocco, o la stringa"earliest"
,"latest"
,"pending"
,"safe"
,"finalized"
, come nel parametro predefinito del blocco.QUANTITY
- la posizione dell'indice dell'ommer.
1params: [2 "0x29c", // 6683 "0x0", // 04]Copia
Restituisce Vedi eth_getBlockByHash
Nota: Un ommer non contiene transazioni individuali.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}'Copia
Per il risultato vedi eth_getBlockByHash
eth_newFilter
Crea un oggetto filtro, basato sulle opzioni di filtro, per avvertire quando lo stato cambia (registri). Per verificare se lo stato è cambiato, chiama eth_getFilterChanges.
Una nota per specificare i filtri degli argomenti: Gli argomenti dipendono dall'ordine. Una transazione con un registro con argomenti [A, B] sarà abbinata ai seguenti filtri tematici:
[]
"qualsiasi"[A]
: "A in prima posizione (e tutto il resto segue)"[null, B]
: "tutto nella prima posizione e B nella seconda (e tutto il resto segue)"[A, B]
: "A in prima posizione e B in seconda (e tutto il resto segue)"[[A, B], [A, B]]
: "(A OR B) in prima posizione e (A OR B) in seconda posizione (e tutto il resto segue)"- Parametri
Object
- Le opzioni del filtro:
fromBlock
:QUANTITY|TAG
- (facoltativo, 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 presenti in un blocco.toBlock
:QUANTITY|TAG
- (facoltativo, 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 presenti in un blocco.address
:DATA|Array
, 20 byte - (facoltativo) L'indirizzo del contratto oppure un elenco di indirizzi da cui dovrebbero avere origine i registri.topics
:Array of DATA
, - (facoltativo) Array di argomentiDATA
a 32 byte. Gli argomenti dipendono dall'ordine. Ogni argomento può anche essere una matrice di DATA con opzioni "OR".
1params: [2 {3 fromBlock: "0x1",4 toBlock: "0x2",5 address: "0x8888f1f195afa192cfee860698584c030f4c9db1",6 topics: [7 "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",8 null,9 [10 "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",11 "0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc",12 ],13 ],14 },15]Mostra tuttoCopia
Restituisce QUANTITY
- Un ID filtro.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}Copia
eth_newBlockFilter
Crea un filtro nel nodo, per avvisare quando arriva un nuovo blocco. Per verificare se lo stato è cambiato, chiama eth_getFilterChanges.
Parametri Nessuno
Restituisce QUANTITY
- Un ID filtro.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}Copia
eth_newPendingTransactionFilter
Crea un filtro nel nodo, per avvisare quando arrivano nuove transazioni in sospeso. Per verificare se lo stato è cambiato, chiama eth_getFilterChanges.
Parametri Nessuno
Restituisce QUANTITY
- Un ID filtro.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": "0x1" // 18}Copia
eth_uninstallFilter
Disinstalla un filtro con un dato ID. Dovrebbe essere sempre chiamato quando l'orologio non è più necessario. Inoltre i filtri scadono quando non vengono richiesti con eth_getFilterChanges per un periodo di tempo.
Parametri
QUANTITY
- L'ID del filtro.
1params: [2 "0xb", // 113]Copia
Restituisce Boolean
- true
se il filtro è stato disinstallato con successo, altrimenti false
.
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}'3// Risultato4{5 "id":1,6 "jsonrpc": "2.0",7 "result": true8}Copia
eth_getFilterChanges
Metodo di sondaggio per un filtro, che restituisce un array di registri che si sono verificati dall'ultimo sondaggio.
Parametri
QUANTITY
- L'ID del filtro.
1params: [2 "0x16", // 223]Copia
Restituisce Array
- Array di oggetti registro, o un array vuoto se nulla è cambiato dall'ultimo sondaggio.
- Per i filtri creati con
eth_newBlockFilter
vengono restituiti hash di blocco (DATA
, 32 byte), ad esempio["0x3454645634534..."]
. - Per i filtri creati con
eth_newPendingTransactionFiltro
vengono restituiti hash di transazione (DATA
, 32 byte), ad esempio["0x6345343454645..."]
. - Per i filtri creati con
eth_newFiltro
i registri sono oggetti con i seguenti parametri:removed
:TAG
-true
quando il registro è stato rimosso, a causa di una riorganizzazione a catena.false
se è un registro valido.transactionIndex
:QUANTITY
- numero intero della posizione dell'indice del registro nel blocco.null
quando il registro è in sospeso.transactionIndex
:QUANTITY
- numero intero del registro della posizione dell'indice delle transazioni da cui è stato creato.null
quando il registro è in sospeso.transactionHash
:DATA
, 32 byte - hash delle transazioni da cui è stato creato il registro.null
quando il registro è in sospeso.blockHash
:DATA
, 32 byte - hash del blocco in cui si trovava questo registro.null
quando è in sospeso.null
quando il registro è in sospeso.blockNumber
:QUANTITY
il numero di blocco in cui si trovava questo registro.null
quando è in sospeso.null
quando il registro è in sospeso.address
:DATI
, 20 byte - indirizzo da cui è nato questo registro.data
:DATA
- contiene zero o più argomenti non indicizzati da 32 byte del registro.topics
:Array of DATA
- Array da 0 a 432 byte diDATA
di argomenti di registro indicizzati. (In solidity: il primo argomento è l'hash della firma dell'evento (ad es.Deposit(address,bytes32,uint256)
), tranne se hai dichiarato l'evento con lo specificatoreanonymous
- Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'3// Risultato4{5 "id":1,6 "jsonrpc":"2.0",7 "result": [{8 "logIndex": "0x1", // 19 "blockNumber":"0x1b4", // 43610 "blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",11 "transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",12 "transactionIndex": "0x0", // 013 "address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",14 "data":"0x0000000000000000000000000000000000000000000000000000000000000000",15 "topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"]16 },{17 ...18 }]19}Mostra tuttoCopia
eth_getFilterLogs
Restituisce un array di tutti i registri corrispondenti al filtro con un dato ID.
Parametri
QUANTITY
- L'ID del filtro.
1params: [2 "0x16", // 223]Copia
Restituisce Vedi eth_getBlockByHash
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}'Copia
Risultato vedi eth_getFilterChanges
eth_getLogs
Restituisce un array di tutti i registri che corrispondono a un dato oggetto filtro.
Parametri
Object
- Le opzioni del filtro:
fromBlock
:QUANTITY|TAG
- (facoltativo, 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 presenti in un blocco.toBlock
:QUANTITY|TAG
- (facoltativo, 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 presenti in un blocco.address
:DATA|Array
, 20 byte - (facoltativo) L'indirizzo del contratto oppure un elenco di indirizzi da cui dovrebbero avere origine i registri.topics
:Array of DATA
, - (facoltativo) Array di argomentiDATA
a 32 byte. Gli argomenti dipendono dall'ordine. Ogni argomento può anche essere una matrice di DATA con opzioni "OR".blockhash
:DATI
, 32 byte - (facoltativo , future) Con l'aggiunta di EIP-234,blockHash
sarà una nuova opzione di filtro che limita i registri restituiti al singolo blocco con l'hashblockHash
da 32 byte. L'utilizzo diblockHash
equivale afromBlock
=toBlock
= il numero di blocco con hashblockHash
. SeblockHash
è presente nei criteri di filtraggio, non sono permessi néfromBlock
nétoBlock
.
1params: [2 {3 topics: [4 "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",5 ],6 },7]Copia
Restituisce Vedi eth_getBlockByHash
Esempio
1// Richiesta2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}'Copia
Risultato vedi eth_getFilterChanges
Esempio di utilizzo
Distribuire un contratto utilizzando JSON_RPC
Questa sezione include una dimostrazione di come distribuire un contratto utilizzando solo l'interfaccia RPC. Esistono vie alternative per la distribuzione di contratti in cui questa complessità viene eliminata tramite astrazione, ad esempio utilizzando librerie costruite partendo dall'interfaccia RPC, come web3. s(opens in a new tab) e web3.py(opens in a new tab). Queste astrazioni sono generalmente più facili da capire e meno soggette a errori, ma è comunque utile capire cosa succede dietro le quinte.
Di seguito, trovi un semplice contratto intelligente chiamato Multiply7
, che sarà distribuito usando l'interfaccia JSON-RPC a un nodo di Ethereum. Questo tutorial presuppone che il lettore stia già eseguendo un nodo Geth. Maggiori informazioni sui nodi e sui client sono disponibili qui. Fare riferimento alla documentazione del singolo client per capire come avviare HTTP JSON-RPC per i client non-Geth. La maggior parte dei client serve di default su localhost:8545
.
1contract Multiply7 {2 event Print(uint);3 function multiply(uint input) returns (uint) {4 Print(input * 7);5 return input * 7;6 }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. Utilizzando 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 di Coinbase e il saldo utilizzando curl(opens in a new tab). Si noti che i dati in questi esempi saranno diversi sul nodo locale. Se vuoi provare questi comandi, sostituisci i parametri di richiesta nella seconda richiesta di curl con il risultato restituito dalla prima.
curl --data '{"jsonrpc":"2.0","method":"eth_coinbase", "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 soggetti a codifica esadecimale, il saldo viene restituito in wei sotto forma di stringa esadecimale. Se vogliamo ottenere il saldo in ether sotto forma di numero possiamo utilizzare web3 dalla console Geth.
1web3.fromWei("0x1639e49bba16280000", "ether")2// "410"
Ora che ci sono ether nella nostra catena di sviluppo privata, possiamo distribuire il contratto. Il primo passo è quello di compilare il contratto Multiply7 al codice di byte che può essere inviato all'EVM. Per installare solc, il compilatore Solidity, seguire la documentazione Solidity(opens in a new tab). (Potresti voler utilizzare una versione solc
più vecchia che corrisponda alla versione del compilatore utilizzata per il nostro esempio(opens in a new tab).)
Il passo successivo è quello di compilare il contratto Multiply7 al codice di byte 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 carburante occorre per 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 distribuiamo 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 è accettata dal nodo e viene restituito un hash di transazione. Questo hash può essere usato per tracciare la transazione. Il passo successivo è quello di determinare l'indirizzo dove il nostro contratto è distribuito. Ogni transazione eseguita creerà una ricevuta. Questa ricevuta contiene varie informazioni sulla transazione, ad esempio, in quale blocco è stata inclusa e quanto carburante è stato usato dall'EVM. Se una transazione crea un contratto, ne conterrà anche l'indirizzo. 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 è stata ancora inclusa in un blocco. Attendere un attimo e controllare se il proprio client di consenso è in esecuzione, quindi riprovare.
Interagire con i contratti intelligenti
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 conto, mentre 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 (interfaccia binaria dell'applicazione)(opens in a new tab). L'ABI è un file JSON che determina come definire e codificare i dati per l'EVM.
I byte del payload definiscono quale metodo viene chiamato nel contratto. Si tratta dei primi 4 byte dall'hash Keccak sul nome della funzione e sui suoi tipi di argomento, con codifica esadecimale. La funzione di moltiplicazione accetta un uint che è un alias per uint256. Ci ritroviamo quindi con:
1web3.sha3("multiply(uint256)").substring(0, 10)2// "0xc6888fa1"
Il passo successivo è codificare gli argomenti. Vi è solo un uint256, ad esempio il valore 6. L'ABI ha una sezione che specifica come codificare i tipi uint256.
int<M>: enc(X)
è la codifica big-endian in complemento a due di X, riempita sul lato di ordine superiore (sinistro) con 0xff per X negativo e con zero > byte per X positivo, in modo tale che la lunghezza sia un multiplo di 32 byte.
Si ottiene la codifica 0000000000000000000000000000000000000000000000000000000000000006
.
Combinando il selettore di funzione e l'argomento codificato, otterremo i dati 0xc6888fa100000000000000000000000000000000000000000000000000000000000000000000000000000006
.
A questo punto possiamo inviare 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"}
Dall'invio di una transazione, è stato restituito un hash di transazione. Recuperando la ricevuta si ottiene:
1{2 blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",3 blockNumber: 268,4 contractAddress: null,5 cumulativeGasUsed: 22631,6 gasUsed: 22631,7 logs: [{8 address: "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d",9 blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",10 blockNumber: 268,11 data: "0x000000000000000000000000000000000000000000000000000000000000002a",12 logIndex: 0,13 topics: ["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"],14 transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",15 transactionIndex: 016 }],17 transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",18 transactionIndex: 019}Mostra tutto
La ricevuta contiene un registro. Questo registro è stato generato da EVM sull'esecuzione della transazione e incluso nella ricevuta. La funzione multiply
mostra che l'evento Print
è stato lanciato con i tempi di input 7. Poiché l'argomento per l'evento Print
era un uint256, possiamo decodificarlo secondo le regole ABI, ottenendo così il decimale 42 previsto. Oltre ai dati, vale la pena notare che gli argomenti possono essere utilizzati per determinare quale evento ha creato il registro:
1web3.sha3("Print(uint256)")2// "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"
Questa è stata solo una breve introduzione su alcuni dei compiti più comuni, dimostrando l'uso diretto del JSON-RPC.