Как запросить сумму вознаграждения за майнинг из определенного блока?

Я хочу написать скрипт для анализа вознаграждений за майнинг. Как лучше всего запросить сумму вознаграждения за майнинг определенного блока? Кажется возможным запросить адрес счастливого майнера:

web3.eth.getBlock(200).miner
"0xbb7b8287f3f0a933474a79eae42cbca977791171"

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

Ответы (2)

«Тогда я могу как-то зайти в аккаунт и выбрать транзакцию в определенном блоке».

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

В Ethereum нет входов и выходов, только изменения состояния и балансы. Таким образом, вознаграждение за майнинг не имеет хэша транзакции, поскольку оно не является транзакцией.

Вам нужно будет либо рассчитать вознаграждение самостоятельно, либо использовать чужой API.

Расчет вознаграждения самостоятельно

Алгоритм расчета вознаграждения, как указано на вики-странице майнинга , выглядит следующим образом:

Успешный майнер PoW победного блока получает:

  • Награда за статический блок за «выигрышный» блок, состоящая ровно из 5,0 эфира.
  • Весь газ, израсходованный в блоке, то есть весь газ, израсходованный на выполнение всех транзакций в блоке, представленном майнером-победителем, компенсируется отправителями. Понесенные расходы на газ зачисляются на счет майнера в рамках согласованного протокола. Ожидается, что со временем они превзойдут вознаграждение за статический блок.
  • Дополнительная награда за включение дядей в блок в виде дополнительной 1/32 за каждого включенного дядю.

Данные, необходимые для второй и третьей частей, можно запросить из блока, используя:

  • web3.eth.getBlock(<block>).gasUsed
  • web3.eth.getBlock(<block>).uncles(Примечание: награда за дядю составляет /32 от статической награды, т.е. 5/32.)

Использование чужого API

Etherscan — это один из обозревателей блоков, который включает подробную информацию о вознаграждении за данный блок (см . пример здесь ). Подробности об их API можно найти либо на их сайте , либо, для привязок Python, на этой странице GitHub. (Я не проверял, возвращают ли они детали вознаграждения, поэтому YMMV.)

РЕДАКТИРОВАТЬ : Статическая награда теперь составляет 3,0 эфира.

Было бы web3.eth.getBlock(<block>).gasUsedили web3.eth.getBlock(<block>).cumulativeGasUsed?
Просто .gasUsed. Посмотрите на возвращаемые значения для eth_getBlockByHash- вы увидите, что .gasUsedэто общая сумма для этого блока. .cumulativeGasUsedэто когда вы используете один из API транзакций (не API уровня блока) и вам нужна общая сумма для блока, в котором находится транзакция.
Спасибо, вы правы. Я смешивал getBlock()функцию с getTransactionReceipt()по какой-то причине. А за вознаграждение от дядьки-то чего хватило бы сделать numberOfUncles*5/32? Читая вики-страницу, там также говорится: «Дяди, включенные в блок, сформированный успешным майнером PoW, получают 7/8 вознаграждения за статический блок = 4,375 эфира. Максимум 2 дяди разрешены на блок».

В дополнение к ответу Ричарда, с точки зрения API, вознаграждение за блок также может быть trace_blockполучено из метода JSON RPC API непосредственно из узла OpenEthereum/NethmindETH/Erigon RPC, если такой API включен.

Он должен быть в "result[i]" => "action" => "value"элементе i из ответа, который имеет "type": "reward". Следует отметить, что может быть несколько элементов с rewardтипом, например, если настроен блочный контракт вознаграждения .

Пример ответа от trace_blockAPI.

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": [
        ...
        {
        "action": {
            "author": "0x646db8ffc21e7ddc2b6327448dd9fa560df41087",
            "rewardType": "block",
            "value": "0x1bc16d674ec80000"
        },
        "blockHash": "0xdcd887d9301d279c4754df78c6b69f26d2839b12201b0b337bc2512d015682b5",
        "blockNumber": 14621621,
        "result": null,
        "subtraces": 0,
        "traceAddress": [],
        "type": "reward"
    }]
}