Profiling script for gathering a lot of data from an API
Here are some of the improvements to the current "synchronous" approach:


maintain an instance of the requests.Session() - this would improve performance:


  ..if you're making several requests to the same host, the underlying TCP
  connection will be reused, which can result in a significant
  performance increase


with requests.Session() as session:
    r = session.get(url + current_hash)

use the .json() method to get the JSON object directly out of a response (you would first need to adjust the "json model" to use ujson, source):

requests.models.json = ujson
# ...
block = r.json()

don't open/close files in the main loop - collect the data into memory and dump after. If the data does not fit the memory, use pagination - write to the output file(s) in chunks.
the parse_transactions_in_block() may be rewritten using str.join() and str.format():

def parse_transactions_in_block(block):
    return ''.join("{time},{index},{total}\n".format(time=transaction['time'],
                                                     index=transaction['tx_index'],
                                                     total=calc_total_input(transaction))
                   for transaction in block['tx'])

the calc_total_input() can be rewritten using sum():

def calc_total_input(transaction):
    return sum(input['value'] for input in transaction['out'])

try the PyPy interpreter - can give you a performance boost with no changes to the code (well, I doubt ujson will still work, but simplejson might be a good alternative in this case) 


That said, given the information provided in the question, the bottleneck feels to still be the blocking nature of the script. See if you can switch to, for example, Scrapy web-scraping framework, or use the grequests library.