library(data.table) library(rbch) library(future.apply) is.dogecoin <- FALSE blockchain.conf.file <- "" # Input filepath for your {blockchain}.conf file data.dir <- "" # Input data directory here, with trailing "/" current.block.height <- NA_integer_ # current.block.height <- rbch::getblockchaininfo(bch.config)@result$blocks n.threads <- min(c(6, parallelly::availableCores())) # Recommended no more than 6 threads since all threads query the single blockchain daemon process. blockchain.config <- rbch::conrpc(blockchain.conf.file) rpcport <- readLines(blockchain.conf.file) rpcport <- rpcport[grepl("rpcport", rpcport) ] if (length(rpcport) > 0) { blockchain.config@url <- paste0("http://127.0.0.1:", gsub("[^0-9]", "", rpcport)) } getblock.doge <- function(con, blockhash, verbosity = TRUE) { bh <- as.character(blockhash) pl <- unname(list(blockhash = bh, verbosity = verbosity)) rpcpost(con, "getblock", pl) } future::plan(future::multiprocess(workers = n.threads)) block.times <- future.apply::future_lapply(0:current.block.height, function(iter.block.height) { if (iter.block.height %% 1000 == 0) { cat(iter.block.height, base::date(), "\n") } block.hash <- rbch::getblockhash(blockchain.config, iter.block.height) if ( ! is.dogecoin) { block.data <- rbch::getblock(blockchain.config, blockhash = block.hash@result, verbosity = "l1") } else { block.data <- getblock.doge(blockchain.config, blockhash = block.hash@result, verbosity = TRUE) } data.frame(block_height = iter.block.height, block_time = block.data@result$time) }) block.times <- data.table::rbindlist(block.times) saveRDS(block.times, file = paste0(data.dir, "block_times.rds"))