Подсчет суммы полученных биткойнов

У меня есть список биткойн-адресов, предоставленных пользователем, и я пытаюсь узнать сумму, внесенную на эти адреса. Я использую 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.

Ответы (2)

Почему я получаю совершенно другие результаты?

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

В этом случае «общее количество полученных», вероятно, говорит о количестве подтвержденных выходов, которые были OP_DUP OP_HASH160 6c1b511a63306b6294e1d3390ac8cd481f76705d OP_EQUALVERIFY OP_CHECKSIGпотрачены на сценарий для опубликованного вами адреса P2PKH. Некоторые обозреватели блоков вычитают выходные данные изменений из этой суммы, например, в этой транзакции, где 1Archive повторно используется для остатка, который не тратится на новый адрес.

«Всего получено» для вашего примера адреса в нескольких разных службах:

«Баланс» адреса, отображаемый этими API, предположительно содержит общее количество подтвержденных неизрасходованных выходных данных с этим скриптом, но в зависимости от API иногда включает неподтвержденные транзакции или просто не поддающиеся расшифровке значения, такие как отрицательные значения.

Является ли это правильным способом узнать, была ли определенная сумма переведена на адрес (или адреса)?

Вероятно, нет, если у вас есть возможность, вы можете использовать узел Bitcoin Core и функцию только для просмотра, чтобы контролировать свой список адресов и получать независимую проверку того, сколько биткойнов доступно для траты. Однако это будет медленно настраиваться и не подходит для ситуаций, когда вы будете часто добавлять новые адреса (для повторной обработки исторических данных требуется время, возможно, до 30 минут). Если вы должны использовать эти API, вам, вероятно, лучше использовать доступную конечную точку неизрасходованных выходов и самостоятельно подсчитывать их.

Транзакции могут иметь несколько выходов и несколько входов. Поле valueIn представляет собой сумму всех входных данных транзакции, а не сумму, направляемую на интересующий вас адрес.

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

Забавный факт: blockexplorer.com возвращает значение totalReceived, которое отличается от значения, возвращаемого blockchain.info.

Значение «всего полученного» четко не определено. Например, если я беру деньги по адресу А и отправляю их на адрес А, «получил» ли адрес А деньги? Различные API вычисляют это по-разному.

Примечание. Я предполагаю, что вы намеренно не пытаетесь найти баланс адреса, который четко определен.

Причина, по которой я не ищу баланс, заключается в том, что в моем понимании это значение уменьшается, когда значение отправляется с этого адреса. То, что я ищу, - это фактическое значение, переданное на адрес, без учета возможных «снятий». Мое приложение позволяет пользователям вставлять список адресов, а затем отслеживает их все, суммируя количество отправленных им биткойнов.