Перейти к основному содержанию
Change page

JSON-RPC API

Последнее обновление страницы: 23 февраля 2026 г.

Для того чтобы программное приложение могло взаимодействовать с блокчейном Эфириум, считывая данные блокчейна или отправляя транзакции в сеть, оно должно подключиться к узлу Эфириум.

Для этой цели каждый клиент Ethereum реализует спецификацию JSON-RPC (opens in a new tab), поэтому существует единый набор методов, на которые приложения могут полагаться независимо от конкретной реализации узла или клиента.

JSON-RPC (opens in a new tab) — это легковесный протокол удаленного вызова процедур (RPC) без сохранения состояния. Он определяет несколько структур данных и правила их обработки. Это транспортная агностика, в которой понятия могут использоваться в рамках одного и того же процесса, через сокеты, через HTTP или во многих различных средах передачи сообщений. В качестве формата данных используется JSON (RFC 4627).

Реализации клиентов

Каждый клиент Ethereum может использовать разные языки программирования при реализации спецификации JSON-RPC. Дополнительную информацию о конкретных языках программирования смотрите в документации отдельных клиентов. Мы рекомендуем проверять документацию каждого клиента для получения последней информации о поддержке API.

Библиотеки для удобства

Хотя вы можете напрямую взаимодействовать с клиентами Ethereum через JSON-RPC API, для разработчиков децентрализованных приложений часто есть более простые варианты. Существует множество библиотек JavaScript и API для бэкенда, которые предоставляют оболочки поверх JSON-RPC API. С помощью этих библиотек разработчики могут писать интуитивно понятные однострочные методы на выбранном ими языке программирования для инициализации запросов JSON-RPC (под капотом), которые взаимодействуют с Ethereum.

API клиентов консенсуса

Эта страница посвящена в основном JSON-RPC API, используемому клиентами-исполнителями Эфириум. Однако консенсус-клиенты также имеют RPC API, который позволяет пользователям запрашивать информацию об узле, блоки Beacon, состояние Beacon и другую информацию, связанную с консенсусом, непосредственно с узла. Этот API документирован на веб-странице Beacon API (opens in a new tab).

Внутренний API также используется для межклиентского взаимодействия внутри узла, то есть он позволяет консенсус-клиенту и клиенту-исполнителю обмениваться данными. Это называется «Engine API», а спецификации доступны на GitHub (opens in a new tab).

Спецификация клиента исполнения

Прочитайте полную спецификацию JSON-RPC API на GitHub (opens in a new tab). Этот API документирован на веб-странице Execution API (opens in a new tab) и включает в себя Inspector для тестирования всех доступных методов.

Соглашения

Кодирование шестнадцатеричных значений

Два ключевых типа данных передаются через JSON: неформатированные массивы байтов и величины. Оба передаются с шестнадцатеричной кодировкой, но с различными требованиями к форматированию.

Величины

При кодировании величин (целых чисел, цифр): кодирование как шестнадцатеричный, префикс с "0x", самое компактное представление (небольшое исключение: ноль должен быть представлен как "0x0").

Вот несколько примеров:

  • 0x41 (65 в десятичной системе)
  • 0x400 (1024 в десятичной системе)
  • НЕВЕРНО: 0x (всегда должна быть по крайней мере одна цифра - ноль равен "0x0")
  • НЕВЕРНО: 0x0400 (нули в начале не допускаются)
  • НЕВЕРНО: ff (должен быть префикс 0x)

Неформатированные данные

При кодировании неформатированных данных (массивов байтов, адресов аккаунтов, хэш, массивов байт-кодов): кодируйте как шестнадцатеричный, префикс с "0x", две шестнадцатеричные цифры на байт.

Вот несколько примеров:

  • 0x41 (размер 1, "A")
  • 0x004200 (размер 3, "0B0")
  • 0x (размер 0, "")
  • НЕВЕРНО: 0xf0f0f (должно быть четное количество цифр)
  • НЕВЕРНО: 004200 (должен быть префикс 0x)

Параметр блока

Следующие методы имеют параметр блока:

Когда делаются запросы, которые опрашивают состояние Ethereum, предоставленный параметр блока определяет высоту блока.

Для параметра блока возможны следующие опции:

  • HEX String — целочисленный номер блока
  • String "earliest" для самого раннего/генезис-блока
  • String "latest" — для последнего предложенного блока
  • String "safe" — для последнего безопасного головного блока
  • String "finalized" — для последнего финализированного блока
  • String "pending" — для состояния/транзакций в ожидании

Примеры программ

На этой странице мы приводим примеры того, как использовать отдельные конечные точки JSON_RPC API с помощью инструмента командной строки curl (opens in a new tab). Эти отдельные примеры конечных точек находятся ниже в разделе Примеры Curl. Далее на странице мы также приводим сквозной пример для компиляции и развертывания смарт-контракта с использованием узла Geth, JSON_RPC API и curl.

Примеры Curl

Ниже приведены примеры использования JSON_RPC API путем выполнения запросов curl (opens in a new tab) к узлу Ethereum. Каждый пример включает в себя описание конкретного эндпоинта, его параметров, возвращаемого типа и пример использованя.

Запросы curl могут возвращать сообщение об ошибке, относящееся к типу содержимого. Это связано с тем, что опция --data устанавливает тип содержимого на application/x-www-form-urlencoded. Если ваш узел жалуется на это, установите заголовок вручную, поместив -H "Content-Type: application/json" в начало вызова. Примеры также не включают комбинацию URL/IP и порта, которая должна быть последним аргументом, передаваемым в curl (например, 127.0.0.1:8545). Полный запрос curl, включающий эти дополнительные данные, выглядит так:

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

Gossip, Состояние, История

Несколько основных методов JSON-RPC требуют данных из сети Ethereum и четко делятся на три основные категории: Gossip, Состояние и История. Воспользуйтесь ссылками в этих разделах, чтобы перейти к каждому из методов, или воспользуйтесь оглавлением, чтобы посмотреть список всех методов.

Gossip-методы

Эти методы отслеживают голову цепочки. С их помощью транзакции распространяются по сети, группируются в блоки и клиенты узнают о новых блоках.

Методы состояния

Методы, которые сообщают о текущем состоянии всех сохраненных данных. "Состояние" похоже на один большой разделяемый фрагмент оперативной памяти и включает в себя балансы аккаунтов, данные контрактов и оценки расхода газа.

Методы истории

Извлекает исторические записи о каждом блоке вплоть до генезис блока. Это похоже на большой файл, к которому можно лишь добавлять новую информацию, и включает в себя все заголовки блоков, тела блоков, блоков-дядей и результаты транзакций.

Песочница JSON-RPC API

Вы можете использовать инструмент-песочницу (opens in a new tab), чтобы изучить и опробовать методы API. Он также показывает, какие методы и сети поддерживаются различными поставщиками узлов.

Методы JSON-RPC API

web3_clientVersion

Возвращает текущую версию клиента.

Параметры

Нет

Возвращает

String — текущая версия клиента

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'
3// Результат
4{
5 "id":67,
6 "jsonrpc":"2.0",
7 "result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1"
8}

web3_sha3

Возвращает Keccak-256 (а не стандартизированный SHA3-256) для предоставленных данных.

Параметры

  1. DATA — данные для преобразования в хэш SHA3
1params: ["0x68656c6c6f20776f726c64"]

Возвращает

DATA — результат SHA3 для данной строки.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}'
3// Результат
4{
5 "id":64,
6 "jsonrpc": "2.0",
7 "result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"
8}

net_version

Возвращает идентификатор текущей сети.

Параметры

Нет

Возвращает

String — идентификатор текущей сети.

Полный список текущих идентификаторов сетей доступен на chainlist.org (opens in a new tab). Наиболее распространённые из них:

  • 1: основная сеть Ethereum
  • 11155111: тестовая сеть Sepolia
  • 560048: тестовая сеть Hoodi

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'
3// Результат
4{
5 "id":67,
6 "jsonrpc": "2.0",
7 "result": "3"
8}

net_listening

Возвращает true, если клиент активно прослушивает сетевые подключения.

Параметры

Нет

Возвращает

Booleantrue при прослушивании, в противном случае false.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}'
3// Результат
4{
5 "id":67,
6 "jsonrpc":"2.0",
7 "result":true
8}

net_peerCount

Возвращает количество соседних узлов, подключённых к клиенту в текущий момент.

Параметры

Нет

Возвращает

QUANTITY — целочисленное количество подключенных пиров.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'
3// Результат
4{
5 "id":74,
6 "jsonrpc": "2.0",
7 "result": "0x2" // 2
8}

eth_protocolVersion

Возвращает текущую версию протокола Эфириум. Обратите внимание, что этот метод недоступен в Geth (opens in a new tab).

Параметры

Нет

Возвращает

String — текущая версия протокола Ethereum

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}'
3// Результат
4{
5 "id":67,
6 "jsonrpc": "2.0",
7 "result": "54"
8}

eth_syncing

Возвращает объект с данными о статусе синхронизации или false.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

Нет

Возвращает

Точные возвращаемые данные различаются в разных реализациях клиентов. Все клиенты возвращают False, когда узел не синхронизируется, и все клиенты возвращают следующие поля.

Object|Boolean, объект с данными о статусе синхронизации или FALSE, когда нет синхронизации:

  • startingBlock: QUANTITY — блок, с которого начался импорт (будет сброшен только после того, как синхронизация достигнет его головы)
  • currentBlock: QUANTITY — текущий блок, то же, что и eth_blockNumber
  • highestBlock: QUANTITY — предполагаемый самый высокий блок

Однако отдельные клиенты могут также предоставлять дополнительные данные. Например, Geth возвращает следующее:

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}
Показать все

В то время как Besu возвращает:

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}
Показать все

За более подробной информацией обратитесь к документации вашего конкретного клиента.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": {
8 startingBlock: '0x384',
9 currentBlock: '0x386',
10 highestBlock: '0x454'
11 }
12}
13// Или когда не синхронизируется
14{
15 "id":1,
16 "jsonrpc": "2.0",
17 "result": false
18}
Показать все

eth_coinbase

Возвращает текущий адрес coinbase.

Попробовать конечную точку в песочнице (opens in a new tab)

Примечание: этот метод был признан устаревшим в версии v1.14.0 и больше не поддерживается. Попытка использовать этот метод приведет к ошибке «Method not supported».

Параметры

Нет

Возвращает

DATA, 20 байт — текущий адрес coinbase.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}'
3// Результат
4{
5 "id":64,
6 "jsonrpc": "2.0",
7 "result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1"
8}

eth_chainId

Возвращает идентификатор сети, используемый для подписи защищённых от повторения транзакций.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

Нет

Возвращает

chainId, шестнадцатеричное значение в виде строки, представляющее собой целое число — идентификатор текущей цепи.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}'
3// Результат
4{
5 "id":67,
6 "jsonrpc": "2.0",
7 "result": "0x1"
8}

eth_mining

Возвращает true, если клиент активно майнит новые блоки. Этот метод может вернуть true только для сетей с доказательством работы и может быть недоступен в некоторых клиентах после Слияния.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

Нет

Возвращает

Boolean — возвращает true, если клиент занимается майнингом, в противном случае false.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}'
3//
4{
5 "id":71,
6 "jsonrpc": "2.0",
7 "result": true
8}

eth_hashrate

Возвращает количество хешей в секунду, с которым узел майнит. Этот метод может вернуть true только для сетей с доказательством работы и может быть недоступен в некоторых клиентах после Слияния.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

Нет

Возвращает

QUANTITY — количество хэшей в секунду.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}'
3// Результат
4{
5 "id":71,
6 "jsonrpc": "2.0",
7 "result": "0x38a"
8}

eth_gasPrice

Возвращает оценку текущей цены за газ в wei. Например, клиент Besu по умолчанию проверяет последние 100 блоков и возвращает медианную цену за единицу газа.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

Нет

Возвращает

QUANTITY — целочисленное значение текущей цены на газ в wei.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}'
3// Результат
4{
5 "id":73,
6 "jsonrpc": "2.0",
7 "result": "0x1dfd14000" // 8049999872 Wei
8}

eth_accounts

Возвращает список адресов, принадлежащих клиенту.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

Нет

Возвращает

Массив DATA, 20 байт — адреса, принадлежащие клиенту.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]
8}

eth_blockNumber

Возвращает номер самого последнего блока.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

Нет

Возвращает

QUANTITY — целочисленное значение номера текущего блока, на котором находится клиент.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'
3// Результат
4{
5 "id":83,
6 "jsonrpc": "2.0",
7 "result": "0x4b7" // 1207
8}

eth_getBalance

Возвращает баланс счета по заданному адресу.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 20 байт — адрес для проверки баланса.
  2. QUANTITY|TAG — целочисленный номер блока или строка "latest", "earliest", "pending", "safe" или "finalized", см. параметр блока
1params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]

Возвращает

QUANTITY — целочисленное значение текущего баланса в wei.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x0234c8a3397aab58" // 158972490234375000
8}

eth_getStorageAt

Возвращает значение из ячейки хранилища по указанному адресу.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 20 байт — адрес хранилища.
  2. QUANTITY — целое число, обозначающее позицию в хранилище.
  3. QUANTITY|TAG — целочисленный номер блока или строка "latest", "earliest", "pending", "safe" или "finalized", см. параметр блока

Возвращает

DATA — значение в этой позиции хранилища.

Пример Вычисление правильной позиции зависит от извлекаемого хранилища. Рассмотрим следующий контракт, развернутый по адресу 0x295a70b2de5e3953354a6a8344e616ed314d7251 с адреса 0x391694e7e0b0cce554cb130d723a9d27458f9298.

1contract Storage {
2 uint pos0;
3 mapping(address => uint) pos1;
4 constructor() {
5 pos0 = 1234;
6 pos1[msg.sender] = 5678;
7 }
8}

Получить значение pos0 просто:

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

Извлечь элемент из хеш-таблицы (mapping) сложнее. Позиция элемента в mapping вычисляется так:

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

Это означает, что, чтобы извлечь значение хранилища pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"], нам необходимо посчитать позицию при помощи:

1keccak(
2 decodeHex(
3 "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" +
4 "0000000000000000000000000000000000000000000000000000000000000001"
5 )
6)

Консоль geth, идущая с библиотекой web3, может быть использована для вычисления:

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

Теперь, чтобы извлечь значение из хранилища:

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

eth_getTransactionCount

Возвращает количество транзакций, отправленных с адреса.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 20 байт — адрес.
  2. QUANTITY|TAG — целочисленный номер блока или строка "latest", "earliest", "pending", "safe" или "finalized", см. параметр блока
1params: [
2 "0x407d73d8a49eeb85d32cf465507dd71d507100c1",
3 "latest", // состояние на последнем блоке
4]

Возвращает

QUANTITY — целочисленное значение количества транзакций, отправленных с этого адреса.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x1" // 1
8}

eth_getBlockTransactionCountByHash

Возвращает количество транзакций в блоке из блока с заданным хешем.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 32 байта — хэш блока
1params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]

Возвращает

QUANTITY — целое число, обозначающее количество транзакций в этом блоке.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x8b" // 139
8}

eth_getBlockTransactionCountByNumber

Возвращает количество транзакций в блоке с заданным номером блока.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. QUANTITY|TAG — целое число, номер блока или строка "earliest", "latest", "pending", "safe" или "finalized", как в параметре блока.
1params: [
2 "0x13738ca", // 20396234
3]

Возвращает

QUANTITY — целое число, обозначающее количество транзакций в этом блоке.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x8b" // 139
8}

eth_getUncleCountByBlockHash

Возвращает количество блоков-дядей для блока с данным хешем.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 32 байта — хэш блока
1params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]

Возвращает

QUANTITY — количество дядей в этом блоке.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x1" // 1
8}

eth_getUncleCountByBlockNumber

Возвращает количество блоков-дядей для блока с данным номером.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. QUANTITY|TAG — целочисленный номер блока или строка "latest", "earliest", "pending", "safe" или "finalized", см. параметр блока
1params: [
2 "0xe8", // 232
3]

Возвращает

QUANTITY — количество дядей в этом блоке.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x0" // 0
8}

eth_getCode

Возвращает код по заданному адресу.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 20 байт — адрес
  2. QUANTITY|TAG — целочисленный номер блока или строка "latest", "earliest", "pending", "safe" или "finalized", см. параметр блока
1params: [
2 "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
3 "0x5daf3b", // 6139707
4]

Возвращает

DATA — код по заданному адресу.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"
8}

eth_sign

Метод sign вычисляет специфичную для Ethereum подпись с помощью: sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))).

Добавление префикса к сообщению позволяет распознать подпись как специфичную для Эфириум. Это предотвращает неправомерное использование, когда вредоносное децентрализованное приложение может подписывать произвольные данные (например, транзакцию) и использовать подпись для выдачи себя за жертву.

Примечание: адрес для подписи должен быть разблокирован.

Параметры

  1. DATA, 20 байт — адрес
  2. DATA, N байт — сообщение для подписи

Возвращает

DATA: подпись

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
8}

eth_signTransaction

Подписывает транзакцию, которая может быть позже отправлена в сеть с помощью eth_sendRawTransaction.

Параметры

  1. Object — объект транзакции
  • type:
  • from: DATA, 20 байт — адрес, с которого отправляется транзакция.
  • to: DATA, 20 байт — (необязательно при создании нового контракта) адрес, на который направлена транзакция.
  • gas: QUANTITY — (необязательно, по умолчанию: 90000) целое число, обозначающее количество газа, предоставленного на выполнение транзакции. Неиспользованный газ будет возвращён.
  • gasPrice: QUANTITY — (необязательно, по умолчанию: будет определено) целое число, обозначающее gasPrice для каждой затраченной единицы газа, в Wei.
  • value: QUANTITY — (необязательно) целое число, обозначающее значение, отправленное вместе с этой транзакцией, в Wei.
  • data: DATA — скомпилированный код контракта ИЛИ хэш сигнатуры вызываемой функции и закодированные параметры.
  • nonce: QUANTITY — (необязательно) целое число одноразового номера. Это позволяет перезаписать ваши незавершённые транзакции, использовав один и тот же одноразовый номер.

Возвращает

DATA, объект транзакции, закодированный в RLP и подписанный указанным аккаунтом.

Пример

1// Запрос
2curl -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// Результат
4{
5 "id": 1,
6 "jsonrpc": "2.0",
7 "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
8}

eth_sendTransaction

Создает новую транзакцию с вызовом сообщения или созданием контракта, если поле data содержит код, и подписывает ее с помощью аккаунта, указанного в from.

Параметры

  1. Object — объект транзакции
  • from: DATA, 20 байт — адрес, с которого отправляется транзакция.
  • to: DATA, 20 байт — (необязательно при создании нового контракта) адрес, на который направлена транзакция.
  • gas: QUANTITY — (необязательно, по умолчанию: 90000) целое число, обозначающее количество газа, предоставленного на выполнение транзакции. Неиспользованный газ будет возвращён.
  • gasPrice: QUANTITY — (необязательно, по умолчанию: будет определено) целое число, обозначающее gasPrice для каждой затраченной единицы газа.
  • value: QUANTITY — (необязательно) целое число, обозначающее значение, отправленное вместе с этой транзакцией.
  • input: DATA — скомпилированный код контракта ИЛИ хэш сигнатуры вызываемой функции и закодированные параметры.
  • nonce: QUANTITY — (необязательно) целое число одноразового номера. Это позволяет перезаписать ваши незавершённые транзакции, использовав один и тот же одноразовый номер.
1params: [
2 {
3 from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
4 to: "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
5 gas: "0x76c0", // 30400
6 gasPrice: "0x9184e72a000", // 10000000000000
7 value: "0x9184e72a", // 2441406250
8 input:
9 "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
10 },
11]
Показать все

Возвращает

DATA, 32 байта — хэш транзакции или нулевой хэш, если транзакция еще недоступна.

Используйте eth_getTransactionReceipt, чтобы получить адрес контракта после того, как транзакция была предложена в блоке, когда вы создавали контракт.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
8}

eth_sendRawTransaction

Создаёт новую транзакцию с вызовом или развертывает контракт, используя подписанную транзакцию.

Параметры

  1. DATA, подписанные данные транзакции.
1params: [
2 "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
3]

Возвращает

DATA, 32 байта — хэш транзакции или нулевой хэш, если транзакция еще недоступна.

Используйте eth_getTransactionReceipt, чтобы получить адрес контракта после того, как транзакция была предложена в блоке, когда вы создавали контракт.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
8}

eth_call

Немедленно выполняет новый вызов сообщения без создания транзакции в блокчейне. Часто используется для выполнения функций смарт-контрактов, доступных только для чтения, например, balanceOf для контракта ERC-20.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. Object — объект вызова транзакции
  • from: DATA, 20 байт — (необязательно) адрес, с которого отправляется транзакция.
  • to: DATA, 20 байт — адрес, на который направлена транзакция.
  • gas: QUANTITY — (необязательно) целое число, обозначающее количество газа, предоставленного на выполнение транзакции. eth_call не потребляет газ, но этот параметр может быть необходим некоторым контрактам.
  • gasPrice: QUANTITY — (необязательно) целое число, обозначающее gasPrice для каждой затраченной единицы газа
  • value: QUANTITY — (необязательно) целое число, обозначающее значение, отправленное вместе с этой транзакцией
  • input: DATA — (необязательно) хэш сигнатуры метода и закодированные параметры. Для получения подробной информации см. ABI контракта Ethereum в документации Solidity (opens in a new tab).
  1. QUANTITY|TAG — целочисленный номер блока или строка "latest", "earliest", "pending", "safe" или "finalized", см. параметр блока

Возвращает

DATA — возвращаемое значение исполненного контракта.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x"
8}

eth_estimateGas

Генерирует и возвращает оценку того, сколько газа необходимо для выполнения транзакции. Транзакция не будет добавлена в блокчейн. Обратите внимание, что оценочное значение может быть значительно больше, чем количество газа, фактически использованного транзакцией, по целому ряду причин, включая особенности EVM и производительность узла.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

См. параметры eth_call, за исключением того, что все свойства являются необязательными. Если лимит газа не указан, geth использует лимит газа блока из ожидающего рассмотрения блока в качестве верхней границы. В результате возвращенной оценки может оказаться недостаточно для выполнения вызова/транзакции, когда количество газа превышает лимит газа в ожидающем блоке.

Возвращает

QUANTITY — количество использованного газа.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x5208" // 21000
8}

eth_getBlockByHash

Возвращает информацию о блоке по хэшу.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 32 байта — хэш блока.
  2. Boolean — если true, возвращает полные объекты транзакций, если false — только хэши транзакций.
1params: [
2 "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
3 false,
4]

Возвращает

Object — объект блока или null, если блок не найден:

  • number: QUANTITY — номер блока. null, когда блок находится в состоянии ожидания.
  • hash: DATA, 32 байта — хэш блока. null, когда блок находится в состоянии ожидания.
  • parentHash: DATA, 32 байта — хэш родительского блока.
  • nonce: DATA, 8 байт — хэш сгенерированного доказательства выполнения работы. null, когда блок находится в состоянии ожидания, 0x0 для блоков с доказательством доли владения (после Слияния).
  • sha3Uncles: DATA, 32 байта — SHA3 данных о блоках-дядях в этом блоке.
  • logsBloom: DATA, 256 байт — фильтр Блума для журналов блока. null, когда блок находится в состоянии ожидания.
  • transactionsRoot: DATA, 32 байта — корень дерева транзакций блока.
  • stateRoot: DATA, 32 байта — корень конечного дерева состояний блока.
  • receiptsRoot: DATA, 32 байта — корень дерева квитанций блока.
  • miner: DATA, 20 байт — адрес получателя, которому были переданы вознаграждения за блок.
  • difficulty: QUANTITY — целое число, обозначающее сложность этого блока.
  • totalDifficulty: QUANTITY — целое число, обозначающее общую сложность цепи до этого блока.
  • extraData: DATA — поле «дополнительные данные» этого блока.
  • size: QUANTITY — целое число, размер этого блока в байтах.
  • gasLimit: QUANTITY — максимальное количество газа, разрешенное в этом блоке.
  • gasUsed: QUANTITY — общее количество газа, использованное всеми транзакциями в этом блоке.
  • timestamp: QUANTITY — временная метка unix, когда блок был сопоставлен.
  • transactions: Массив — массив объектов транзакций или 32-байтных хэшей транзакций в зависимости от последнего заданного параметра.
  • uncles: Массив — массив хэшей дядей.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}'
3// Результат
4{
5 "jsonrpc": "2.0",
6 "id": 1,
7 "result": {
8 "difficulty": "0x4ea3f27bc",
9 "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32",
10 "gasLimit": "0x1388",
11 "gasUsed": "0x0",
12 "hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
13 "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
14 "miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171",
15 "mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843",
16 "nonce": "0x689056015818adbe",
17 "number": "0x1b4",
18 "parentHash": "0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54",
19 "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
20 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
21 "size": "0x220",
22 "stateRoot": "0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d",
23 "timestamp": "0x55ba467c",
24 "totalDifficulty": "0x78ed983323d",
25 "transactions": [
26 ],
27 "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
28 "uncles": [
29 ]
30 }
31}
Показать все

eth_getBlockByNumber

Возвращает информацию о блоке по его номеру.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. QUANTITY|TAG — целое число, номер блока или строка "earliest", "latest", "pending", "safe" или "finalized", как в параметре блока.
  2. Boolean — если true, возвращает полные объекты транзакций, если false — только хэши транзакций.
1params: [
2 "0x1b4", // 436
3 true,
4]

Возвращает См. eth_getBlockByHash

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'

Результат см. в eth_getBlockByHash

eth_getTransactionByHash

Возвращает информацию о транзакции по её хешу.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 32 байта — хэш транзакции
1params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"]

Возвращает

Object — объект транзакции или null, если транзакция не найдена:

  • blockHash: DATA, 32 байта — хэш блока, в котором находилась эта транзакция. null, когда она находится в состоянии ожидания.
  • blockNumber: QUANTITY — номер блока, в котором находилась эта транзакция. null, когда она находится в состоянии ожидания.
  • from: DATA, 20 байт — адрес отправителя.
  • gas: QUANTITY — газ, предоставленный отправителем.
  • gasPrice: QUANTITY — цена на газ, предоставленная отправителем в Wei.
  • hash: DATA, 32 байта — хэш транзакции.
  • input: DATA — данные, отправленные вместе с транзакцией.
  • nonce: QUANTITY — количество транзакций, совершенных отправителем до этой.
  • to: DATA, 20 байт — адрес получателя. null, когда это транзакция создания контракта.
  • transactionIndex: QUANTITY — целое число, обозначающее позицию индекса транзакций в блоке. null, когда она находится в состоянии ожидания.
  • value: QUANTITY — переданное значение в Wei.
  • v: QUANTITY — идентификатор восстановления ECDSA
  • r: QUANTITY — подпись ECDSA r
  • s: QUANTITY — подпись ECDSA s

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}'
3// Результат
4{
5 "jsonrpc":"2.0",
6 "id":1,
7 "result":{
8 "blockHash":"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
9 "blockNumber":"0x5daf3b", // 6139707
10 "from":"0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",
11 "gas":"0xc350", // 50000
12 "gasPrice":"0x4a817c800", // 20000000000
13 "hash":"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
14 "input":"0x68656c6c6f21",
15 "nonce":"0x15", // 21
16 "to":"0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",
17 "transactionIndex":"0x41", // 65
18 "value":"0xf3dbb76162000", // 4290000000000000
19 "v":"0x25", // 37
20 "r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",
21 "s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c"
22 }
23}
Показать все

eth_getTransactionByBlockHashAndIndex

Возвращает информацию о транзакции по хешу блока и индексу транзакции в блоке.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 32 байта — хэш блока.
  2. QUANTITY — целое число, обозначающее позицию индекса транзакции.
1params: [
2 "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
3 "0x0", // 0
4]

Возвращает См. eth_getTransactionByHash

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'

Результат см. в eth_getTransactionByHash

eth_getTransactionByBlockNumberAndIndex

Возвращает информацию о транзакции по номеру блока и индексу транзакции в блоке.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. QUANTITY|TAG — номер блока или строка "earliest", "latest", "pending", "safe" или "finalized", как в параметре блока.
  2. QUANTITY — целочисленное значение индекса транзакции.
1params: [
2 "0x9c47cf", // 10241999
3 "0x24", // 36
4]

Возвращает См. eth_getTransactionByHash

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}'

Результат см. в eth_getTransactionByHash

eth_getTransactionReceipt

Возвращает квитанцию транзакции по хешу транзакции.

Примечание: квитанция недоступна для транзакций, находящихся в состоянии ожидания.

Параметры

  1. DATA, 32 байта — хэш транзакции
1params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"]

Возвращает Object — объект квитанции транзакции или null, если квитанция не найдена:

  • transactionHash : DATA, 32 байта — хэш транзакции.
  • transactionIndex: QUANTITY — целое число, обозначающее позицию индекса транзакций в блоке.
  • blockHash: DATA, 32 байта — хэш блока, в котором находилась эта транзакция.
  • blockNumber: QUANTITY — номер блока, в котором находилась эта транзакция.
  • from: DATA, 20 байт — адрес отправителя.
  • to: DATA, 20 байт — адрес получателя. null, когда это транзакция развёртывания контракта.
  • cumulativeGasUsed : QUANTITY — общее количество газа, использованного при выполнении этой транзакции в блоке.
  • effectiveGasPrice : QUANTITY — сумма базовой комиссии и чаевых, уплаченных за единицу газа.
  • gasUsed : QUANTITY — количество газа, использованное только этой конкретной транзакцией.
  • contractAddress : DATA, 20 байт — созданный адрес контракта, если транзакция была созданием контракта, в противном случае null.
  • logs: Массив — массив объектов журнала, которые сгенерировала эта транзакция.
  • logsBloom: DATA, 256 байт — фильтр Блума для легких клиентов для быстрого извлечения связанных журналов.
  • type: QUANTITY — целое число, тип транзакции, 0x0 для устаревших транзакций, 0x1 для типов списков доступа, 0x2 для динамических комиссий.

Он также возвращает один из :

  • root : DATA 32 байта корня состояния после транзакции (до Византии)
  • status: QUANTITY либо 1 (успех), либо 0 (неудача)

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}'
3// Результат
4{
5 "jsonrpc": "2.0",
6 "id": 1,
7 "result": {
8 "blockHash":
9 "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3",
10 "blockNumber": "0xeff35f",
11 "contractAddress": null, // строка адреса, если он был создан
12 "cumulativeGasUsed": "0xa12515",
13 "effectiveGasPrice": "0x5a9c688d4",
14 "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7",
15 "gasUsed": "0xb4c8",
16 "logs": [{
17 // журналы, возвращаемые getFilterLogs и т. д.
18 }],
19 "logsBloom": "0x00...0", // 256-байтовый фильтр блума
20 "status": "0x1",
21 "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
22 "transactionHash":
23 "0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5",
24 "transactionIndex": "0x66",
25 "type": "0x2"
26 }
27}
Показать все

eth_getUncleByBlockHashAndIndex

Возвращает информацию о дяде блока по хэшу и позиции индекса дяди.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. DATA, 32 байта — хэш блока.
  2. QUANTITY — позиция индекса дяди.
1params: [
2 "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
3 "0x0", // 0
4]

Возвращает См. eth_getBlockByHash

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'

Результат см. в eth_getBlockByHash

Примечание: дядя не содержит отдельных транзакций.

eth_getUncleByBlockNumberAndIndex

Возвращает информацию о дяде блока по номеру и позиции индекса дяди.

Попробовать конечную точку в песочнице (opens in a new tab)

Параметры

  1. QUANTITY|TAG — номер блока или строка "earliest", "latest", "pending", "safe" или "finalized", как в параметре блока.
  2. QUANTITY — индекс блока-дяди.
1params: [
2 "0x29c", // 668
3 "0x0", // 0
4]

Возвращает См. eth_getBlockByHash

Примечание: дядя не содержит отдельных транзакций.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}'

Результат см. в eth_getBlockByHash

eth_newFilter

Создает объект фильтра на основе параметров фильтра для уведомления об изменении состояния (логи). Чтобы проверить, изменилось ли состояние, вызовите eth_getFilterChanges.

Примечание по указанию фильтров тем: Темы зависят от порядка. Транзакция с логом с темами [A, B] будет подходить под следующие фильтры тем:

  • [] «что угодно»
  • [A] «A на первой позиции (и что угодно после)»
  • [null, B] «что угодно на первой позиции И B на второй позиции (и что угодно после)»
  • [A, B] «A на первой позиции И B на второй позиции (и что угодно после)»
  • [[A, B], [A, B]] «(A ИЛИ B) на первой позиции И (A ИЛИ B) на второй позиции (и что угодно после)»
  • Параметры
  1. Object — параметры фильтра:
  • fromBlock: QUANTITY|TAG — (необязательно, по умолчанию: "latest") целочисленный номер блока или "latest" для последнего предложенного блока, "safe" для последнего безопасного блока, "finalized" для последнего финализированного блока, или "pending", "earliest" для транзакций, еще не включенных в блок.
  • toBlock: QUANTITY|TAG — (необязательно, по умолчанию: "latest") целочисленный номер блока или "latest" для последнего предложенного блока, "safe" для последнего безопасного блока, "finalized" для последнего финализированного блока, или "pending", "earliest" для транзакций, еще не включенных в блок.
  • address: DATA|Массив, 20 байт — (необязательно) адрес контракта или список адресов, из которых должны исходить журналы.
  • topics: Массив DATA — (необязательно) массив 32-байтных DATA тем. Темы зависят от порядка. Каждая тема может также быть массивом данных с параметрами "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]
Показать все

Возвращает QUANTITY — идентификатор фильтра.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x1" // 1
8}

eth_newBlockFilter

Создает фильтр в узле, который уведомляет о достижении нового блока. Чтобы проверить, изменилось ли состояние, вызовите eth_getFilterChanges.

Параметры Нет

Возвращает QUANTITY — идентификатор фильтра.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x1" // 1
8}

eth_newPendingTransactionFilter

Создает фильтр в узле, который уведомляет о поступлении новых ожидающих подтверждения транзакций. Чтобы проверить, изменилось ли состояние, вызовите eth_getFilterChanges.

Параметры Нет

Возвращает QUANTITY — идентификатор фильтра.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": "0x1" // 1
8}

eth_uninstallFilter

Удаляет фильтр с заданным идентификатором. Всегда следует вызывать, когда наблюдение больше не нужно. Кроме того, время ожидания фильтров истекает, если они не запрашиваются с помощью eth_getFilterChanges в течение определенного периода времени.

Параметры

  1. QUANTITY — идентификатор фильтра.
1params: [
2 "0xb", // 11
3]

Возвращает Booleantrue, если фильтр был успешно удален, в противном случае false.

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}'
3// Результат
4{
5 "id":1,
6 "jsonrpc": "2.0",
7 "result": true
8}

eth_getFilterChanges

Метод опроса фильтра, возвращающий массив логов, которые произошли с момента последнего опроса.

Параметры

  1. QUANTITY — идентификатор фильтра.
1params: [
2 "0x16", // 22
3]

Возвращает Массив — массив объектов журнала или пустой массив, если с момента последнего опроса ничего не изменилось.

  • Для фильтров, созданных с помощью eth_newBlockFilter, возвращаются хэши блоков (DATA, 32 байта), например, ["0x3454645634534..."].

  • Для фильтров, созданных с помощью eth_newPendingTransactionFilter , возвращаются хэши транзакций (DATA, 32 байта), например, ["0x6345343454645..."].

  • Для фильтров, созданных с помощью eth_newFilter, журналы являются объектами со следующими параметрами:

    • removed: TAGtrue, когда журнал был удален из-за реорганизации цепи. false, если это действительный журнал.
    • logIndex: QUANTITY — целое число, обозначающее позицию индекса журнала в блоке. null, когда журнал находится в состоянии ожидания.
    • transactionIndex: QUANTITY — целое число, обозначающее позицию индекса транзакций, из которой был создан журнал. null, когда журнал находится в состоянии ожидания.
    • transactionHash: DATA, 32 байта — хэш транзакций, из которых был создан этот журнал. null, когда журнал находится в состоянии ожидания.
    • blockHash: DATA, 32 байта — хэш блока, в котором находился этот журнал. null, когда она находится в состоянии ожидания. null, когда журнал находится в состоянии ожидания.
    • blockNumber: QUANTITY — номер блока, в котором находился этот журнал. null, когда она находится в состоянии ожидания. null, когда журнал находится в состоянии ожидания.
    • address: DATA, 20 байт — адрес, из которого возник этот журнал.
    • data: DATA — неиндексированные данные журнала переменной длины. (В solidity: ноль или более 32-байтных неиндексированных аргументов журнала.)
    • topics: Массив DATA — массив от 0 до 4 32-байтных DATA индексированных аргументов журнала. (В solidity: первая тема — это хэш подписи события (например, Deposit(address,bytes32,uint256)), за исключением случаев, когда вы объявили событие с помощью спецификатора anonymous.)
  • Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'
3// Результат
4{
5 "id":1,
6 "jsonrpc":"2.0",
7 "result": [{
8 "logIndex": "0x1", // 1
9 "blockNumber":"0x1b4", // 436
10 "blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
11 "transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
12 "transactionIndex": "0x0", // 0
13 "address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
14 "data":"0x0000000000000000000000000000000000000000000000000000000000000000",
15 "topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"]
16 },{
17 ...
18 }]
19}
Показать все

eth_getFilterLogs

Возвращает массив всех логов, соответствующих фильтру с заданным идентификатором.

Параметры

  1. QUANTITY — идентификатор фильтра.
1params: [
2 "0x16", // 22
3]

Возвращает См. eth_getFilterChanges

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}'

Результат см. в eth_getFilterChanges

eth_getLogs

Возвращает массив всех логов, соответствующих заданному объекту фильтра.

Параметры

  1. Object — параметры фильтра:
  • fromBlock: QUANTITY|TAG — (необязательно, по умолчанию: "latest") целочисленный номер блока или "latest" для последнего предложенного блока, "safe" для последнего безопасного блока, "finalized" для последнего финализированного блока, или "pending", "earliest" для транзакций, еще не включенных в блок.
  • toBlock: QUANTITY|TAG — (необязательно, по умолчанию: "latest") целочисленный номер блока или "latest" для последнего предложенного блока, "safe" для последнего безопасного блока, "finalized" для последнего финализированного блока, или "pending", "earliest" для транзакций, еще не включенных в блок.
  • address: DATA|Массив, 20 байт — (необязательно) адрес контракта или список адресов, из которых должны исходить журналы.
  • topics: Массив DATA — (необязательно) массив 32-байтных DATA тем. Темы зависят от порядка. Каждая тема может также быть массивом данных с параметрами "or".
  • blockHash: DATA, 32 байта — (необязательно, будет в будущем) с добавлением EIP-234, blockHash станет новым параметром фильтра, который ограничивает возвращаемые журналы одним блоком с 32-байтным хэшем blockHash. Использование blockHash эквивалентно fromBlock = toBlock = номеру блока с хэшем blockHash. Если blockHash присутствует в критериях фильтра, то ни fromBlock, ни toBlock не допускаются.
1params: [
2 {
3 topics: [
4 "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
5 ],
6 },
7]

Возвращает См. eth_getFilterChanges

Пример

1// Запрос
2curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}'

Результат см. в eth_getFilterChanges

Пример использования

Развертывание контракта с использованием JSON_RPC

Этот раздел включает демонстрацию того, как развернуть контракт, используя только RPC интерфейс. Существуют альтернативные способы развертывания контрактов, где эта сложность абстрагирована, — например, с использованием библиотек, построенных поверх интерфейса RPC, таких как web3.js (opens in a new tab) и web3.py (opens in a new tab). Эти абстракции, как правило, более легкие для понимания и менее подвержены ошибкам, но все равно полезно понимать, что происходит под капотом.

Ниже приведен простой смарт-контракт под названием Multiply7, который будет развернут с использованием интерфейса JSON-RPC на узле Ethereum. Это руководство предполагает, что читатель уже использует узел Geth. Дополнительную информацию об узлах и клиентах можно найти здесь. Пожалуйста, обратитесь к документации отдельного клиента, чтобы узнать, как запустить HTTP JSON-RPC для клиентов, отличных от Geth. Большинство клиентов по умолчанию обслуживают на 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}

Первое, что нужно сделать, это убедиться, что HTTP RPC интерфейс включен. Это означает, что мы предоставляем Geth флаг --http при запуске. В этом примере мы используем узел Geth в закрытой цепочке разработки. Используя этот подход, мы не нуждаемся в эфире, как в реальной сети.

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

Это запустит интерфейс HTTP RPC на http://localhost:8545.

Мы можем убедиться, что интерфейс работает, получив адрес coinbase (получив первый адрес из массива аккаунтов) и баланс с помощью curl (opens in a new tab). Пожалуйста, обратите внимание, что данные в этих примерах будут отличаться на Вашем локальном узле. Если Вы хотите попробовать эти команды, замените параметры во втором curl запросе на результат, возвращенный из первого.

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"}

Поскольку цифры закодированы в шестнадцатеричном формате, баланс будет возвращен в wei, как шестнадцатеричная строка. Если мы хотим иметь баланс в эфире, как число, мы можем использоватьWeb3 из консоли Geth.

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

Теперь, когда на нашей приватной цепочке развития есть немного эфира, мы можем развернуть контракт. Первый шаг - компиляция контракта Multiply7 в байт-код, который может быть отправлен на EVM. Чтобы установить solc, компилятор Solidity, следуйте документации Solidity (opens in a new tab). (Возможно, вы захотите использовать более старый выпуск solc, чтобы соответствовать версии компилятора, используемой в нашем примере (opens in a new tab).)

Следующий шаг — скомпилировать контракт Multiply7 в байт-код, который можно отправить в 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

Теперь, когда мы имеем скомпилированный код, нам нужно определить, сколько газа стоит его развертывание. Интерфейс RPC имеет метод eth_estimateGas, который даст нам оценку.

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"}

И, наконец, развернем контракт.

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"}

Транзакция принимается узлом, и хэш транзакции возвращается. Этот хэш может быть использован для отслеживания транзакции. Следующий шаг - определение адреса, где наш контракт развернут. Каждая выполненная транзакция создаст квитанцию. Эта квитанция содержит различную информацию о транзакции, например, в какой блок транзакция была включена и сколько газа было использовано EVM. Если транзакция создает контракт, она также будет содержать адрес контракта. Мы можем получить квитанцию с помощью метода 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"}}

Наш контракт был создан по адресу 0x4d03d617d700cf81935d7f797f4e2ae719648262. Результат null вместо квитанции означает, что транзакция еще не была включена в блок. Подождите немного, проверьте, запущен ли ваш клиент консенсуса, и повторите попытку.

Взаимодействие со смарт-контрактами

В этом примере мы отправим транзакцию с помощью eth_sendTransaction в метод multiply контракта.

eth_sendTransaction требует несколько аргументов, в частности from, to и data. From — это публичный адрес нашего аккаунта, а to — это адрес контракта. Аргумент data содержит полезную нагрузку, которая определяет, какой метод должен быть вызван и с какими аргументами. Именно здесь в игру вступает ABI (двоичный интерфейс приложения) (opens in a new tab). ABI - это JSON файл, который устанавливает, как определять и кодировать данные для EVM.

Байты полезной нагрузки определяют, какой метод в контракте вызван. Это первые 4 байта из хэша Keccak от имени функции и ее типов аргументов, закодированные в шестнадцатеричной форме. Функция multiply принимает значение uint, которое является псевдонимом uint256. Это оставляет нам:

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

Следующим шагом является кодирование аргументов. Существует только один uint256, скажем, значение 6. ABI имеет раздел, который определяет, как кодировать типы uint256.

int<M>: enc(X) — это кодирование X в прямом порядке байтов с дополнением до двух, дополненное со стороны старшего разряда (слева) значением 0xff для отрицательных X и нулевыми байтами для положительных X, так что длина становится кратной 32 байтам.

Это кодируется в 0000000000000000000000000000000000000000000000000000000000000006.

Объединив селектор функции и закодированный аргумент, мы получим данные 0xc6888fa10000000000000000000000000000000000000000000000000000000000000006.

Теперь это может быть отправлено на узел:

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"}

Так как транзакция была отправлена, был возвращен хэш транзакции. Получение квитанции дает:

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: 0
16 }],
17 transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",
18 transactionIndex: 0
19}
Показать все

Квитанция содержит журнал регистрации. Этот журнал был сгенерирован EVM при выполнении транзакции и включен в квитанцию. Функция multiply показывает, что событие Print было вызвано с входным значением, умноженным на 7. Поскольку аргументом для события Print был uint256, мы можем декодировать его в соответствии с правилами ABI, что даст нам ожидаемое десятичное число 42. Помимо данных, стоит отметить, что темы могут быть использованы для определения того, какое событие создало журнал:

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

Это было всего лишь краткое введение в некоторые наиболее распространенные задачи, демонстрирующее непосредственное использование JSON-RPC.

Была ли эта статья полезной?