Created
September 20, 2017 16:12
-
-
Save aniemerg/9d8a44b97024481b0356eb2bece1be46 to your computer and use it in GitHub Desktop.
Retrieves information about miner addresses sent mining rewards by Flypool to Zcash miners
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# minerdata.py | |
# This script builds a dataset of miners that have mined on Flypool by looking for all addresses paid | |
# alongside an existing miner during recent payments to that miner. | |
# The data output is addresss, number of times seen, total amount sent to address | |
# Written by Allan Niemerg | |
# email: my first name at cumberlandmining.com | |
import requests | |
import datetime | |
from time import sleep, time | |
from collections import defaultdict | |
import json | |
import argparse | |
import datetime | |
import sys | |
from requests.packages.urllib3.exceptions import InsecureRequestWarning,SNIMissingWarning,InsecurePlatformWarning | |
requests.packages.urllib3.disable_warnings(InsecureRequestWarning) | |
requests.packages.urllib3.disable_warnings(SNIMissingWarning) | |
requests.packages.urllib3.disable_warnings(InsecurePlatformWarning) | |
def _request(url): | |
response = requests.get(url, verify=False) | |
if response.status_code == 200: | |
return response.json() | |
else: | |
return {} | |
def get_transactions(address="t1fJuHWrfcWnYMYyP9VAF96vRnvND2NziMG", offset=0): | |
N = "https://api.zcha.in/v2/mainnet/accounts/%s/recv?limit=20&offset=%s" % (address, str(offset)) | |
return(_request(N)) | |
def get_payouts(address, pages): | |
payouts=defaultdict(lambda: (0,0.0) ) | |
hashes = [] | |
earliesttime = time() | |
for page in range(0,pages): | |
out = get_transactions(address=address,offset=page) | |
for transaction in out: | |
# The API we are using sends duplicate transactions, sometimes out-of-order, | |
# so let's not use any transactions twice | |
if transaction['hash'] in hashes: | |
continue | |
hashes.append(transaction['hash']) | |
timestamp = transaction['timestamp'] | |
if timestamp < earliesttime: | |
earliesttime = timestamp | |
for txout in transaction['vout']: | |
address = txout['scriptPubKey']['addresses'][0] | |
value = txout['value'] | |
currentcounter = payouts[address][0] | |
currentvalue = payouts[address][1] | |
payouts[address] = (currentcounter + 1, currentvalue + value) | |
#let's be polite and not flood zchai.in | |
sleep(0.5) | |
return (earliesttime, payouts) | |
if __name__ == '__main__': | |
if not len(sys.argv) > 1: | |
print("Please provide commands.") | |
print("Example Usage: python minerdata.py -a t1c1XrpzGC2H3nK985NpD8mpjfaMVo5sKey -p 10 -o data2.csv") | |
quit() | |
parser = argparse.ArgumentParser() | |
address="t1c1XrpzGC2H3nK985NpD8mpjfaMVo5sKey" | |
pages=1 | |
parser.add_argument("-a", help="miner address to use to find other miner addresses") | |
parser.add_argument("-p", type=int, help="number of pages to write") | |
parser.add_argument("-o", help="output file to write results to") | |
parser.add_argument("-v", help="output results to command line") | |
args = parser.parse_args() | |
if args.a != None: | |
address=args.a | |
if args.p != None: | |
pages=args.p | |
(earliesttime, payouts) = get_payouts(address, pages) | |
if args.o != None: | |
outfile = open( args.o, 'w' ) | |
for key, value in sorted( payouts.items() ): | |
outfile.write( str(key) + ', ' + str(value[0]) + ', ' + str(value[1]) + '\n' ) | |
if args.v: | |
for key, value in sorted( payouts.items() ): | |
print( str(key) + ', ' + str(value[0]) + ', ' + str(value[1]) + '\n') | |
earliest = datetime.datetime.utcfromtimestamp(earliesttime).isoformat() | |
print("Using %s, earliest date seen was %s" %(address, earliest)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment