Я хочу написать скрипт для анализа вознаграждений за майнинг. Как лучше всего запросить сумму вознаграждения за майнинг определенного блока? Кажется возможным запросить адрес счастливого майнера:
web3.eth.getBlock(200).miner
"0xbb7b8287f3f0a933474a79eae42cbca977791171"
Тогда я могу как-то покопаться в аккаунте и выбрать транзакцию в определенном блоке. Это лучший способ? Или вы знаете короткие пути? И как это сделать?
«Тогда я могу как-то зайти в аккаунт и выбрать транзакцию в определенном блоке».
Награды за майнинг не являются транзакциями, поэтому вы не можете запрашивать их обычным способом. Согласно этому предыдущему ответу:
В Ethereum нет входов и выходов, только изменения состояния и балансы. Таким образом, вознаграждение за майнинг не имеет хэша транзакции, поскольку оно не является транзакцией.
Вам нужно будет либо рассчитать вознаграждение самостоятельно, либо использовать чужой API.
Алгоритм расчета вознаграждения, как указано на вики-странице майнинга , выглядит следующим образом:
Успешный майнер PoW победного блока получает:
- Награда за статический блок за «выигрышный» блок, состоящая ровно из 5,0 эфира.
- Весь газ, израсходованный в блоке, то есть весь газ, израсходованный на выполнение всех транзакций в блоке, представленном майнером-победителем, компенсируется отправителями. Понесенные расходы на газ зачисляются на счет майнера в рамках согласованного протокола. Ожидается, что со временем они превзойдут вознаграждение за статический блок.
- Дополнительная награда за включение дядей в блок в виде дополнительной 1/32 за каждого включенного дядю.
Данные, необходимые для второй и третьей частей, можно запросить из блока, используя:
web3.eth.getBlock(<block>).gasUsed
web3.eth.getBlock(<block>).uncles
(Примечание: награда за дядю составляет /32 от статической награды, т.е. 5/32.)Etherscan — это один из обозревателей блоков, который включает подробную информацию о вознаграждении за данный блок (см . пример здесь ). Подробности об их API можно найти либо на их сайте , либо, для привязок Python, на этой странице GitHub. (Я не проверял, возвращают ли они детали вознаграждения, поэтому YMMV.)
РЕДАКТИРОВАТЬ : Статическая награда теперь составляет 3,0 эфира.
В дополнение к ответу Ричарда, с точки зрения API, вознаграждение за блок также может быть trace_block
получено из метода JSON RPC API непосредственно из узла OpenEthereum/NethmindETH/Erigon RPC, если такой API включен.
Он должен быть в "result[i]" => "action" => "value"
элементе i из ответа, который имеет "type": "reward"
. Следует отметить, что может быть несколько элементов с reward
типом, например, если настроен блочный контракт вознаграждения .
Пример ответа от trace_block
API.
{
"jsonrpc": "2.0",
"id": 1,
"result": [
...
{
"action": {
"author": "0x646db8ffc21e7ddc2b6327448dd9fa560df41087",
"rewardType": "block",
"value": "0x1bc16d674ec80000"
},
"blockHash": "0xdcd887d9301d279c4754df78c6b69f26d2839b12201b0b337bc2512d015682b5",
"blockNumber": 14621621,
"result": null,
"subtraces": 0,
"traceAddress": [],
"type": "reward"
}]
}
АдрианКлв
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 дяди разрешены на блок».