API JSON-RPC
Aby aplikacja mogła wchodzić w interakcję z blockchainem Ethereum – poprzez odczytywanie danych z blockchaina lub wysyłanie transakcji do sieci – musi połączyć się z węzłem Ethereum.
W tym celu każdy klient Ethereum implementuje specyfikację JSON-RPC (opens in a new tab), dzięki czemu istnieje jednolity zestaw metod, na których aplikacje mogą polegać niezależnie od konkretnego węzła lub implementacji klienta.
JSON-RPC (opens in a new tab) to bezstanowy, lekki protokół zdalnego wywołania procedur (RPC). Definiuje on kilka struktur danych oraz zasady ich przetwarzania. Jest on niezależny od warstwy transportowej, co oznacza, że jego koncepcje mogą być używane w ramach tego samego procesu, przez gniazda (sockets), przez HTTP lub w wielu różnych środowiskach przekazywania wiadomości. Jako format danych wykorzystuje JSON (RFC 4627).
Implementacje klientów
Klienty Ethereum mogą wykorzystywać różne języki programowania podczas implementacji specyfikacji JSON-RPC. Zobacz dokumentację poszczególnych klientów, aby uzyskać więcej szczegółów związanych z konkretnymi językami programowania. Zalecamy sprawdzanie dokumentacji każdego klienta w celu uzyskania najnowszych informacji o obsłudze API.
Biblioteki pomocnicze
Chociaż możesz zdecydować się na bezpośrednią interakcję z klientami Ethereum za pośrednictwem API JSON-RPC, często istnieją łatwiejsze opcje dla twórców dappów. Istnieje wiele bibliotek JavaScript i API backendowych, które stanowią nakładki na API JSON-RPC. Dzięki tym bibliotekom programiści mogą pisać intuicyjne, jednolinijkowe metody w wybranym przez siebie języku programowania, aby inicjować żądania JSON-RPC (wewnętrznie), które wchodzą w interakcję z Ethereum.
API klientów konsensusu
Ta strona dotyczy głównie API JSON-RPC używanego przez klienty warstwy wykonawczej Ethereum. Jednakże klienty konsensusu również posiadają API RPC, które pozwala użytkownikom na zapytania o informacje dotyczące węzła, żądanie bloków Beacon, stanu Beacon oraz innych informacji związanych z konsensusem bezpośrednio z węzła. To API jest udokumentowane na stronie internetowej Beacon API (opens in a new tab).
Wewnętrzne API jest również używane do komunikacji między klientami wewnątrz węzła - to znaczy umożliwia klientowi konsensusu i klientowi warstwy wykonawczej wymianę danych. Nazywa się to „Engine API”, a jego specyfikacje są dostępne na GitHubie (opens in a new tab).
Specyfikacja klienta warstwy wykonawczej
Przeczytaj pełną specyfikację API JSON-RPC na GitHubie (opens in a new tab). To API jest udokumentowane na stronie Execution API (opens in a new tab) i zawiera narzędzie Inspector, które pozwala wypróbować wszystkie dostępne metody.
Konwencje
Kodowanie wartości szesnastkowych
Przez JSON przekazywane są dwa kluczowe typy danych: niesformatowane tablice bajtów i wielkości. Oba są przekazywane w kodowaniu szesnastkowym, ale mają różne wymagania dotyczące formatowania.
Wielkości
Podczas kodowania wielkości (liczb całkowitych, liczb): zakoduj jako wartość szesnastkową, dodaj prefiks „0x”, używając najbardziej kompaktowej reprezentacji (drobny wyjątek: zero powinno być reprezentowane jako „0x0”).
Oto kilka przykładów:
- 0x41 (65 w systemie dziesiętnym)
- 0x400 (1024 w systemie dziesiętnym)
- ŹLE: 0x (zawsze powinna być co najmniej jedna cyfra - zero to „0x0”)
- ŹLE: 0x0400 (wiodące zera są niedozwolone)
- ŹLE: ff (musi mieć prefiks 0x)
Niesformatowane dane
Podczas kodowania niesformatowanych danych (tablic bajtów, adresów kont, hashów, tablic kodu bajtowego): zakoduj jako wartość szesnastkową, dodaj prefiks „0x”, po dwie cyfry szesnastkowe na bajt.
Oto kilka przykładów:
- 0x41 (rozmiar 1, „A”)
- 0x004200 (rozmiar 3, „0B0”)
- 0x (rozmiar 0, "")
- ŹLE: 0xf0f0f (musi być parzysta liczba cyfr)
- ŹLE: 004200 (musi mieć prefiks 0x)
Parametr bloku
Następujące metody mają parametr bloku:
Gdy wysyłane są żądania odpytujące stan Ethereum, podany parametr bloku określa wysokość bloku.
Dla parametru bloku możliwe są następujące opcje:
HEX String- numer bloku w postaci liczby całkowitejString "earliest"- dla najwcześniejszego bloku / bloku genezyString "latest"- dla najnowszego zaproponowanego blokuString "safe"- dla najnowszego bezpiecznego bloku czołowegoString "finalized"- dla najnowszego sfinalizowanego blokuString "pending"- dla oczekującego stanu/transakcji
Przykłady
Na tej stronie przedstawiamy przykłady użycia poszczególnych punktów końcowych API JSON_RPC za pomocą narzędzia wiersza poleceń curl (opens in a new tab). Przykłady dla poszczególnych punktów końcowych znajdują się poniżej w sekcji Przykłady użycia curl. W dalszej części strony udostępniamy również kompleksowy przykład kompilacji i wdrożenia inteligentnego kontraktu przy użyciu węzła Geth, API JSON_RPC oraz narzędzia curl.
Przykłady użycia curl
Poniżej znajdują się przykłady użycia API JSON-RPC poprzez wysyłanie żądań curl (opens in a new tab) do węzła Ethereum. Każdy przykład zawiera opis konkretnego punktu końcowego, jego parametrów, zwracanego typu oraz praktyczny przykład jego użycia.
Żądania curl mogą zwrócić komunikat o błędzie związany z typem zawartości (content type). Dzieje się tak, ponieważ opcja --data ustawia typ zawartości na application/x-www-form-urlencoded. Jeśli twój węzeł zgłasza z tego powodu błąd, ustaw nagłówek ręcznie, umieszczając -H "Content-Type: application/json" na początku wywołania. Przykłady nie zawierają również kombinacji adresu URL/IP i portu, która musi być ostatnim argumentem przekazanym do curl (np. 127.0.0.1:8545). Kompletne żądanie curl uwzględniające te dodatkowe dane przyjmuje następującą postać:
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545
Gossip, stan, historia
Garść podstawowych metod JSON-RPC wymaga danych z sieci Ethereum i dzieli się na trzy główne kategorie: Gossip, stan i historia. Użyj linków w tych sekcjach, aby przejść do każdej metody, lub skorzystaj ze spisu treści, aby zapoznać się z całą listą metod.
Metody Gossip
Te metody śledzą czoło łańcucha. W ten sposób transakcje rozprzestrzeniają się w sieci, trafiają do bloków, a klienty dowiadują się o nowych blokach.
Metody stanu
Metody, które raportują obecny stan wszystkich przechowywanych danych. „Stan” jest jak jeden wielki współdzielony fragment pamięci RAM i obejmuje salda kont, dane kontraktów oraz szacunki gazu.
Metody historii
Pobierają historyczne rekordy każdego bloku aż do genezy. Przypomina to jeden duży plik, do którego można tylko dopisywać dane (append-only), i obejmuje wszystkie nagłówki bloków, ciała bloków, bloki uncle oraz pokwitowania transakcji.
- 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 API JSON-RPC
Możesz użyć narzędzia playground (opens in a new tab), aby odkrywać i testować metody API. Pokazuje ono również, które metody i sieci są obsługiwane przez różnych dostawców węzłów.
Metody API JSON-RPC
web3_clientVersion
Zwraca aktualną wersję klienta.
Parametry
Brak
Zwraca
String - Aktualna wersja klienta
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'
// Wynik
{
"id":67,
"jsonrpc":"2.0",
"result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1"
}
web3_sha3
Zwraca Keccak-256 (nie ustandaryzowane SHA3-256) dla podanych danych.
Parametry
DATA- Dane do przekonwertowania na hash SHA3
params: ["0x68656c6c6f20776f726c64"]
Zwraca
DATA - Wynik SHA3 dla podanego ciągu znaków.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}'
// Wynik
{
"id":64,
"jsonrpc": "2.0",
"result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"
}
net_version
Zwraca aktualny identyfikator sieci.
Parametry
Brak
Zwraca
String - Aktualny identyfikator sieci.
Pełna lista aktualnych identyfikatorów sieci jest dostępna na stronie chainlist.org (opens in a new tab). Niektóre z popularnych to:
1: sieć główna Ethereum11155111: sieć testowa Sepolia560048: sieć testowa Hoodi
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'
// Wynik
{
"id":67,
"jsonrpc": "2.0",
"result": "3"
}
net_listening
Zwraca true, jeśli klient aktywnie nasłuchuje połączeń sieciowych.
Parametry
Brak
Zwraca
Boolean - true podczas nasłuchiwania, w przeciwnym razie false.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}'
// Wynik
{
"id":67,
"jsonrpc":"2.0",
"result":true
}
net_peerCount
Zwraca liczbę peerów aktualnie połączonych z klientem.
Parametry
Brak
Zwraca
QUANTITY - liczba całkowita określająca liczbę połączonych peerów.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'
// Wynik
{
"id":74,
"jsonrpc": "2.0",
"result": "0x2" // 2
}
eth_protocolVersion
Zwraca aktualną wersję protokołu Ethereum. Należy pamiętać, że ta metoda nie jest dostępna w Geth (opens in a new tab).
Parametry
Brak
Zwraca
String - Aktualna wersja protokołu Ethereum
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}'
// Wynik
{
"id":67,
"jsonrpc": "2.0",
"result": "54"
}
eth_syncing
Zwraca obiekt z danymi o statusie synchronizacji lub false.
Parametry
Brak
Zwraca
Dokładne zwracane dane różnią się w zależności od implementacji klienta. Wszystkie klienty zwracają False, gdy węzeł się nie synchronizuje, i wszystkie klienty zwracają następujące pola.
Object|Boolean, Obiekt z danymi o statusie synchronizacji lub FALSE, gdy się nie synchronizuje:
startingBlock:QUANTITY- Blok, od którego rozpoczął się import (zostanie zresetowany dopiero po tym, jak synchronizacja osiągnie wierzchołek)currentBlock:QUANTITY- Obecny blok, to samo co eth_blockNumberhighestBlock:QUANTITY- Szacowany najwyższy blok
Jednakże poszczególne klienty mogą również dostarczać dodatkowe dane. Na przykład Geth zwraca następujące dane:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"currentBlock": "0x3cf522",
"healedBytecodeBytes": "0x0",
"healedBytecodes": "0x0",
"healedTrienodes": "0x0",
"healingBytecode": "0x0",
"healingTrienodes": "0x0",
"highestBlock": "0x3e0e41",
"startingBlock": "0x3cbed5",
"syncedAccountBytes": "0x0",
"syncedAccounts": "0x0",
"syncedBytecodeBytes": "0x0",
"syncedBytecodes": "0x0",
"syncedStorage": "0x0",
"syncedStorageBytes": "0x0"
}
}
Natomiast Besu zwraca:
{
"jsonrpc": "2.0",
"id": 51,
"result": {
"startingBlock": "0x0",
"currentBlock": "0x1518",
"highestBlock": "0x9567a3",
"pulledStates": "0x203ca",
"knownStates": "0x200636"
}
}
Więcej szczegółów znajdziesz w dokumentacji swojego konkretnego klienta.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": {
startingBlock: '0x384',
currentBlock: '0x386',
highestBlock: '0x454'
}
}
// Lub gdy nie ma synchronizacji
{
"id":1,
"jsonrpc": "2.0",
"result": false
}
eth_coinbase
Zwraca adres coinbase klienta.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Uwaga: Ta metoda została wycofana w wersji v1.14.0 i nie jest już obsługiwana. Próba użycia tej metody spowoduje błąd „Method not supported”.
Parametry
Brak
Zwraca
DATA, 20 bajtów - aktualny adres coinbase.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}'
// Wynik
{
"id":64,
"jsonrpc": "2.0",
"result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1"
}
eth_chainId
Zwraca identyfikator łańcucha używany do podpisywania transakcji chronionych przed atakami typu replay.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
Brak
Zwraca
chainId, wartość szesnastkowa w postaci ciągu znaków reprezentująca liczbę całkowitą aktualnego identyfikatora łańcucha.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}'
// Wynik
{
"id":67,
"jsonrpc": "2.0",
"result": "0x1"
}
eth_mining
Zwraca true, jeśli klient aktywnie kopie nowe bloki. Może to zwrócić true tylko dla sieci opartych na dowodzie pracy (PoW) i może nie być dostępne w niektórych klientach od czasu The Merge.
Parametry
Brak
Zwraca
Boolean - zwraca true, jeśli klient kopie, w przeciwnym razie false.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}'
//
{
"id":71,
"jsonrpc": "2.0",
"result": true
}
eth_hashrate
Zwraca liczbę hashy na sekundę, z jaką kopie węzeł. Może to zwrócić true tylko dla sieci opartych na dowodzie pracy i może nie być dostępne w niektórych klientach od czasu The Merge.
Parametry
Brak
Zwraca
QUANTITY - liczba hashy na sekundę.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}'
// Wynik
{
"id":71,
"jsonrpc": "2.0",
"result": "0x38a"
}
eth_gasPrice
Zwraca szacunkową obecną cenę za gaz w wei. Na przykład klient Besu domyślnie bada ostatnie 100 bloków i zwraca medianę ceny jednostki gazu.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
Brak
Zwraca
QUANTITY - liczba całkowita określająca obecną cenę gazu w wei.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}'
// Wynik
{
"id":73,
"jsonrpc": "2.0",
"result": "0x1dfd14000" // 8049999872 Wei
}
eth_accounts
Zwraca listę adresów należących do klienta.
Wypróbuj endpoint w piaskownicy (opens in a new tab)Parametry
Brak
Zwraca
Array of DATA, 20 bajtów - adresy należące do klienta.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]
}
eth_blockNumber
Zwraca numer najnowszego bloku.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
Brak
Zwraca
QUANTITY - liczba całkowita oznaczająca numer bieżącego bloku, na którym znajduje się klient.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'
// Wynik
{
"id":83,
"jsonrpc": "2.0",
"result": "0x4b7" // 1207
}
eth_getBalance
Zwraca saldo konta pod danym adresem.
Wypróbuj punkt końcowy w środowisku testowym (opens in a new tab)Parametry
DATA, 20 bajtów - adres, którego saldo ma zostać sprawdzone.QUANTITY|TAG- liczba całkowita określająca numer bloku lub ciąg znaków"latest","earliest","pending","safe"lub"finalized", zobacz parametr bloku
params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]
Zwraca
QUANTITY - liczba całkowita określająca obecne saldo w wei.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x0234c8a3397aab58" // 158972490234375000
}
eth_getStorageAt
Zwraca wartość z pozycji pamięci pod danym adresem.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
DATA, 20 bajtów - adres pamięci.QUANTITY- liczba całkowita określająca pozycję w pamięci.QUANTITY|TAG- liczba całkowita określająca numer bloku lub ciąg znaków"latest","earliest","pending","safe","finalized", zobacz parametr bloku
Zwraca
DATA - wartość na tej pozycji w pamięci.
Przykład
Obliczenie prawidłowej pozycji zależy od pamięci, którą chcemy pobrać. Rozważmy następujący kontrakt wdrożony pod adresem 0x295a70b2de5e3953354a6a8344e616ed314d7251 przez adres 0x391694e7e0b0cce554cb130d723a9d27458f9298.
contract Storage {
uint pos0;
mapping(address => uint) pos1;
constructor() {
pos0 = 1234;
pos1[msg.sender] = 5678;
}
}
Pobranie wartości pos0 jest proste:
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"}
Pobranie elementu z mapy jest trudniejsze. Pozycja elementu w mapie jest obliczana za pomocą:
keccak(LeftPad32(key, 0), LeftPad32(map position, 0))
Oznacza to, że aby pobrać pamięć dla pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"], musimy obliczyć pozycję za pomocą:
keccak(
decodeHex(
"000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" +
"0000000000000000000000000000000000000000000000000000000000000001"
)
)
Konsola Geth, która jest dostarczana z biblioteką Web3, może zostać użyta do wykonania tego obliczenia:
> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
undefined
> web3.sha3(key, {"encoding": "hex"})
"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"
Teraz, aby pobrać pamięć:
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
Zwraca liczbę transakcji wysłanych z danego adresu.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
DATA, 20 bajtów - adres.QUANTITY|TAG- numer bloku w postaci liczby całkowitej lub ciąg znaków"latest","earliest","pending","safe"lub"finalized", zobacz parametr bloku
params: [
"0x407d73d8a49eeb85d32cf465507dd71d507100c1",
"latest", // stan w najnowszym bloku
]
Zwraca
QUANTITY - liczba całkowita określająca liczbę transakcji wysłanych z tego adresu.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_getBlockTransactionCountByHash
Zwraca liczbę transakcji w bloku pasującym do podanego hasha bloku.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
DATA, 32 bajty - hash bloku
params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]
Zwraca
QUANTITY - liczba całkowita określająca liczbę transakcji w tym bloku.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x8b" // 139
}
eth_getBlockTransactionCountByNumber
Zwraca liczbę transakcji w bloku pasującym do podanego numeru bloku.
Wypróbuj punkt końcowy w środowisku testowym (opens in a new tab)Parametry
QUANTITY|TAG- liczba całkowita będąca numerem bloku lub ciąg znaków"earliest","latest","pending","safe"lub"finalized", zgodnie z parametrem bloku.
params: [
"0x13738ca", // 20396234
]
Zwraca
QUANTITY - liczba całkowita określająca liczbę transakcji w tym bloku.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x8b" // 139
}
eth_getUncleCountByBlockHash
Zwraca liczbę wujków w bloku na podstawie podanego hasha bloku.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
DATA, 32 bajty – hash bloku
params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]
Zwraca
QUANTITY – liczba całkowita reprezentująca liczbę wujków w tym bloku.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_getUncleCountByBlockNumber
Zwraca liczbę wujków w bloku pasującym do podanego numeru bloku.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
QUANTITY|TAG- liczba całkowita będąca numerem bloku lub ciąg znaków"latest","earliest","pending","safe"lub"finalized", zobacz parametr bloku
params: [
"0xe8", // 232
]
Zwraca
QUANTITY - liczba całkowita określająca liczbę wujków w tym bloku.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x0" // 0
}
eth_getCode
Zwraca kod pod danym adresem.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
DATA, 20 bajtów - adresQUANTITY|TAG- całkowity numer bloku lub ciąg znaków"latest","earliest","pending","safe"lub"finalized", zobacz parametr bloku
params: [
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"0x5daf3b", // 6139707
]
Zwraca
DATA - kod z podanego adresu.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"
}
eth_sign
Metoda sign oblicza specyficzny dla Ethereum podpis za pomocą: sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))).
Dodanie prefiksu do wiadomości sprawia, że obliczony podpis jest rozpoznawalny jako specyficzny dla Ethereum. Zapobiega to nadużyciom, w których złośliwa zdecentralizowana aplikacja (dapp) może podpisać dowolne dane (np. transakcję) i użyć podpisu do podszycia się pod ofiarę.
Uwaga: adres, za pomocą którego ma zostać złożony podpis, musi być odblokowany.
Parametry
DATA, 20 bajtów - adresDATA, N bajtów - wiadomość do podpisania
Zwraca
DATA: Podpis
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
}
eth_signTransaction
Podpisuje transakcję, która może zostać przesłana do sieci w późniejszym czasie za pomocą eth_sendRawTransaction.
Parametry
Object- Obiekt transakcji
type:from:DATA, 20 bajtów - Adres, z którego wysyłana jest transakcja.to:DATA, 20 bajtów - (opcjonalne przy tworzeniu nowego kontraktu) Adres, do którego skierowana jest transakcja.gas:QUANTITY- (opcjonalne, domyślnie: 90000) Liczba całkowita określająca gaz dostarczony do wykonania transakcji. Zwróci niewykorzystany gaz.gasPrice:QUANTITY- (opcjonalne, domyślnie: do ustalenia) Liczba całkowita określająca gasPrice użyty dla każdej opłaconej jednostki gazu, w wei.value:QUANTITY- (opcjonalne) Liczba całkowita określająca wartość wysłaną z tą transakcją, w wei.data:DATA- Skompilowany kod kontraktu LUB hash podpisu wywoływanej metody i zakodowanych parametrów.nonce:QUANTITY- (opcjonalne) Liczba całkowita określająca nonce. Pozwala to na nadpisanie własnych oczekujących transakcji, które używają tego samego nonce.
Zwraca
DATA, Zakodowany w RLP obiekt transakcji podpisany przez określone konto.
Przykład
// Żądanie
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"}]}'
// Wynik
{
"id": 1,
"jsonrpc": "2.0",
"result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
}
eth_sendTransaction
Tworzy nową transakcję wywołania wiadomości lub utworzenia kontraktu, jeśli pole danych zawiera kod, i podpisuje ją za pomocą konta określonego w from.
Parametry
Object- Obiekt transakcji
from:DATA, 20 bajtów - Adres, z którego wysyłana jest transakcja.to:DATA, 20 bajtów - (opcjonalne przy tworzeniu nowego kontraktu) Adres, do którego skierowana jest transakcja.gas:QUANTITY- (opcjonalne, domyślnie: 90000) Liczba całkowita określająca gaz dostarczony do wykonania transakcji. Niewykorzystany gaz zostanie zwrócony.gasPrice:QUANTITY- (opcjonalne, domyślnie: do ustalenia) Liczba całkowita określająca cenę gazu (gasPrice) używaną dla każdej opłaconej jednostki gazu.value:QUANTITY- (opcjonalne) Liczba całkowita określająca wartość wysłaną wraz z tą transakcją.input:DATA- Skompilowany kod kontraktu LUB hash podpisu wywoływanej metody i zakodowanych parametrów.nonce:QUANTITY- (opcjonalne) Liczba całkowita określająca nonce. Pozwala to na nadpisanie własnych oczekujących transakcji, które używają tego samego nonce.
params: [
{
from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
to: "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
gas: "0x76c0", // 30400
gasPrice: "0x9184e72a000", // 10000000000000
value: "0x9184e72a", // 2441406250
input:
"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
},
]
Zwraca
DATA, 32 bajty - hash transakcji lub zerowy hash, jeśli transakcja nie jest jeszcze dostępna.
Użyj eth_getTransactionReceipt, aby uzyskać adres kontraktu po tym, jak transakcja została zaproponowana w bloku, w przypadku utworzenia kontraktu.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}
eth_sendRawTransaction
Tworzy nową transakcję wywołania wiadomości lub transakcję utworzenia kontraktu dla podpisanych transakcji.
Parametry
DATA, Podpisane dane transakcji.
params: [
"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
]
Zwraca
DATA, 32 bajty - hash transakcji, lub zerowy hash, jeśli transakcja nie jest jeszcze dostępna.
Użyj eth_getTransactionReceipt, aby uzyskać adres kontraktu po tym, jak transakcja została zaproponowana w bloku, jeśli utworzyłeś kontrakt.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}
eth_call
Wykonuje nowe wywołanie wiadomości natychmiast, bez tworzenia transakcji na blockchainie. Często używane do wykonywania funkcji inteligentnych kontraktów tylko do odczytu, na przykład balanceOf dla kontraktu ERC-20.
Parametry
Object- Obiekt wywołania transakcji
from:DATA, 20 bajtów - (opcjonalnie) Adres, z którego wysyłana jest transakcja.to:DATA, 20 bajtów - Adres, do którego kierowana jest transakcja.gas:QUANTITY- (opcjonalnie) Liczba całkowita określająca gaz dostarczony do wykonania transakcji. eth_call zużywa zero gazu, ale ten parametr może być wymagany przez niektóre wykonania.gasPrice:QUANTITY- (opcjonalnie) Liczba całkowita określająca cenę gazu używaną dla każdej opłaconej jednostki gazuvalue:QUANTITY- (opcjonalnie) Liczba całkowita określająca wartość wysłaną z tą transakcjąinput:DATA- (opcjonalnie) Hash podpisu metody i zakodowanych parametrów. Szczegółowe informacje można znaleźć w ABI kontraktu Ethereum w dokumentacji Solidity (opens in a new tab).
QUANTITY|TAG- liczba całkowita określająca numer bloku lub ciąg znaków"latest","earliest","pending","safe"lub"finalized", zobacz parametr bloku
Zwraca
DATA - wartość zwracana przez wykonany kontrakt.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x"
}
eth_estimateGas
Generuje i zwraca szacunkową ilość gazu niezbędną do zakończenia transakcji. Transakcja nie zostanie dodana do blockchaina. Należy pamiętać, że szacunkowa wartość może być znacznie wyższa niż ilość gazu faktycznie zużyta przez transakcję z różnych powodów, w tym ze względu na mechanikę EVM i wydajność węzła.
Wypróbuj punkt końcowy w środowisku testowym (opens in a new tab)Parametry
Zobacz parametry eth_call, z tą różnicą, że wszystkie właściwości są opcjonalne. Jeśli nie określono limitu gazu, Geth używa limitu gazu z oczekującego bloku jako górnej granicy. W rezultacie zwrócona szacunkowa wartość może nie wystarczyć do wykonania wywołania/transakcji, gdy ilość gazu jest wyższa niż limit gazu oczekującego bloku.
Zwraca
QUANTITY - ilość zużytego gazu.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x5208" // 21000
}
eth_getBlockByHash
Zwraca informacje o bloku na podstawie jego hasha.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
DATA, 32 bajty - Hash bloku.Boolean- Jeślitrue, zwraca pełne obiekty transakcji, jeślifalse, tylko hashe transakcji.
params: [
"0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
false,
]
Zwraca
Object - Obiekt bloku lub null, gdy nie znaleziono bloku:
number:QUANTITY- numer bloku.null, gdy jest to blok oczekujący.hash:DATA, 32 bajty - hash bloku.null, gdy jest to blok oczekujący.parentHash:DATA, 32 bajty - hash bloku nadrzędnego.nonce:DATA, 8 bajtów - hash wygenerowanego dowodu pracy (PoW).null, gdy jest to blok oczekujący,0x0dla bloków dowodu stawki (PoS) (od czasu The Merge).sha3Uncles:DATA, 32 bajty - SHA3 danych uncles w bloku.logsBloom:DATA, 256 bajtów - filtr Blooma dla logów bloku.null, gdy jest to blok oczekujący.transactionsRoot:DATA, 32 bajty - korzeń drzewa transakcji bloku.stateRoot:DATA, 32 bajty - korzeń końcowego drzewa stanu bloku.receiptsRoot:DATA, 32 bajty - korzeń drzewa pokwitowań bloku.miner:DATA, 20 bajtów - adres beneficjenta, któremu przyznano nagrody za blok.difficulty:QUANTITY- liczba całkowita określająca trudność tego bloku.totalDifficulty:QUANTITY- liczba całkowita określająca całkowitą trudność łańcucha do tego bloku.extraData:DATA- pole "extra data" tego bloku.size:QUANTITY- liczba całkowita określająca rozmiar tego bloku w bajtach.gasLimit:QUANTITY- maksymalna ilość gazu dozwolona w tym bloku.gasUsed:QUANTITY- całkowita ilość gazu zużyta przez wszystkie transakcje w tym bloku.timestamp:QUANTITY- znacznik czasu Unix (timestamp) momentu zestawienia bloku.transactions:Array- tablica obiektów transakcji lub 32-bajtowe hashe transakcji, w zależności od ostatniego podanego parametru.uncles:Array- tablica hashy uncles.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}'
// Wynik
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"difficulty": "0x4ea3f27bc",
"extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32",
"gasLimit": "0x1388",
"gasUsed": "0x0",
"hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171",
"mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843",
"nonce": "0x689056015818adbe",
"number": "0x1b4",
"parentHash": "0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54",
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x220",
"stateRoot": "0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d",
"timestamp": "0x55ba467c",
"totalDifficulty": "0x78ed983323d",
"transactions": [
],
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncles": [
]
}
}
eth_getBlockByNumber
Zwraca informacje o bloku na podstawie jego numeru.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
QUANTITY|TAG- liczba całkowita będąca numerem bloku lub ciąg znaków"earliest","latest","pending","safe"lub"finalized", zgodnie z parametrem bloku.Boolean- Jeślitrue, zwraca pełne obiekty transakcji, jeślifalse, tylko hashe transakcji.
params: [
"0x1b4", // 436
true,
]
Zwraca Zobacz eth_getBlockByHash
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'
Wynik: zobacz eth_getBlockByHash
eth_getTransactionByHash
Zwraca informacje o transakcji na podstawie żądanego hasha transakcji.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
DATA, 32 bajty - hash transakcji
params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"]
Zwraca
Object - Obiekt transakcji lub null, gdy nie znaleziono transakcji:
blockHash:DATA, 32 bajty - hash bloku, w którym znajdowała się ta transakcja.null, gdy jest oczekująca.blockNumber:QUANTITY- numer bloku, w którym znajdowała się ta transakcja.null, gdy jest oczekująca.from:DATA, 20 bajtów - adres nadawcy.gas:QUANTITY- gaz dostarczony przez nadawcę.gasPrice:QUANTITY- cena gazu dostarczona przez nadawcę w wei.hash:DATA, 32 bajty - hash transakcji.input:DATA- dane wysłane wraz z transakcją.nonce:QUANTITY- liczba transakcji wykonanych przez nadawcę przed tą transakcją.to:DATA, 20 bajtów - adres odbiorcy.null, gdy jest to transakcja utworzenia kontraktu.transactionIndex:QUANTITY- liczba całkowita określająca pozycję indeksu transakcji w bloku.null, gdy jest oczekująca.value:QUANTITY- przesłana wartość w wei.v:QUANTITY- identyfikator odzyskiwania ECDSAr:QUANTITY- podpis ECDSA rs:QUANTITY- podpis ECDSA s
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}'
// Wynik
{
"jsonrpc":"2.0",
"id":1,
"result":{
"blockHash":"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"blockNumber":"0x5daf3b", // 6139707
"from":"0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",
"gas":"0xc350", // 50000
"gasPrice":"0x4a817c800", // 20000000000
"hash":"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
"input":"0x68656c6c6f21",
"nonce":"0x15", // 21
"to":"0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",
"transactionIndex":"0x41", // 65
"value":"0xf3dbb76162000", // 4290000000000000
"v":"0x25", // 37
"r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",
"s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c"
}
}
eth_getTransactionByBlockHashAndIndex
Zwraca informacje o transakcji na podstawie hasha bloku i pozycji indeksu transakcji.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
DATA, 32 bajty - hash bloku.QUANTITY- liczba całkowita określająca pozycję indeksu transakcji.
params: [
"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"0x0", // 0
]
Zwraca Zobacz eth_getTransactionByHash
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'
Wynik: zobacz eth_getTransactionByHash
eth_getTransactionByBlockNumberAndIndex
Zwraca informacje o transakcji na podstawie numeru bloku i pozycji indeksu transakcji.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
QUANTITY|TAG- numer bloku lub ciąg znaków"earliest","latest","pending","safe"lub"finalized", tak jak w parametrze bloku.QUANTITY- pozycja indeksu transakcji.
params: [
"0x9c47cf", // 10241999
"0x24", // 36
]
Zwraca Zobacz eth_getTransactionByHash
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}'
Wynik zobacz w eth_getTransactionByHash
eth_getTransactionReceipt
Zwraca pokwitowanie transakcji na podstawie hasha transakcji.
Uwaga Pokwitowanie nie jest dostępne dla oczekujących transakcji.
Parametry
DATA, 32 bajty - hash transakcji
params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"]
Zwraca
Object - Obiekt pokwitowania transakcji lub null, gdy nie znaleziono pokwitowania:
transactionHash:DATA, 32 bajty - hash transakcji.transactionIndex:QUANTITY- liczba całkowita określająca pozycję indeksu transakcji w bloku.blockHash:DATA, 32 bajty - hash bloku, w którym znajdowała się ta transakcja.blockNumber:QUANTITY- numer bloku, w którym znajdowała się ta transakcja.from:DATA, 20 bajtów - adres nadawcy.to:DATA, 20 bajtów - adres odbiorcy. null, gdy jest to transakcja utworzenia kontraktu.cumulativeGasUsed:QUANTITY- Całkowita ilość gazu zużyta podczas wykonywania tej transakcji w bloku.effectiveGasPrice:QUANTITY- Suma opłaty podstawowej i opłaty priorytetowej zapłaconej za jednostkę gazu.gasUsed:QUANTITY- Ilość gazu zużyta wyłącznie przez tę konkretną transakcję.contractAddress:DATA, 20 bajtów - Adres utworzonego kontraktu, jeśli transakcja była transakcją utworzenia kontraktu, w przeciwnym razienull.logs:Array- Tablica obiektów logów, które wygenerowała ta transakcja.logsBloom:DATA, 256 bajtów - Filtr Blooma dla lekkich klientów do szybkiego pobierania powiązanych logów.type:QUANTITY- liczba całkowita określająca typ transakcji,0x0dla starszych transakcji (legacy),0x1dla typów z listą dostępu (access list),0x2dla opłat dynamicznych.
Zwraca również jedno z poniższych:
root:DATA32 bajty korzenia stanu po transakcji (przed aktualizacją Bizancjum)status:QUANTITYalbo1(sukces), albo0(niepowodzenie)
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}'
// Wynik
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"blockHash":
"0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3",
"blockNumber": "0xeff35f",
"contractAddress": null, // ciąg znaków adresu, jeśli został utworzony
"cumulativeGasUsed": "0xa12515",
"effectiveGasPrice": "0x5a9c688d4",
"from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7",
"gasUsed": "0xb4c8",
"logs": [{
// logi zwracane przez getFilterLogs itp.
}],
"logsBloom": "0x00...0", // 256-bajtowy filtr Blooma
"status": "0x1",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"transactionHash":
"0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5",
"transactionIndex": "0x66",
"type": "0x2"
}
}
eth_getUncleByBlockHashAndIndex
Zwraca informacje o wujku bloku na podstawie hasha i pozycji indeksu wujka.
Wypróbuj punkt końcowy w środowisku testowym (opens in a new tab)Parametry
DATA, 32 bajty – hash bloku.QUANTITY– pozycja indeksu wujka.
params: [
"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"0x0", // 0
]
Zwraca Zobacz eth_getBlockByHash
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'
Wynik, zobacz eth_getBlockByHash
Uwaga: Wujek nie zawiera pojedynczych transakcji.
eth_getUncleByBlockNumberAndIndex
Zwraca informacje o wujku bloku na podstawie numeru bloku i pozycji indeksu wujka.
Wypróbuj endpoint w środowisku testowym (opens in a new tab)Parametry
QUANTITY|TAG- numer bloku lub ciąg znaków"earliest","latest","pending","safe","finalized", tak jak w parametrze bloku.QUANTITY- pozycja indeksu wujka.
params: [
"0x29c", // 668
"0x0", // 0
]
Zwraca Zobacz eth_getBlockByHash
Uwaga: Wujek nie zawiera pojedynczych transakcji.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}'
Wynik, zobacz eth_getBlockByHash
eth_newFilter
Tworzy obiekt filtra na podstawie opcji filtrowania, aby powiadamiać o zmianach stanu (logach). Aby sprawdzić, czy stan uległ zmianie, wywołaj eth_getFilterChanges.
Uwaga dotycząca określania filtrów tematów: Tematy są zależne od kolejności. Transakcja z logiem zawierającym tematy [A, B] zostanie dopasowana przez następujące filtry tematów:
[]"cokolwiek"[A]"A na pierwszej pozycji (i cokolwiek po nim)"[null, B]"cokolwiek na pierwszej pozycji ORAZ B na drugiej pozycji (i cokolwiek po nim)"[A, B]"A na pierwszej pozycji ORAZ B na drugiej pozycji (i cokolwiek po nim)"[[A, B], [A, B]]"(A LUB B) na pierwszej pozycji ORAZ (A LUB B) na drugiej pozycji (i cokolwiek po nim)"- Parametry
Object- Opcje filtra:
fromBlock:QUANTITY|TAG- (opcjonalnie, domyślnie:"latest") Całkowity numer bloku, lub"latest"dla ostatniego zaproponowanego bloku,"safe"dla najnowszego bezpiecznego bloku,"finalized"dla najnowszego sfinalizowanego bloku, lub"pending","earliest"dla transakcji, które nie są jeszcze w bloku.toBlock:QUANTITY|TAG- (opcjonalnie, domyślnie:"latest") Całkowity numer bloku, lub"latest"dla ostatniego zaproponowanego bloku,"safe"dla najnowszego bezpiecznego bloku,"finalized"dla najnowszego sfinalizowanego bloku, lub"pending","earliest"dla transakcji, które nie są jeszcze w bloku.address:DATA|Array, 20 bajtów - (opcjonalnie) Adres kontraktu lub lista adresów, z których powinny pochodzić logi.topics:Array of DATA, - (opcjonalnie) Tablica 32-bajtowych tematówDATA. Tematy są zależne od kolejności. Każdy temat może być również tablicą DATA z opcjami „lub”.
params: [
{
fromBlock: "0x1",
toBlock: "0x2",
address: "0x8888f1f195afa192cfee860698584c030f4c9db1",
topics: [
"0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
null,
[
"0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
"0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc",
],
],
},
]
Zwraca
QUANTITY - Identyfikator filtra.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_newBlockFilter
Tworzy filtr w węźle, aby powiadamiać o nadejściu nowego bloku. Aby sprawdzić, czy stan uległ zmianie, wywołaj eth_getFilterChanges.
Parametry Brak
Zwraca
QUANTITY - Identyfikator filtra.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_newPendingTransactionFilter
Tworzy filtr w węźle, aby powiadamiać o nadejściu nowych oczekujących transakcji. Aby sprawdzić, czy stan uległ zmianie, wywołaj eth_getFilterChanges.
Parametry Brak
Zwraca
QUANTITY - Identyfikator filtru.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_uninstallFilter
Odinstalowuje filtr o podanym identyfikatorze. Należy zawsze wywoływać tę metodę, gdy obserwowanie nie jest już potrzebne. Dodatkowo filtry wygasają, gdy nie są odpytywane za pomocą eth_getFilterChanges przez pewien czas.
Parametry
QUANTITY- Identyfikator filtra.
params: [
"0xb", // 11
]
Zwraca
Boolean - true, jeśli filtr został pomyślnie odinstalowany, w przeciwnym razie false.
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}'
// Wynik
{
"id":1,
"jsonrpc": "2.0",
"result": true
}
eth_getFilterChanges
Metoda odpytywania dla filtru, która zwraca tablicę logów, które wystąpiły od ostatniego odpytania.
Parametry
QUANTITY- identyfikator filtru.
params: [
"0x16", // 22
]
Zwraca
Array - Tablica obiektów logów lub pusta tablica, jeśli nic się nie zmieniło od ostatniego odpytania.
-
Dla filtrów utworzonych za pomocą
eth_newBlockFilterzwracane są hashe bloków (DATA, 32 bajty), np.["0x3454645634534..."]. -
Dla filtrów utworzonych za pomocą
eth_newPendingTransactionFilterzwracane są hashe transakcji (DATA, 32 bajty), np.["0x6345343454645..."]. -
Dla filtrów utworzonych za pomocą
eth_newFilterlogi są obiektami o następujących parametrach:removed:TAG-true, gdy log został usunięty z powodu reorganizacji łańcucha.false, jeśli jest to prawidłowy log.logIndex:QUANTITY- liczba całkowita określająca pozycję indeksu logu w bloku.null, gdy jest to log oczekujący.transactionIndex:QUANTITY- liczba całkowita określająca pozycję indeksu transakcji, z której utworzono log.null, gdy jest to log oczekujący.transactionHash:DATA, 32 bajty - hash transakcji, z której utworzono ten log.null, gdy jest to log oczekujący.blockHash:DATA, 32 bajty - hash bloku, w którym znajdował się ten log.null, gdy jest oczekujący.null, gdy jest to log oczekujący.blockNumber:QUANTITY- numer bloku, w którym znajdował się ten log.null, gdy jest oczekujący.null, gdy jest to log oczekujący.address:DATA, 20 bajtów - adres, z którego pochodzi ten log.data:DATA- nieindeksowane dane logu o zmiennej długości. (W języku Solidity: zero lub więcej 32-bajtowych nieindeksowanych argumentów logu.)topics:Array of DATA- Tablica od 0 do 4 32-bajtowychDATAindeksowanych argumentów logu. (W języku Solidity: Pierwszy temat to hash podpisu zdarzenia (np.Deposit(address,bytes32,uint256)), chyba że zdarzenie zostało zadeklarowane ze specyfikatoremanonymous.)
-
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'
// Wynik
{
"id":1,
"jsonrpc":"2.0",
"result": [{
"logIndex": "0x1", // 1
"blockNumber":"0x1b4", // 436
"blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
"transactionIndex": "0x0", // 0
"address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"data":"0x0000000000000000000000000000000000000000000000000000000000000000",
"topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"]
},{
...
}]
}
eth_getFilterLogs
Zwraca tablicę wszystkich logów pasujących do filtra o podanym identyfikatorze.
Parametry
QUANTITY- Identyfikator filtra.
params: [
"0x16", // 22
]
Zwraca Zobacz eth_getFilterChanges
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}'
Wynik: zobacz eth_getFilterChanges
eth_getLogs
Zwraca tablicę wszystkich logów pasujących do podanego obiektu filtru.
Parametry
Object- Opcje filtru:
fromBlock:QUANTITY|TAG- (opcjonalnie, domyślnie:"latest") Numer bloku jako liczba całkowita, lub"latest"dla ostatniego zaproponowanego bloku,"safe"dla najnowszego bezpiecznego bloku,"finalized"dla najnowszego sfinalizowanego bloku, lub"pending","earliest"dla transakcji, które nie są jeszcze w bloku.toBlock:QUANTITY|TAG- (opcjonalnie, domyślnie:"latest") Numer bloku jako liczba całkowita, lub"latest"dla ostatniego zaproponowanego bloku,"safe"dla najnowszego bezpiecznego bloku,"finalized"dla najnowszego sfinalizowanego bloku, lub"pending","earliest"dla transakcji, które nie są jeszcze w bloku.address:DATA|Array, 20 bajtów - (opcjonalnie) Adres kontraktu lub lista adresów, z których powinny pochodzić logi.topics:Array of DATA, - (opcjonalnie) Tablica 32-bajtowych tematówDATA. Tematy zależą od kolejności. Każdy temat może być również tablicą DANYCH z opcjami „lub”.blockHash:DATA, 32 bajty - (opcjonalnie, w przyszłości) Wraz z dodaniem EIP-234,blockHashbędzie nową opcją filtru, która ogranicza zwracane logi do pojedynczego bloku o 32-bajtowym hashublockHash. UżycieblockHashjest równoznaczne zfromBlock=toBlock= numer bloku z hashemblockHash. JeśliblockHashjest obecny w kryteriach filtru, to anifromBlock, anitoBlocknie są dozwolone.
params: [
{
topics: [
"0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
],
},
]
Zwraca Zobacz eth_getFilterChanges
Przykład
// Żądanie
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}'
Wynik zobacz w eth_getFilterChanges
Przykład użycia
Wdrażanie kontraktu za pomocą JSON_RPC
Ta sekcja zawiera demonstrację, jak wdrożyć kontrakt używając tylko interfejsu RPC. Istnieją alternatywne sposoby wdrażania kontraktów, w których ta złożoność jest ukryta — na przykład przy użyciu bibliotek zbudowanych na interfejsie RPC, takich jak Web3.js (opens in a new tab) i Web3.py (opens in a new tab). Te abstrakcje są na ogół łatwiejsze do zrozumienia i mniej podatne na błędy, ale nadal warto wiedzieć, jak to działa od podszewki.
Poniżej znajduje się prosty inteligentny kontrakt o nazwie Multiply7, który zostanie wdrożony za pomocą interfejsu JSON-RPC w węźle Ethereum. Ten samouczek zakłada, że czytelnik ma już uruchomiony węzeł Geth. Więcej informacji o węzłach i klientach jest dostępnych tutaj. Zapoznaj się z dokumentacją poszczególnych klientów, aby dowiedzieć się, jak uruchomić HTTP JSON-RPC dla klientów innych niż Geth. Większość klientów domyślnie nasłuchuje na localhost:8545.
contract Multiply7 {
event Print(uint);
function multiply(uint input) returns (uint) {
Print(input * 7);
return input * 7;
}
}
Pierwszą rzeczą, którą należy zrobić, jest upewnienie się, że interfejs HTTP RPC jest włączony. Oznacza to, że podczas uruchamiania przekazujemy do Geth flagę --http. W tym przykładzie używamy węzła Geth w prywatnym łańcuchu deweloperskim. Dzięki takiemu podejściu nie potrzebujemy etheru w prawdziwej sieci.
geth --http --dev console 2>>geth.log
Spowoduje to uruchomienie interfejsu HTTP RPC na http://localhost:8545.
Możemy sprawdzić, czy interfejs działa, pobierając adres Coinbase (uzyskując pierwszy adres z tablicy kont) i saldo za pomocą curl (opens in a new tab). Należy pamiętać, że dane w tych przykładach będą się różnić w Twoim lokalnym węźle. Jeśli chcesz wypróbować te polecenia, zastąp parametry żądania w drugim wywołaniu curl wynikiem zwróconym z pierwszego.
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"}
Ponieważ liczby są zakodowane szesnastkowo, saldo jest zwracane w wei jako ciąg szesnastkowy. Jeśli chcemy uzyskać saldo w etherze jako liczbę, możemy użyć web3 z konsoli Geth.
web3.fromWei("0x1639e49bba16280000", "ether")
// "410"
Teraz, gdy na naszym prywatnym łańcuchu deweloperskim znajduje się trochę etheru, możemy wdrożyć kontrakt. Pierwszym krokiem jest kompilacja kontraktu Multiply7 do kodu bajtowego, który może zostać wysłany do EVM. Aby zainstalować solc, kompilator Solidity, postępuj zgodnie z dokumentacją Solidity (opens in a new tab). (Możesz chcieć użyć starszej wersji solc, aby dopasować ją do wersji kompilatora użytej w naszym przykładzie (opens in a new tab)).
Kolejnym krokiem jest kompilacja kontraktu Multiply7 do kodu bajtowego, który może zostać wysłany do 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
Teraz, gdy mamy skompilowany kod, musimy ustalić, ile gazu będzie kosztować jego wdrożenie. Interfejs RPC posiada metodę eth_estimateGas, która poda nam szacunkową wartość.
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"}
I wreszcie wdrożyć kontrakt.
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"}
Transakcja zostaje zaakceptowana przez węzeł i zwracany jest hash transakcji. Ten hash może posłużyć do śledzenia transakcji. Kolejnym krokiem jest określenie adresu, pod którym wdrożono nasz kontrakt. Każda wykonana transakcja utworzy pokwitowanie. To pokwitowanie zawiera różne informacje o transakcji, takie jak to, w którym bloku transakcja została zawarta i ile gazu zużyła maszyna EVM. Jeśli transakcja
tworzy kontrakt, będzie również zawierać adres kontraktu. Możemy pobrać pokwitowanie za pomocą metody 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"}}
Nasz kontrakt został utworzony pod adresem 0x4d03d617d700cf81935d7f797f4e2ae719648262. Wynik null zamiast pokwitowania oznacza, że transakcja nie została jeszcze włączona do bloku. Poczekaj chwilę, sprawdź, czy Twój klient konsensusu jest uruchomiony i spróbuj ponownie.
Interakcja z inteligentnymi kontraktami
W tym przykładzie wyślemy transakcję za pomocą eth_sendTransaction do metody multiply kontraktu.
eth_sendTransaction wymaga kilku argumentów, w szczególności from, to i data. From to publiczny adres naszego konta, a to to adres kontraktu. Argument data zawiera ładunek (payload), który określa, jaka metoda ma zostać wywołana i z jakimi argumentami. W tym miejscu do gry wkracza ABI (binarny interfejs aplikacji) (opens in a new tab). ABI to plik JSON, który określa, jak definiować i kodować dane dla EVM.
Bajty ładunku określają, która metoda w kontrakcie jest wywoływana. Są to pierwsze 4 bajty z hasha Keccak nazwy funkcji i typów jej argumentów, zakodowane szesnastkowo. Funkcja multiply przyjmuje uint, który jest aliasem dla uint256. Daje nam to:
web3.sha3("multiply(uint256)").substring(0, 10)
// "0xc6888fa1"
Kolejnym krokiem jest zakodowanie argumentów. Mamy tylko jeden uint256, powiedzmy, wartość 6. ABI posiada sekcję, która określa, jak kodować typy uint256.
int<M>: enc(X) to kodowanie X w kodzie uzupełnień do dwóch w formacie big-endian, uzupełnione po stronie wyższego rzędu (z lewej) wartością 0xff dla ujemnego X i bajtami zerowymi dla dodatniego X, tak aby długość była wielokrotnością 32 bajtów.
Koduje się to jako 0000000000000000000000000000000000000000000000000000000000000006.
Łącząc selektor funkcji i zakodowany argument, nasze dane będą miały postać 0xc6888fa10000000000000000000000000000000000000000000000000000000000000006.
Można to teraz wysłać do węzła:
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"}
Ponieważ transakcja została wysłana, zwrócono hash transakcji. Pobranie pokwitowania daje:
{
blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",
blockNumber: 268,
contractAddress: null,
cumulativeGasUsed: 22631,
gasUsed: 22631,
logs: [{
address: "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d",
blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",
blockNumber: 268,
data: "0x000000000000000000000000000000000000000000000000000000000000002a",
logIndex: 0,
topics: ["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"],
transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",
transactionIndex: 0
}],
transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",
transactionIndex: 0
}
Pokwitowanie zawiera log. Ten log został wygenerowany przez EVM podczas wykonywania transakcji i dołączony do pokwitowania. Funkcja multiply pokazuje, że zdarzenie Print zostało wywołane z wartością wejściową pomnożoną przez 7. Ponieważ argumentem dla zdarzenia Print był uint256, możemy go zdekodować zgodnie z regułami ABI, co da nam oczekiwaną wartość dziesiętną 42. Oprócz danych warto zauważyć, że tematy (topics) mogą być użyte do określenia, które zdarzenie utworzyło log:
web3.sha3("Print(uint256)")
// "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"
To było tylko krótkie wprowadzenie do niektórych z najczęstszych zadań, demonstrujące bezpośrednie użycie JSON-RPC.