utxoracle 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/benchmarks/run +39 -0
- data/bin/benchmarks/run_range +40 -0
- data/bin/run +9 -21
- data/bin/run_range +16 -0
- data/lib/utxoracle/batch_oracle.rb +34 -0
- data/lib/utxoracle/oracle.rb +7 -5
- data/lib/utxoracle/provider.rb +2 -0
- data/lib/utxoracle/version.rb +1 -1
- data/lib/utxoracle.rb +1 -0
- data/utxoracle.gemspec +1 -1
- metadata +13 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27c98fbe262713835893d7590648c0e566ac35cf837d5c1b6514961b54c99324
|
4
|
+
data.tar.gz: 8cf05e364850de7f330a4c833640d58c69b8a0c048aaec4fbaa8f4dbe54b529c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 932541e0474fbdbe9515629cfa7f4f4b35a1a04b4f993fc21542b063f46f1273bf66b77cc91c457301af2f81fe95bd782ec0c31bd16d8060b4509f870e1806a6
|
7
|
+
data.tar.gz: dcabd03dcf97198240167c5ad9449345340c85f49b39f31e80a77cab3ba4a5c68f02736a8d09c988246af34ea2a35238795a3a7b4b3cd4bcdad38ef4a36310e8
|
data/bin/benchmarks/run
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# This is a copy of bin/run but with timing code.
|
5
|
+
# Usage:
|
6
|
+
#
|
7
|
+
# Basic wall clock measurement:
|
8
|
+
# $ ./bin/benchmarks/run aUser aPassword 127.0.0.1 8332 2023-10-01
|
9
|
+
#
|
10
|
+
# With StackProf measurement:
|
11
|
+
# ./bin/benchmarks/run aUser aPassword 127.0.0.1 8332 2023-10-01 true
|
12
|
+
|
13
|
+
require 'bundler/setup'
|
14
|
+
require 'utxoracle'
|
15
|
+
require 'benchmark'
|
16
|
+
|
17
|
+
user = ARGV[0]
|
18
|
+
password = ARGV[1]
|
19
|
+
ip = ARGV[2]
|
20
|
+
port = ARGV[3]
|
21
|
+
date = ARGV[4]
|
22
|
+
profile = ARGV[5]
|
23
|
+
|
24
|
+
if profile
|
25
|
+
require 'stackprof'
|
26
|
+
# See https://github.com/tmm1/stackprof#sampling: for :cpu, :wall, :object
|
27
|
+
StackProf.run(mode: :wall, out: 'tmp/stackprof-wall.dump', raw: true) do
|
28
|
+
provider = Utxoracle::Node.new(user, password, ip, port)
|
29
|
+
oracle = Utxoracle::Oracle.new(provider, log = false)
|
30
|
+
puts oracle.price(date)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
time = Benchmark.measure do
|
34
|
+
provider = Utxoracle::Node.new(user, password, ip, port)
|
35
|
+
oracle = Utxoracle::Oracle.new(provider, log = false)
|
36
|
+
puts oracle.price(date)
|
37
|
+
end
|
38
|
+
puts time
|
39
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# This is a copy of bin/run_range but with timing code.
|
5
|
+
# Usage:
|
6
|
+
#
|
7
|
+
# ./bin/benchmarks/run_range aUser aPassword 127.0.0.1 8332 2023-10-01 2023-10-05
|
8
|
+
#
|
9
|
+
# Note: Too long of a range will crash the program.
|
10
|
+
# Bitcoin Core has limits:
|
11
|
+
# https://github.com/bitcoin/bitcoin/blob/c0ddd32bf629bb48426b0651def497ca1a78e6b1/src/httpserver.h#L12-L14
|
12
|
+
# for threads, queue and timeout.
|
13
|
+
#
|
14
|
+
# With default settings, 20 days works fine.
|
15
|
+
#
|
16
|
+
# To run for a full month, I've found the following settings to work fine:
|
17
|
+
#
|
18
|
+
# rpcworkqueue=32
|
19
|
+
# rpcthreads=16
|
20
|
+
# rpctimeout=60
|
21
|
+
# Database cache 1024 MiB
|
22
|
+
|
23
|
+
require 'bundler/setup'
|
24
|
+
require 'utxoracle'
|
25
|
+
require 'benchmark'
|
26
|
+
|
27
|
+
user = ARGV[0]
|
28
|
+
password = ARGV[1]
|
29
|
+
ip = ARGV[2]
|
30
|
+
port = ARGV[3]
|
31
|
+
start_date = ARGV[4]
|
32
|
+
end_date = ARGV[5]
|
33
|
+
|
34
|
+
time = Benchmark.measure do
|
35
|
+
provider = Utxoracle::Node.new(user, password, ip, port)
|
36
|
+
batch_oracle = Utxoracle::BatchOracle.new(provider)
|
37
|
+
batch_oracle.prices(start_date, end_date)
|
38
|
+
end
|
39
|
+
|
40
|
+
puts time.real
|
data/bin/run
CHANGED
@@ -4,24 +4,12 @@
|
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'utxoracle'
|
6
6
|
|
7
|
-
user
|
8
|
-
password
|
9
|
-
ip
|
10
|
-
port
|
11
|
-
date
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
require 'stackprof'
|
17
|
-
# See https://github.com/tmm1/stackprof#sampling: for :cpu, :wall, :object
|
18
|
-
StackProf.run(mode: :wall, out: 'tmp/stackprof-wall.dump', raw: true) do
|
19
|
-
provider = Utxoracle::Node.new(user, password, ip, port)
|
20
|
-
oracle = Utxoracle::Oracle.new(provider, log = true)
|
21
|
-
oracle.price(date)
|
22
|
-
end
|
23
|
-
else
|
24
|
-
provider = Utxoracle::Node.new(user, password, ip, port)
|
25
|
-
oracle = Utxoracle::Oracle.new(provider, log = true)
|
26
|
-
oracle.price(date)
|
27
|
-
end
|
7
|
+
user = ARGV[0]
|
8
|
+
password = ARGV[1]
|
9
|
+
ip = ARGV[2]
|
10
|
+
port = ARGV[3]
|
11
|
+
date = ARGV[4]
|
12
|
+
|
13
|
+
provider = Utxoracle::Node.new(user, password, ip, port)
|
14
|
+
oracle = Utxoracle::Oracle.new(provider, log = true)
|
15
|
+
oracle.price(date)
|
data/bin/run_range
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'utxoracle'
|
6
|
+
|
7
|
+
user = ARGV[0]
|
8
|
+
password = ARGV[1]
|
9
|
+
ip = ARGV[2]
|
10
|
+
port = ARGV[3]
|
11
|
+
start_date = ARGV[4]
|
12
|
+
end_date = ARGV[5]
|
13
|
+
|
14
|
+
provider = Utxoracle::Node.new(user, password, ip, port)
|
15
|
+
batch_oracle = Utxoracle::BatchOracle.new(provider)
|
16
|
+
batch_oracle.prices(start_date, end_date)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Utxoracle
|
4
|
+
class BatchOracle
|
5
|
+
def initialize(provider, log = false)
|
6
|
+
@provider = provider
|
7
|
+
@log = log
|
8
|
+
end
|
9
|
+
|
10
|
+
def prices(start_date, end_date)
|
11
|
+
formatted_start_date = Time.parse start_date.tr('\n', '')
|
12
|
+
formatted_end_date = Time.parse end_date.tr('\n', '')
|
13
|
+
ret = {}
|
14
|
+
|
15
|
+
date = formatted_start_date
|
16
|
+
threads = []
|
17
|
+
|
18
|
+
while date < formatted_end_date
|
19
|
+
# Bind `date` to thread scope: https://ruby-doc.org/core-2.0.0/Thread.html#method-c-new
|
20
|
+
threads << Thread.new(date) do |t_date|
|
21
|
+
oracle = Utxoracle::Oracle.new(@provider, log = @log)
|
22
|
+
date_str = t_date.to_s[0..9]
|
23
|
+
ret[date_str] = oracle.price(date_str)
|
24
|
+
end
|
25
|
+
|
26
|
+
date += Utxoracle::Oracle::SECONDS_PER_DAY
|
27
|
+
end
|
28
|
+
threads.each(&:join)
|
29
|
+
|
30
|
+
puts ret
|
31
|
+
ret
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/utxoracle/oracle.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'time'
|
2
4
|
|
3
5
|
module Utxoracle
|
4
6
|
class Oracle
|
5
|
-
|
7
|
+
SECONDS_PER_DAY = 86_400
|
6
8
|
FOUR_HOURS = 14_400
|
7
9
|
MAINNET_PORT = 8332
|
8
10
|
TESTNET_PORT = 18_332
|
@@ -51,7 +53,7 @@ module Utxoracle
|
|
51
53
|
latest_utc_midnight = Time.new(latest_year, latest_month, latest_day).utc
|
52
54
|
|
53
55
|
latest_time_in_seconds = blockheader['time']
|
54
|
-
yesterday_seconds = latest_time_in_seconds -
|
56
|
+
yesterday_seconds = latest_time_in_seconds - SECONDS_PER_DAY
|
55
57
|
latest_price_day = Time.at(yesterday_seconds).utc
|
56
58
|
latest_price_date = latest_price_day.utc.strftime('%Y-%m-%d')
|
57
59
|
|
@@ -59,7 +61,7 @@ module Utxoracle
|
|
59
61
|
price_day_date_utc = @requested_date
|
60
62
|
|
61
63
|
seconds_since_price_day = latest_time_in_seconds - price_day_seconds
|
62
|
-
blocks_ago_estimate = (144 * seconds_since_price_day.to_f /
|
64
|
+
blocks_ago_estimate = (144 * seconds_since_price_day.to_f / SECONDS_PER_DAY.to_f).round
|
63
65
|
price_day_block_estimate = (block_count - blocks_ago_estimate).to_i
|
64
66
|
|
65
67
|
block_hash_b = @provider.getblockhash(price_day_block_estimate)
|
@@ -67,7 +69,7 @@ module Utxoracle
|
|
67
69
|
time_in_seconds = block_header['time']
|
68
70
|
|
69
71
|
seconds_difference = time_in_seconds - price_day_seconds
|
70
|
-
block_jump_estimate = (144.0 * seconds_difference /
|
72
|
+
block_jump_estimate = (144.0 * seconds_difference / SECONDS_PER_DAY).round
|
71
73
|
|
72
74
|
last_estimate = 0
|
73
75
|
last_last_estimate = 0
|
@@ -81,7 +83,7 @@ module Utxoracle
|
|
81
83
|
|
82
84
|
time_in_seconds = block_header['time']
|
83
85
|
seconds_difference = time_in_seconds - price_day_seconds
|
84
|
-
block_jump_estimate = (144.0 * seconds_difference /
|
86
|
+
block_jump_estimate = (144.0 * seconds_difference / SECONDS_PER_DAY).round
|
85
87
|
end
|
86
88
|
|
87
89
|
if time_in_seconds > price_day_seconds
|
data/lib/utxoracle/provider.rb
CHANGED
data/lib/utxoracle/version.rb
CHANGED
data/lib/utxoracle.rb
CHANGED
data/utxoracle.gemspec
CHANGED
@@ -21,8 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.bindir = 'bin'
|
22
22
|
spec.require_path = 'lib'
|
23
23
|
|
24
|
-
spec.add_dependency 'typhoeus', '~> 1.4.0'
|
25
24
|
spec.add_dependency 'cleanrpc', '~> 0.0.2'
|
25
|
+
spec.add_dependency 'typhoeus', '~> 1.4.0'
|
26
26
|
|
27
27
|
spec.add_development_dependency 'pry'
|
28
28
|
spec.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: utxoracle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Gardner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: cleanrpc
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.0.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.0.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: typhoeus
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.4.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.4.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,9 +164,13 @@ files:
|
|
164
164
|
- LICENSE
|
165
165
|
- README.md
|
166
166
|
- Rakefile
|
167
|
+
- bin/benchmarks/run
|
168
|
+
- bin/benchmarks/run_range
|
167
169
|
- bin/console
|
168
170
|
- bin/run
|
171
|
+
- bin/run_range
|
169
172
|
- lib/utxoracle.rb
|
173
|
+
- lib/utxoracle/batch_oracle.rb
|
170
174
|
- lib/utxoracle/oracle.rb
|
171
175
|
- lib/utxoracle/provider.rb
|
172
176
|
- lib/utxoracle/providers/mempool.rb
|
@@ -196,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
196
200
|
- !ruby/object:Gem::Version
|
197
201
|
version: '0'
|
198
202
|
requirements: []
|
199
|
-
rubygems_version: 3.4.
|
203
|
+
rubygems_version: 3.4.10
|
200
204
|
signing_key:
|
201
205
|
specification_version: 4
|
202
206
|
summary: Offline price oracle for Bitcoin.
|