meeseeker 0.0.7 → 0.0.8
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 +5 -5
- data/README.md +1 -1
- data/Rakefile +10 -5
- data/lib/meeseeker/block_follower_job.rb +8 -8
- data/lib/meeseeker/steem_engine/follower_job.rb +60 -7
- data/lib/meeseeker/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 3204b511fca2e18ee8612eb32cd520edaf8bc72e
|
|
4
|
+
data.tar.gz: 803ab700225d7781a0de824ed1f3221f1dce8033
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '079b763077af4e430b84183e96b2bc683668a89677aa6d90bf4238f8a1533200c1c0c64ffe3e00a2f838ecb1e99e6c12a93f3be9ea4e188b24e501de8cd596cd'
|
|
7
|
+
data.tar.gz: 13cc852acec9b743017e20dc58c6566f9acb0f513a0feb30187536540abe8cd6aacb09707f981adf0f69022b5bdb699211fb76096c6a8ee84d310ea1869ef109
|
data/README.md
CHANGED
|
@@ -121,7 +121,7 @@ When running `meeseeker sync`, the following channels are available:
|
|
|
121
121
|
|
|
122
122
|
As mentioned in the first `whatever` example, for ops, [all operation types](https://developers.steem.io/apidefinitions/broadcast-ops) can be subscribed to as channels, including virtual operations, if enabled.
|
|
123
123
|
|
|
124
|
-
In the second `whatever` example, for `custom_json.id`, if you want to subscribe to the `follow` channel, use `steem:op:custom_json:follow`. Or if you want to subscribe to the `sm_team_reveal` channel, use `steem:op:custom_json:
|
|
124
|
+
In the second `whatever` example, for `custom_json.id`, if you want to subscribe to the `follow` channel, use `steem:op:custom_json:follow`. Or if you want to subscribe to the `sm_team_reveal` channel, use `steem:op:custom_json:sm_team_reveal`. The `custom_json.id` channels are not enabled by default. To enable it, set the `MEESEEKER_PUBLISH_OP_CUSTOM_ID` to `true` (see example below).
|
|
125
125
|
|
|
126
126
|
For example, from `redis-cli`, if we wanted to stream block numbers:
|
|
127
127
|
|
data/Rakefile
CHANGED
|
@@ -99,8 +99,11 @@ task :reset, [:chain] => [:check_schema] do |t, args|
|
|
|
99
99
|
print 'Dropping keys for set: %s ...' % chain.to_s
|
|
100
100
|
|
|
101
101
|
case chain
|
|
102
|
-
when :steem
|
|
103
|
-
when :steem_engine
|
|
102
|
+
when :steem then keys += Meeseeker.redis.keys('steem:*')
|
|
103
|
+
when :steem_engine then keys += Meeseeker.redis.keys('steem_engine:*')
|
|
104
|
+
when :all
|
|
105
|
+
keys += Meeseeker.redis.keys('steem:*')
|
|
106
|
+
keys += Meeseeker.redis.keys('steem_engine:*')
|
|
104
107
|
end
|
|
105
108
|
|
|
106
109
|
if keys.any?
|
|
@@ -323,12 +326,13 @@ namespace :verify do
|
|
|
323
326
|
|
|
324
327
|
# If we have all the keys, we should also have all transaction ids.
|
|
325
328
|
expected_ids = keys.map { |k| k.split(':')[2] }.uniq
|
|
329
|
+
expected_ids -= [Meeseeker::VIRTUAL_TRX_ID]
|
|
326
330
|
actual_ids = nil
|
|
327
331
|
|
|
328
332
|
agent.block(block_num).tap do |block|
|
|
329
333
|
raise 'Got empty block result.' if block.nil?
|
|
330
334
|
|
|
331
|
-
actual_ids = block['transactions'].map{|trx| trx['transactionId'].split('-').first}.uniq
|
|
335
|
+
actual_ids = block['transactions'].map{|trx| trx['transactionId'].to_s.split('-').first}.uniq
|
|
332
336
|
end
|
|
333
337
|
|
|
334
338
|
# We do an intersection to make sure there's no difference between
|
|
@@ -360,6 +364,8 @@ namespace :verify do
|
|
|
360
364
|
end
|
|
361
365
|
end
|
|
362
366
|
end
|
|
367
|
+
|
|
368
|
+
agent.shutdown
|
|
363
369
|
end
|
|
364
370
|
|
|
365
371
|
desc 'Verifies Steem Engine sidechain against the mainnet.'
|
|
@@ -377,7 +383,7 @@ namespace :verify do
|
|
|
377
383
|
block_num = transaction['refSteemBlockNumber']
|
|
378
384
|
|
|
379
385
|
block_trxs[block_num] ||= []
|
|
380
|
-
block_trxs[block_num] << transaction['transactionId'].split('-').first
|
|
386
|
+
block_trxs[block_num] << transaction['transactionId'].to_s.split('-').first
|
|
381
387
|
end
|
|
382
388
|
|
|
383
389
|
puts "Related mainnet blocks: #{block_trxs.keys.size}"
|
|
@@ -457,7 +463,6 @@ namespace :verify do
|
|
|
457
463
|
schedule_channel = 'steem:witness:schedule'
|
|
458
464
|
redis_url = ENV.fetch('MEESEEKER_REDIS_URL', 'redis://127.0.0.1:6379/0')
|
|
459
465
|
subscription = Redis.new(url: redis_url)
|
|
460
|
-
ctx = Redis.new(url: redis_url)
|
|
461
466
|
timeout = (max_blocks).to_i * 3
|
|
462
467
|
|
|
463
468
|
subscribe_mode, subscribe_args = if timeout > 0
|
|
@@ -18,7 +18,7 @@ module Meeseeker
|
|
|
18
18
|
trx_index += 1
|
|
19
19
|
else
|
|
20
20
|
if !!last_key_prefix
|
|
21
|
-
|
|
21
|
+
_, b, t = last_key_prefix.split(':')
|
|
22
22
|
transaction_payload = {
|
|
23
23
|
block_num: b.to_i,
|
|
24
24
|
transaction_id: t,
|
|
@@ -129,12 +129,12 @@ module Meeseeker
|
|
|
129
129
|
# to embed it into op values. This should also reduce streaming
|
|
130
130
|
# overhead since we no longer stream block_headers inder the hood.
|
|
131
131
|
|
|
132
|
-
stream.blocks(options) do |
|
|
133
|
-
|
|
132
|
+
stream.blocks(options) do |b, n|
|
|
133
|
+
b.transactions.each_with_index do |transaction, index|
|
|
134
134
|
transaction.operations.each do |op|
|
|
135
|
-
op = op.merge(timestamp:
|
|
135
|
+
op = op.merge(timestamp: b.timestamp)
|
|
136
136
|
|
|
137
|
-
yield op,
|
|
137
|
+
yield op, b.transaction_ids[index], n
|
|
138
138
|
end
|
|
139
139
|
end
|
|
140
140
|
|
|
@@ -152,7 +152,7 @@ module Meeseeker
|
|
|
152
152
|
|
|
153
153
|
loop do
|
|
154
154
|
condenser_api ||= Steem::CondenserApi.new(url: Meeseeker.node_url)
|
|
155
|
-
condenser_api.get_ops_in_block(
|
|
155
|
+
condenser_api.get_ops_in_block(n, true) do |vops|
|
|
156
156
|
redo if vops.nil?
|
|
157
157
|
|
|
158
158
|
if vops.empty? && mode != :head
|
|
@@ -169,13 +169,13 @@ module Meeseeker
|
|
|
169
169
|
redo
|
|
170
170
|
end
|
|
171
171
|
|
|
172
|
-
puts "Gave up retrying virtual ops lookup on block #{
|
|
172
|
+
puts "Gave up retrying virtual ops lookup on block #{n}"
|
|
173
173
|
|
|
174
174
|
break
|
|
175
175
|
end
|
|
176
176
|
|
|
177
177
|
if retries > 0
|
|
178
|
-
puts "Found virtual ops for block #{
|
|
178
|
+
puts "Found virtual ops for block #{n} aftere #{retries} retrie(s)"
|
|
179
179
|
end
|
|
180
180
|
|
|
181
181
|
vops.each do |vop|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
module Meeseeker::SteemEngine
|
|
2
|
+
MAX_RETRY_INTERVAL = 18.0
|
|
3
|
+
|
|
2
4
|
class FollowerJob
|
|
3
5
|
def perform(options = {})
|
|
4
6
|
redis = Meeseeker.redis
|
|
@@ -7,9 +9,12 @@ module Meeseeker::SteemEngine
|
|
|
7
9
|
current_block_num = nil
|
|
8
10
|
block_transactions = []
|
|
9
11
|
|
|
10
|
-
stream_transactions(options) do |
|
|
12
|
+
stream_transactions(options) do |data, block|
|
|
13
|
+
transaction = data[:transaction]
|
|
14
|
+
virtual = !!data[:virtual]
|
|
15
|
+
|
|
11
16
|
begin
|
|
12
|
-
trx_id = transaction['transactionId'].split('-').first
|
|
17
|
+
trx_id = transaction['transactionId'].to_s.split('-').first
|
|
13
18
|
block_num = block['blockNumber']
|
|
14
19
|
current_key_prefix = "steem_engine:#{block_num}:#{trx_id}"
|
|
15
20
|
contract = transaction['contract']
|
|
@@ -19,7 +24,7 @@ module Meeseeker::SteemEngine
|
|
|
19
24
|
trx_index += 1
|
|
20
25
|
else
|
|
21
26
|
if !!last_key_prefix
|
|
22
|
-
|
|
27
|
+
_, b, t = last_key_prefix.split(':')
|
|
23
28
|
transaction_payload = {
|
|
24
29
|
block_num: b.to_i,
|
|
25
30
|
transaction_id: t,
|
|
@@ -27,7 +32,14 @@ module Meeseeker::SteemEngine
|
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
block_transactions << trx_id
|
|
30
|
-
|
|
35
|
+
|
|
36
|
+
trx_pub_key = if !!virtual
|
|
37
|
+
'steem_engine:virtual_transaction'
|
|
38
|
+
else
|
|
39
|
+
'steem_engine:transaction'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
redis.publish(trx_pub_key, transaction_payload.to_json)
|
|
31
43
|
end
|
|
32
44
|
|
|
33
45
|
last_key_prefix = "steem_engine:#{block_num}:#{trx_id}"
|
|
@@ -57,10 +69,31 @@ module Meeseeker::SteemEngine
|
|
|
57
69
|
end
|
|
58
70
|
end
|
|
59
71
|
private
|
|
72
|
+
def agent
|
|
73
|
+
@agent ||= Agent.new
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def agent_reset
|
|
77
|
+
return if @agent.nil?
|
|
78
|
+
|
|
79
|
+
@agent.shutdown
|
|
80
|
+
@agent = nil
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def retry_interval
|
|
84
|
+
@retry_interval ||= 0.1
|
|
85
|
+
@retry_interval *= 2
|
|
86
|
+
|
|
87
|
+
[@retry_interval, MAX_RETRY_INTERVAL].min
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def reset_retry_interval
|
|
91
|
+
@retry_interval = nil
|
|
92
|
+
end
|
|
93
|
+
|
|
60
94
|
def stream_transactions(options = {}, &block)
|
|
61
95
|
redis = Meeseeker.redis
|
|
62
96
|
last_block_num = nil
|
|
63
|
-
agent = Agent.new
|
|
64
97
|
until_block_num = options[:until_block_num].to_i
|
|
65
98
|
|
|
66
99
|
if !!options[:at_block_num]
|
|
@@ -96,7 +129,15 @@ module Meeseeker::SteemEngine
|
|
|
96
129
|
block_num = last_block_num
|
|
97
130
|
|
|
98
131
|
loop do
|
|
99
|
-
|
|
132
|
+
begin
|
|
133
|
+
block = agent.block(block_num)
|
|
134
|
+
reset_retry_interval
|
|
135
|
+
rescue Net::HTTP::Persistent::Error => e
|
|
136
|
+
puts "Retrying: #{e}"
|
|
137
|
+
agent_reset
|
|
138
|
+
sleep retry_interval
|
|
139
|
+
redo
|
|
140
|
+
end
|
|
100
141
|
|
|
101
142
|
if block.nil?
|
|
102
143
|
sleep 3 # sleep for one mainnet block interval
|
|
@@ -106,7 +147,19 @@ module Meeseeker::SteemEngine
|
|
|
106
147
|
transactions = block['transactions']
|
|
107
148
|
|
|
108
149
|
transactions.each do |transaction|
|
|
109
|
-
yield transaction.merge(timestamp: block['timestamp']), block
|
|
150
|
+
yield({transaction: transaction.merge(timestamp: block['timestamp'])}, block)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
virtual_transactions = block['virtualTransactions']
|
|
154
|
+
|
|
155
|
+
virtual_transactions.each do |virtual_transaction|
|
|
156
|
+
_, vtrx_in_block = virtual_transaction['transactionId'].split('-')
|
|
157
|
+
virtual_transaction = virtual_transaction.merge(
|
|
158
|
+
timestamp: block['timestamp'],
|
|
159
|
+
'transactionId' => "#{Meeseeker::VIRTUAL_TRX_ID}-#{vtrx_in_block}"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
yield({transaction: virtual_transaction, virtual: true}, block)
|
|
110
163
|
end
|
|
111
164
|
|
|
112
165
|
break if until_block_num != 0 && block_num > until_block_num
|
data/lib/meeseeker/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: meeseeker
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Anthony Martin
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-
|
|
11
|
+
date: 2019-06-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -255,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
255
255
|
version: '0'
|
|
256
256
|
requirements: []
|
|
257
257
|
rubyforge_project:
|
|
258
|
-
rubygems_version: 2.
|
|
258
|
+
rubygems_version: 2.6.14
|
|
259
259
|
signing_key:
|
|
260
260
|
specification_version: 4
|
|
261
261
|
summary: Redis based block follower is an efficient way for multiple apps to stream
|