У меня есть список биткойн-адресов, предоставленных пользователем, и я пытаюсь узнать сумму, внесенную на эти адреса. Я использую API blockexplorer.com для получения транзакций.
Это типичный вызов API (для удобства только для одного адреса), который делает мой скрипт. Вызов поддерживает параметры , from
и to
их можно использовать для эффективной оптимизации всей книги транзакций.
https://blockexplorer.com/api/addrs/1Archive1n2C579dMsAu3iC6tWzuQJz8dN/txs?from=0&to=20
Похоже, что в моем алгоритме оптимизации нет ошибок, но если я суммирую найденные значения valueIn
(которые предположительно должны обозначать значения, отправленные на адрес), результат будет совершенно неверным по сравнению с результатом, возвращенным в вызове API totalReceived
.
https://blockexplorer.com/api/addr/1Archive1n2C579dMsAu3iC6tWzuQJz8dN/totalReceived
Почему я получаю совершенно другие результаты?
Является ли это правильным способом узнать, была ли определенная сумма переведена на адрес (или адреса)?
Забавный факт: blockexplorer.com возвращает значение totalReceived
, отличное от значения, возвращаемого blockchain.info.
Почему я получаю совершенно другие результаты?
Вы столкнетесь с большой путаницей с такого рода API просто потому, что информация, которую они отображают, не стандартизирована и на самом деле не присутствует в цепочке блоков Биткойн с самого начала. В результате между сервисами очень мало преемственности в этих значениях, и в целом неясно, как они получают эти значения.
В этом случае «общее количество полученных», вероятно, говорит о количестве подтвержденных выходов, которые были OP_DUP OP_HASH160 6c1b511a63306b6294e1d3390ac8cd481f76705d OP_EQUALVERIFY OP_CHECKSIG
потрачены на сценарий для опубликованного вами адреса P2PKH. Некоторые обозреватели блоков вычитают выходные данные изменений из этой суммы, например, в этой транзакции, где 1Archive повторно используется для остатка, который не тратится на новый адрес.
«Всего получено» для вашего примера адреса в нескольких разных службах:
Инсайт 542.66668813 BTC
Blockchain.info 104.50252693 BTC
Blockr.io 31.17755429 BTC
Смартбит 104.50252693 BTC
«Баланс» адреса, отображаемый этими API, предположительно содержит общее количество подтвержденных неизрасходованных выходных данных с этим скриптом, но в зависимости от API иногда включает неподтвержденные транзакции или просто не поддающиеся расшифровке значения, такие как отрицательные значения.
Является ли это правильным способом узнать, была ли определенная сумма переведена на адрес (или адреса)?
Вероятно, нет, если у вас есть возможность, вы можете использовать узел Bitcoin Core и функцию только для просмотра, чтобы контролировать свой список адресов и получать независимую проверку того, сколько биткойнов доступно для траты. Однако это будет медленно настраиваться и не подходит для ситуаций, когда вы будете часто добавлять новые адреса (для повторной обработки исторических данных требуется время, возможно, до 30 минут). Если вы должны использовать эти API, вам, вероятно, лучше использовать доступную конечную точку неизрасходованных выходов и самостоятельно подсчитывать их.
Транзакции могут иметь несколько выходов и несколько входов. Поле valueIn представляет собой сумму всех входных данных транзакции, а не сумму, направляемую на интересующий вас адрес.
Вместо суммирования valueIn вы должны составить список всех выходных данных, затем отфильтровать те, которые не отправляются на интересующий вас адрес, а затем суммировать их.
Забавный факт: blockexplorer.com возвращает значение totalReceived, которое отличается от значения, возвращаемого blockchain.info.
Значение «всего полученного» четко не определено. Например, если я беру деньги по адресу А и отправляю их на адрес А, «получил» ли адрес А деньги? Различные API вычисляют это по-разному.
Примечание. Я предполагаю, что вы намеренно не пытаетесь найти баланс адреса, который четко определен.
ПотерянныйУшелИНеНайден