Как экспортировать вывод вызовов bitcoind JSON-RPC с использованием интерфейса bitcoin-ruby в текстовый файл в формате с разделителями табуляции

Я запускаю биткойн-сервер в Ubuntu 16.04. Также используя метод подключения к RPC bitcoind с помощью bitcoin-ruby:

require 'bitcoin'
require 'net/http'
require 'json'
RPCUSER = "**"
RPCPASSWORD = "**"
HOST = "localhost"
PORT= 8332

def bitcoinRPC(method,param)
    http = Net::HTTP.new(HOST,PORT)
    request = Net::HTTP::Post.new('/')
    request.basic_auth(RPCUSER,RPCPASSWORD)
    request.content_type = 'application/json'
    request.body = {method:method,params:param,id:'jsonrpc'}.to_json
    JSON.parse(http.request(request).body)["result"]

конец

Следующие команды RPC показывают проанализированные данные блока номер 514641:

bhash= 514641
bid= bitcoinRPC('getblockhash',[bhash])
bid="0000000000000000003b34a5f6cb571435b71449c38e54bf2cbafb7ca3800501"
blk= bitcoinRPC("getblock",[bid])

А ключи внутри переменных blk следующие:

blk.keys
["hash", "confirmations", "strippedsize", "size", "weight", "height", 
"version", "versionHex", "merkleroot", "tx", "time", "mediantime", "nonce", 
"bits", "difficulty", "chainwork", "previousblockhash", "nextblockhash"]

Я хочу проанализировать ключевые значения "hash", "tx", "time", "difficulty" изнутри номера блока 514641, вычисляя обратно к блоку номер 1, используя рубиновое программирование, и проанализировать вывод в текстовый файл с разделителями табуляции следующий формат:

hash     tx      time     difficulty
000...  12X....  2344556   5455345
 --     13X...      --     5678899
 --     14X...      --     6454545

Здесь «хэш» и «время» будут одинаковыми значениями для одного и того же блока. Я новичок в программировании на рубине. Любое руководство будет высоко оценено.

Заранее спасибо.


person Rubz    schedule 27.03.2018    source источник


Ответы (1)


Я предполагаю, что ваш объект blk на данный момент является просто рубиновым хэшем, поэтому вы должны просто сделать:

keys = %w[hash tx time difficulty]  # array of strings (keys you want)
data = keys.map{|key| blk[key]} # array of data from the keys

require 'csv'
CSV.open("myfile.csv", "w") do |csv|
  csv << keys # keys will be header row of csv
  data.each{|d| csv << d} # loop over data and push into new row of csv
end
person lacostenycoder    schedule 27.03.2018
comment
Произошла ошибка: Traceback (последний последний вызов): 6: from /root/.rbenv/versions/2.5.0/bin/irb:11:in <main>' 5: from (irb):52 4: from /root/.rbenv/versions/2.5.0/lib/ruby/2.5.0/csv.rb:1289:in open' 3: from (irb):54:in block in irb_binding' 2: from (irb):54:in each' 1 : from (irb):54:in block (2 levels) in irb_binding' NoMethodError (undefined method ‹' for #‹CSV:0x0000557c853d7d70› Вы имели в виду? ‹‹) - person Rubz; 29.03.2018
comment
@Rubz да, у меня была опечатка, ошибка даже сказала, что это было. Я исправил это, см. обновленный ответ. Спасибо. - person lacostenycoder; 29.03.2018