Skip to content

Instantly share code, notes, and snippets.

@aniemerg
Created September 20, 2017 16:12
Show Gist options
  • Save aniemerg/9d8a44b97024481b0356eb2bece1be46 to your computer and use it in GitHub Desktop.
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
# 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