Я родом из научных кругов (экономики, в частности), и я часто трудно убедительно описать мои сверстники рост экосистемы Bitcoin в цифрах, которые переводят в экономическую ценность. Если Bitcoin является электронной системой значения равного-равному, нам нужен лучший показатель объема BTC между сетевыми аналогами. На сегодняшний день Blockchain.info является единственной компанией, которая предусматривает, что оценка, но после тестирования нескольких случайных выборок я нашел доказательство того, что, что их методология значительно занижает объем.
За последнюю пару месяцев я работал на лучшую методологию для оценки на цепи объема, но я очень разочарован тем, как долго он принимает, чтобы получить входы и выходы транзакций через интерфейс JSON-RPC bitcoind в.
После нескольких месяцев тестирования случайных выборок и вручную, глядя на адресах, я считаю, что я разработал более точную методологию для оценки по-цепи объема. Я планирую разделить эту методологию с сообществом, как только я могу проверить свою гипотезу, используя последние блоки, но теперь задача состоит в получении всех входов и выходов своевременно.
Ниже приведен список вызовов, которые я использую, чтобы получить эти данные. Я был бы очень признателен, если один из вас может сказать мне, если я делаю что-то неправильно, или если есть лучший способ получить входы и выходы из каждой сделки. Все, что помогает, это довольно сложно, чтобы иметь дело с этим после месяцев работы на гипотезе.
В конце концов, я считаю оценку более реалистичный объем подкрепленную методологии рецензируемых бы повысить интерес со стороны научного сообщества и повысить доверие к сети Bitcoin. Пожалуйста помоги.
Код:
от bitcoinrpc.authproxy импорта AuthServiceProxy, JSONRPCException
импорт JSON
импорт запросов
импорт pprint
время импорта
импорт ОС
objectivestart_time = time.time ()
рр = pprint.PrettyPrinter (отступ = 4)
rpc_user = 'п'
rpc_password = 'п'
URL = ("Http: //% s:% s @ 1"% (Rpc_user, rpc_password))
Защиту REQ (полезная нагрузка):
вернуться requests.post (URL, данные = json.dumps (полезная нагрузка)). JSON ()
Защиту BlockHash_JsonRPCpayload (количество):
DIC = {
"jsonrpc":"2,0",
"метод": "getblockhash",
"Титулы": [номер] ,
"Я бы": 1
}
Возвращение (DIC)
Защиту Block_JsonRPCpayload (ч):
DIC = {
"jsonrpc":"2,0",
"метод": "getblock",
"Титулы": [Ул (ч)],
"Я бы": 1
}
Возвращение (DIC)
Защиту rawtx_JsonRPCpayload (ТХ):
DIC = {
"jsonrpc":"2,0",
"метод": "getrawtransaction",
"Титулы": [ТХ, True],
"Я бы": 1
}
Возвращение (DIC)
Защиту rawvin_JsonRPCpayload (ТХ, Vin):
block_payload = {
"jsonrpc":"2,0",
"метод": "getrawtransaction",
"Титулы": [TX, 1],
"Я бы": 1
}
Запрос = REQ (block_payload)
значение = запрос [ 'результат'] [ 'Vout'] [Int (Vin)] [ 'значение']
Возвращение с плавающей точкой (значение)
BTC_dic = {}
hash_payload = []
start_time = time.time ()
block_start = 481101
block_end = 490000
начать = block_start
конец = block_start
в то время как конец < block_end:
block_tries = 0
в то время как True:
пытаться:
конец = начало + 100
hash_payload = []
печать ( «Пуск», «конец», начало, конец)
для я в диапазоне (начало, конец):
hash_payload.append (BlockHash_JsonRPCpayload (я))
start_time = time.time ()
печать ( 'знак 1')
hash_response = requests.post (URL, данные = json.dumps (hash_payload)). JSON ()
печать ( «время, чтобы получить хэш партии», старт, "_", Конец, time.time () - start_time)
печать ( «успех в получении хэшей для диапазонов», старт, "_ ", конец )
time.sleep (0.4)
block_payload = []
для я в hash_response:
ч = я [ «результат»]
block_payload.append (Block_JsonRPCpayload (ч))
start_time = time.time ()
block_response = requests.post (URL, данные = json.dumps (block_payload)). JSON ()
печать ( «время, чтобы получить блок партии», старт, "_", Конец, time.time () - start_time)
печать ( «успех в получении блоков для диапазонов», старт, "_ ", конец )
time.sleep (0.4)
для г в диапазоне (LEN (block_response)):
Блок = block_response [I] [ 'результат']
высота = блок [ «высота»]
печать ( 'получение', Len (блок [ 'ТХ']), 'операции для блока', высота)
BTC_dic [высота] = блок
tx_payload = []
для ТХ в блоке [ «ТХ»]:
tx_payload.append (rawtx_JsonRPCpayload (TX))
try_errors = 0
в то время как True:
пытаться:
#print (LEN (tx_payload), 'количество сделок в блоке', высота)
start_time = time.time ()
сделка = requests.post (URL, данные = json.dumps (tx_payload)). () JSON
time.sleep (0,5)
#print ( 'время, чтобы получить ТЕ', time.time () - start_time)
печать ( «успех в получении транзакций для блока», высота)
Кроме:
try_errors + 1 =
печать ( '!! Попробуй ошибка !!)
печать (try_errors «транзакция пытается по высоте блока», высота)
time.sleep (3)
Продолжать
ломать
для г в диапазоне (LEN (транзакции)):
tx_result = транзакции [I] [ 'результат']
Vin = tx_result [ 'Vin']
Vout = tx_result [ 'Vout']
пытаться:
плата = 0
для J в диапазоне (LEN (Vout)):
сборы - = tx_result [ 'Vout'] [J] [ 'значение']
для J в диапазоне (LEN (Vin)):
Vout = Vin [J] [ 'Vout']
TXID = Vin [J] [ 'TXID']
vin_error = 0
в то время как True:
пытаться:
значение = rawvin_JsonRPCpayload (TXID, Vout)
Кроме:
печать ( '!! ошибка Vin !!)
печать ( 'попытка', vin_error)
vin_error + 1 =
time.sleep (0.4)
Продолжать
ломать
плата + = значение
tx_result [ 'Vin'] [J] [ 'значение'] = значение
tx_result [ 'сборы'] = сборы
Кроме:
tx_result [ 'Vin'] [0] [ 'значение'] = 'Нет входы (вновь сформированные монеты)'
tx_result [ 'сборы'] = 0
BTC_dic [высота] [ 'ТХ'] [я] = tx_result
если Len (BTC_dic) >= 100:
печать ( 'Len BTC_dic =', длина (BTC_dic))
для блока в BTC_dic:
block_fee = 0
Операции = BTC_dic [блок] [ 'ТХ']
# pp.pprint (сделки)
для дж сделок:
плата = J [ ''] сборы
block_fee + = плата
BTC_dic [блок] [ 'блок сборов'] = block_fee
block_array = []
для блока в BTC_dic:
block_array.append (блок)
имя_файла = 'jcampbell_btc_txdata' ул (мин (block_array)) + '_' + ул (макс (block_array)) + 'JSON'
печать ( 'сохранение', имя_файла 'время', time.time () - objectivestart_time)
с открытым (file_name, «ж») в выходном файле:
json.dump (BTC_dic, выходной_файл)
BTC_dic = {}
начать = конец
Кроме:
block_tries + 1 =
печать (block_tries, «пытается получить данные для диапазона блока», старт,"_",конец)
time.sleep (5)
Продолжать
ломать
для блока в BTC_dic:
block_fee = 0
Операции = BTC_dic [блок] [ 'ТХ']
# pp.pprint (сделки)
для дж сделок:
плата = J [ ''] сборы
block_fee + = плата
BTC_dic [блок] [ 'блок сборов'] = block_fee
block_array = []
для блока в BTC_dic:
block_array.append (блок)
имя_файла = 'jcampbell_btc_txdata' ул (мин (block_array)) + '_' + ул (макс (block_array)) + 'JSON'
печать ( 'сохранение', имя_файла 'время', time.time () - objectivestart_time)
с открытым (file_name, «ж») в выходном файле:
json.dump (BTC_dic, выходной_файл)
импорт JSON
импорт запросов
импорт pprint
время импорта
импорт ОС
objectivestart_time = time.time ()
рр = pprint.PrettyPrinter (отступ = 4)
rpc_user = 'п'
rpc_password = 'п'
URL = ("Http: //% s:% s @ 1"% (Rpc_user, rpc_password))
Защиту REQ (полезная нагрузка):
вернуться requests.post (URL, данные = json.dumps (полезная нагрузка)). JSON ()
Защиту BlockHash_JsonRPCpayload (количество):
DIC = {
"jsonrpc":"2,0",
"метод": "getblockhash",
"Титулы": [номер] ,
"Я бы": 1
}
Возвращение (DIC)
Защиту Block_JsonRPCpayload (ч):
DIC = {
"jsonrpc":"2,0",
"метод": "getblock",
"Титулы": [Ул (ч)],
"Я бы": 1
}
Возвращение (DIC)
Защиту rawtx_JsonRPCpayload (ТХ):
DIC = {
"jsonrpc":"2,0",
"метод": "getrawtransaction",
"Титулы": [ТХ, True],
"Я бы": 1
}
Возвращение (DIC)
Защиту rawvin_JsonRPCpayload (ТХ, Vin):
block_payload = {
"jsonrpc":"2,0",
"метод": "getrawtransaction",
"Титулы": [TX, 1],
"Я бы": 1
}
Запрос = REQ (block_payload)
значение = запрос [ 'результат'] [ 'Vout'] [Int (Vin)] [ 'значение']
Возвращение с плавающей точкой (значение)
BTC_dic = {}
hash_payload = []
start_time = time.time ()
block_start = 481101
block_end = 490000
начать = block_start
конец = block_start
в то время как конец < block_end:
block_tries = 0
в то время как True:
пытаться:
конец = начало + 100
hash_payload = []
печать ( «Пуск», «конец», начало, конец)
для я в диапазоне (начало, конец):
hash_payload.append (BlockHash_JsonRPCpayload (я))
start_time = time.time ()
печать ( 'знак 1')
hash_response = requests.post (URL, данные = json.dumps (hash_payload)). JSON ()
печать ( «время, чтобы получить хэш партии», старт, "_", Конец, time.time () - start_time)
печать ( «успех в получении хэшей для диапазонов», старт, "_ ", конец )
time.sleep (0.4)
block_payload = []
для я в hash_response:
ч = я [ «результат»]
block_payload.append (Block_JsonRPCpayload (ч))
start_time = time.time ()
block_response = requests.post (URL, данные = json.dumps (block_payload)). JSON ()
печать ( «время, чтобы получить блок партии», старт, "_", Конец, time.time () - start_time)
печать ( «успех в получении блоков для диапазонов», старт, "_ ", конец )
time.sleep (0.4)
для г в диапазоне (LEN (block_response)):
Блок = block_response [I] [ 'результат']
высота = блок [ «высота»]
печать ( 'получение', Len (блок [ 'ТХ']), 'операции для блока', высота)
BTC_dic [высота] = блок
tx_payload = []
для ТХ в блоке [ «ТХ»]:
tx_payload.append (rawtx_JsonRPCpayload (TX))
try_errors = 0
в то время как True:
пытаться:
#print (LEN (tx_payload), 'количество сделок в блоке', высота)
start_time = time.time ()
сделка = requests.post (URL, данные = json.dumps (tx_payload)). () JSON
time.sleep (0,5)
#print ( 'время, чтобы получить ТЕ', time.time () - start_time)
печать ( «успех в получении транзакций для блока», высота)
Кроме:
try_errors + 1 =
печать ( '!! Попробуй ошибка !!)
печать (try_errors «транзакция пытается по высоте блока», высота)
time.sleep (3)
Продолжать
ломать
для г в диапазоне (LEN (транзакции)):
tx_result = транзакции [I] [ 'результат']
Vin = tx_result [ 'Vin']
Vout = tx_result [ 'Vout']
пытаться:
плата = 0
для J в диапазоне (LEN (Vout)):
сборы - = tx_result [ 'Vout'] [J] [ 'значение']
для J в диапазоне (LEN (Vin)):
Vout = Vin [J] [ 'Vout']
TXID = Vin [J] [ 'TXID']
vin_error = 0
в то время как True:
пытаться:
значение = rawvin_JsonRPCpayload (TXID, Vout)
Кроме:
печать ( '!! ошибка Vin !!)
печать ( 'попытка', vin_error)
vin_error + 1 =
time.sleep (0.4)
Продолжать
ломать
плата + = значение
tx_result [ 'Vin'] [J] [ 'значение'] = значение
tx_result [ 'сборы'] = сборы
Кроме:
tx_result [ 'Vin'] [0] [ 'значение'] = 'Нет входы (вновь сформированные монеты)'
tx_result [ 'сборы'] = 0
BTC_dic [высота] [ 'ТХ'] [я] = tx_result
если Len (BTC_dic) >= 100:
печать ( 'Len BTC_dic =', длина (BTC_dic))
для блока в BTC_dic:
block_fee = 0
Операции = BTC_dic [блок] [ 'ТХ']
# pp.pprint (сделки)
для дж сделок:
плата = J [ ''] сборы
block_fee + = плата
BTC_dic [блок] [ 'блок сборов'] = block_fee
block_array = []
для блока в BTC_dic:
block_array.append (блок)
имя_файла = 'jcampbell_btc_txdata' ул (мин (block_array)) + '_' + ул (макс (block_array)) + 'JSON'
печать ( 'сохранение', имя_файла 'время', time.time () - objectivestart_time)
с открытым (file_name, «ж») в выходном файле:
json.dump (BTC_dic, выходной_файл)
BTC_dic = {}
начать = конец
Кроме:
block_tries + 1 =
печать (block_tries, «пытается получить данные для диапазона блока», старт,"_",конец)
time.sleep (5)
Продолжать
ломать
для блока в BTC_dic:
block_fee = 0
Операции = BTC_dic [блок] [ 'ТХ']
# pp.pprint (сделки)
для дж сделок:
плата = J [ ''] сборы
block_fee + = плата
BTC_dic [блок] [ 'блок сборов'] = block_fee
block_array = []
для блока в BTC_dic:
block_array.append (блок)
имя_файла = 'jcampbell_btc_txdata' ул (мин (block_array)) + '_' + ул (макс (block_array)) + 'JSON'
печать ( 'сохранение', имя_файла 'время', time.time () - objectivestart_time)
с открытым (file_name, «ж») в выходном файле:
json.dump (BTC_dic, выходной_файл)