В настоящее время мне требуется почти 1,5 часа, чтобы получить все входные и выходные данные блока биткойнов за январь с использованием JSON RPC. При таком темпе потребуется значительное количество времени, чтобы вернуться к генезису. Я начинаю думать, что использую неправильный вызов API или делаю что-то еще неправильно. Я был бы очень признателен, если бы кто-нибудь из вас мог просмотреть вызовы, которые я использую в настоящее время (вставлено ниже), и, возможно, сказать мне, что я делаю неправильно, или если bitcoind является подходящим клиентом для этого.
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
import json
import requests
import pprint
import time
import os
objectivestart_time=time.time()
pp= pprint.PrettyPrinter(indent=4)
rpc_user='n'
rpc_password='n'
url=("http://%s:%s@1"%(rpc_user, rpc_password))
def req(payload):
return requests.post(url,data=json.dumps(payload)).json()
def BlockHash_JsonRPCpayload(number):
dic={
"jsonrpc":"2.0",
"method": "getblockhash",
"params": [number] ,
"id": 1
}
return (dic)
def Block_JsonRPCpayload(h):
dic={
"jsonrpc":"2.0",
"method": "getblock",
"params": [str(h)] ,
"id": 1
}
return (dic)
def rawtx_JsonRPCpayload(tx):
dic={
"jsonrpc":"2.0",
"method": "getrawtransaction",
"params": [tx, True] ,
"id": 1
}
return (dic)
def rawvin_JsonRPCpayload(tx,vin):
block_payload={
"jsonrpc":"2.0",
"method": "getrawtransaction",
"params": [tx,1] ,
"id": 1
}
request=req(block_payload)
value=request['result']['vout'][int(vin)]['value']
return float(value)
BTC_dic={}
hash_payload=[]
start_time=time.time()
block_start=481101
block_end=490000
start=block_start
end= block_start
while end < block_end:
block_tries=0
while True:
try:
end=start+100
hash_payload=[]
print ( 'start', 'end', start, end )
for i in range(start,end):
hash_payload.append(BlockHash_JsonRPCpayload(i))
start_time=time.time()
print ( 'mark 1 ')
hash_response=requests.post(url, data=json.dumps(hash_payload)).json()
print('time to get hash batch',start, "_", end, time.time()-start_time)
print ( 'success in getting hashes for ranges', start, "_ ", end )
time.sleep(0.4)
block_payload=[]
for i in hash_response:
h=i['result']
block_payload.append(Block_JsonRPCpayload(h))
start_time=time.time()
block_response=requests.post(url,data=json.dumps(block_payload)).json()
print ( 'time to get block batch ',start, "_", end, time.time()-start_time)
print ( 'success in getting blocks for ranges', start, "_ ", end )
time.sleep(0.4)
for i in range(len(block_response)):
block=block_response[i]['result']
height=block['height']
print('getting', len(block['tx']),'transactions for block ', height)
BTC_dic[height]=block
tx_payload=[]
for tx in block['tx']:
tx_payload.append(rawtx_JsonRPCpayload(tx))
try_errors=0
while True:
try:
#print ( len(tx_payload), 'number of transactions in block ', height)
start_time=time.time()
transaction=requests.post(url,data=json.dumps(tx_payload)).json()
time.sleep(0.5)
#print ('time to get tx', time.time()-start_time)
print ( 'success in getting transactions for block ', height )
except:
try_errors+=1
print ( '!! Try error !!')
print ( try_errors, ' transaction tries for block height', height)
time.sleep(3)
continue
break
for i in range(len(transaction)):
tx_result=transaction[i]['result']
vin=tx_result['vin']
vout=tx_result['vout']
try:
fees=0
for j in range(len(vout)):
fees -= tx_result['vout'][j]['value']
for j in range(len(vin)):
vout=vin[j]['vout']
txid=vin[j]['txid']
vin_error=0
while True:
try:
value=rawvin_JsonRPCpayload(txid,vout)
except:
print ( '!! vin error !!')
print ( 'attempt', vin_error )
vin_error+=1
time.sleep(0.4)
continue
break
fees+=value
tx_result['vin'][j]['value']=value
tx_result['fees']=fees
except:
tx_result['vin'][0]['value']='No Inputs (Newly Generated Coins)'
tx_result['fees']=0
BTC_dic[height]['tx'][i]=tx_result
if len(BTC_dic) >= 100:
print ( 'len BTC_dic =', len(BTC_dic))
for block in BTC_dic:
block_fee=0
transactions= BTC_dic[block]['tx']
#pp.pprint(transactions)
for j in transactions:
fee=j['fees']
block_fee+=fee
BTC_dic[block]['block fees']=block_fee
block_array=[]
for block in BTC_dic:
block_array.append(block)
file_name='jcampbell_btc_txdata'+str(min(block_array))+'_'+str(max(block_array))+'.json'
print ('saving', file_name, 'time', time.time()-objectivestart_time)
with open(file_name, 'w') as outfile:
json.dump(BTC_dic,outfile)
BTC_dic={}
start=end
except:
block_tries+=1
print(block_tries, 'tries to get data for block range ', start,"_",end)
time.sleep(5)
continue
break
for block in BTC_dic:
block_fee=0
transactions= BTC_dic[block]['tx']
#pp.pprint(transactions)
for j in transactions:
fee=j['fees']
block_fee+=fee
BTC_dic[block]['block fees']=block_fee
block_array=[]
for block in BTC_dic:
block_array.append(block)
file_name='jcampbell_btc_txdata'+str(min(block_array))+'_'+str(max(block_array))+'.json'
print ('saving', file_name, 'time', time.time()-objectivestart_time)
with open(file_name, 'w') as outfile:
json.dump(BTC_dic,outfile)
Если мы хотим, чтобы BTC стал мейнстримом, нам нужен лучший способ показать экономическую активность. Мне нужно, чтобы вы помогли мне доказать, что Биткойн — это больше, чем спекулятивный инструмент.
Я пришел из академических кругов (в частности, из области экономики), и мне часто трудно убедительно описать своим коллегам рост экосистемы Биткойн в цифрах, которые переводятся в экономическую ценность.
Учитывая быстрый рост этого рынка, когда люди думают о биткойнах, цена часто является первым, что приходит на ум. Для тех из нас, кто в течение некоторого времени занимается исследованием биткойнов, шесть тысяч долларов США за биткойн, несомненно, являются невероятным показателем популярности. Однако нам нужна более качественная метрика, чтобы показать фактическую экономическую активность, которая также значительно увеличилась за последние пару лет. Если Биткойн — это одноранговая система электронной наличности, нам нужен лучший индикатор объема BTC между одноранговыми узлами сети . Я начал исследовать биткойн-дни уничтоженных, но мне часто трудно объяснить эту метрику, поскольку она не дает точного ответа на вопрос: сколько ценности обменивается в сети?
Я понимаю, что полностью точный ответ на этот вопрос почти невозможен из-за модели UTXO Биткойна, но нам нужны более точные оценки. Blockchain.info предоставляет приблизительный объем транзакций за день, но случайные выборки, которые я обработал, показывают, что их методология значительно занижает объем. После нескольких месяцев тестирования случайных выборок и ручного просмотра адресов я полагаю, что разработал более точную методологию для оценки объема в сети. Я планирую поделиться этой методологией с сообществом, как только смогу проверить свою гипотезу, используя более полные блоки, но сейчас задача состоит в том, чтобы получить все входные и выходные данные из более поздних блоков.
Я считаю, что более реалистичная оценка объема, подкрепленная проверенной методологией, повысит интерес со стороны академических кругов и повысит доверие к сети Биткойн. Если вы не знакомы с JSON RPC, я был бы признателен, если бы вы могли проголосовать за этот пост, чтобы его увидело больше людей.
Спасибо.
-JC
Мне нравится справочная информация и основные предположения, с риском перейти к обсуждению, основанному на ценностях, вместо прямого ответа, как можно улучшить вызовы RPC... :-)
Если мы хотим, чтобы BTC стал мейнстримом, нам нужен лучший способ показать экономическую активность. Мне нужно, чтобы вы помогли мне доказать, что Биткойн — это больше, чем спекулятивный инструмент.
Я пришел из академических кругов (в частности, из области экономики), и мне часто трудно убедительно описать своим коллегам рост экосистемы Биткойн в цифрах, которые переводятся в экономическую ценность.
Во-первых, "кто мы"? Я встречал людей, которые совершенно согласны с тем, что биткойн — это полезный механизм передачи стоимости, который предоставляет мне некоторые функции анонимности и, по-видимому, устойчив к цензуре. Так что он уже будет соответствовать моим требованиям (ценностям), и в этом случае биткойн может быть уже слишком мейнстримным. Когда в игру вступает жадность, и люди слишком ограничены, чтобы создать свою собственную группу с умным изобретением, чтобы извлечь из этого выгоду, тогда законно ли применять «их» правила к «моему» биткойн-миру? (гипотетический вопрос)
Об экономике: имхо, экономическая перспектива в основном ориентирована на прибыль. Что-то должно иметь ценность, чтобы я мог извлечь выгоду из этого или вместе с ним. Если нет внутренней ценности, то и пользы от этого никакой: все равно, что копать яму в пустыне. Похоже, именно это мы и делаем с майнингом биткойнов. Копать ямы... Каждая вторая работа пытается создать что-то ценное, создание скульптуры, рисование картины - в основном в смысле материальных активов. И писать компьютерные программы. В мире биткойнов рытье дыр необходимо для защиты сети, а сама эта идея еще не понята. Вот почему его сравнивают с пузырем тюльпанов в Нидерландах. Значение позади не распознается. Время покажет, является биткойн пузырем или нет.
Провокационный вопрос: действительно ли «нам» нужно убеждать больше людей ценой выше 6000 долларов США? Я бы сказал нет :-) Я зашел в игру на менее чем 100, так что я в порядке (и в основном готов). Играть с биткойнами было моей игрушкой, и мне посчастливилось извлечь из этого выгоду. Но все новички, наверное, заходили по 5800, или 5900, или даже 6000. Они опоздали и потеряли возможности. Так что все эти 58, 59 или 6000 игроков отчаянно ищут способ добиться того же «выигрыша», только без риска и с минимальными усилиями. Я не понимаю, почему у "этих" ребят должно быть это преимущество - они должны оставаться в экономике, изобретать что-то свое, например создавать что-н. ценности для общества, продать его обществу и таким образом разбогатеть. Но сомневаюсь, что они на это способны...
какая стоимость обменивается внутри сети? Я понимаю, что полностью точный ответ на этот вопрос практически невозможен из-за модели UTXO Биткойна.
не уверен, что вы хотите доказать здесь. Поскольку мы можем декомпозировать каждый блок (это публичная книга!), мы можем увидеть транзакции внутри и увидеть, сколько стоимости было перемещено из a в b — независимо от модели UTXO. Просто вы не знаете и никогда не должны знать (анонимность!), как часто я терял свои биткойны или даже сколько адресов у меня есть. Тогда транзакция не означает, что я обменял ценность — может быть, я просто перешел из своего горячего кошелька в свою систему холодного хранения и наоборот. Итак, я прихожу к выводу, что ваши усилия направлены либо на правительство (или на группу интересов), чтобы еще больше контролировать людей. Цель разработки Биткойна состояла в том, чтобы предотвратить подобные вещи. В связи с этим вопрос улучшения RPC/JSON не имеет смысла... Извиняюсь, как не носитель языка, не хочу показаться высокомерным,
Очень нерегулярный