Skip to content

Commit 38ffcc7

Browse files
authored
Merge pull request #754 from nervosnetwork/rc/v0.12.2
Rc/v0.12.2
2 parents b0c6a3a + 0e1d676 commit 38ffcc7

File tree

5 files changed

+110
-21
lines changed

5 files changed

+110
-21
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# [v0.12.2](https://github.com/nervosnetwork/ckb-explorer/compare/v0.12.1...v0.12.2) (2020-12-17)
2+
3+
### Bug Fixes
4+
5+
[#753](https://github.com/nervosnetwork/ckb-explorer/pull/753): fix address cache bug
6+
17
# [v0.12.1](https://github.com/nervosnetwork/ckb-explorer/compare/v0.12.0...v0.12.1) (2020-11-30)
28

39

Gemfile.lock

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ GEM
9191
builder (3.2.4)
9292
chronic_duration (0.10.6)
9393
numerizer (~> 0.1.1)
94-
codecov (0.2.8)
94+
codecov (0.2.12)
9595
json
9696
simplecov
9797
coderay (1.1.2)
@@ -162,7 +162,7 @@ GEM
162162
i18n (1.8.5)
163163
concurrent-ruby (~> 1.0)
164164
jaro_winkler (1.5.2)
165-
json (2.3.1)
165+
json (2.4.1)
166166
kaminari (1.2.1)
167167
activesupport (>= 4.1.0)
168168
kaminari-actionview (= 1.2.1)
@@ -310,10 +310,12 @@ GEM
310310
concurrent-ruby (~> 1.0, >= 1.0.5)
311311
sidekiq (>= 4.0, < 7.0)
312312
thor (~> 0)
313-
simplecov (0.19.0)
313+
simplecov (0.20.0)
314314
docile (~> 1.1)
315315
simplecov-html (~> 0.11)
316-
simplecov-html (0.12.2)
316+
simplecov_json_formatter (~> 0.1)
317+
simplecov-html (0.12.3)
318+
simplecov_json_formatter (0.1.2)
317319
spring (2.1.0)
318320
spring-watcher-listen (2.0.1)
319321
listen (>= 2.7, < 4.0)

RELEASENOTES.md

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
1-
# [v0.12.1](https://github.com/nervosnetwork/ckb-explorer/compare/v0.12.0...v0.12.1) (2020-11-30)
2-
1+
# [v0.12.2](https://github.com/nervosnetwork/ckb-explorer/compare/v0.12.1...v0.12.2) (2020-12-17)
32

43
### Bug Fixes
54

6-
[#749](https://github.com/nervosnetwork/ckb-explorer/pull/749): fix dao contract cache bug
7-
8-
9-
### Features
10-
11-
[#747](https://github.com/nervosnetwork/ckb-explorer/pull/747): support short acp address
12-
5+
[#753](https://github.com/nervosnetwork/ckb-explorer/pull/753): fix address cache bug

app/models/address.rb

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,26 @@ def self.find_address!(query_key)
5353
end
5454

5555
def self.cached_find(query_key)
56-
Rails.cache.realize([name, query_key], race_condition_ttl: 3.seconds) do
56+
cache_key = query_key
57+
unless QueryKeyUtils.valid_hex?(query_key)
58+
cache_key = CkbUtils.parse_address(query_key).script.compute_hash
59+
end
60+
address = Rails.cache.realize([name, cache_key], race_condition_ttl: 3.seconds) do
5761
if QueryKeyUtils.valid_hex?(query_key)
5862
find_by(lock_hash: query_key)
5963
else
6064
lock_hash = CkbUtils.parse_address(query_key).script.compute_hash
61-
address = find_by(lock_hash: lock_hash)
62-
if address.present?
63-
address.query_address = query_key
64-
address
65-
else
66-
NullAddress.new(query_key)
67-
end
65+
find_by(lock_hash: lock_hash)
6866
end
6967
end
68+
unless QueryKeyUtils.valid_hex?(query_key)
69+
if address.present?
70+
address.query_address = query_key
71+
else
72+
address = NullAddress.new(query_key)
73+
end
74+
end
75+
address
7076
end
7177

7278
def cached_lock_script

test/models/address_test.rb

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,4 +216,86 @@ class AddressTest < ActiveSupport::TestCase
216216

217217
assert_equal [], address.ckb_udt_transactions(123)
218218
end
219+
220+
test "cached find cache key is lock_hash for short payload address" do
221+
redis_cache_store = ActiveSupport::Cache.lookup_store(:redis_cache_store)
222+
Rails.stubs(:cache).returns(redis_cache_store)
223+
Rails.cache.extend(CacheRealizer)
224+
lock_script = CKB::Types::Script.new(code_hash: "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8", hash_type: "type", args: "0xdde7801c073dfb3464c7b1f05b806bb2bbb84e99")
225+
addr = CKB::Address.new(lock_script).generate
226+
address = Address.find_or_create_address(lock_script, Time.current.to_i)
227+
address = Address.cached_find(addr)
228+
assert_equal address, Rails.cache.realize("Address/#{lock_script.compute_hash}")
229+
end
230+
231+
test "cached find cache key is lock_hash for full payload address" do
232+
redis_cache_store = ActiveSupport::Cache.lookup_store(:redis_cache_store)
233+
Rails.stubs(:cache).returns(redis_cache_store)
234+
Rails.cache.extend(CacheRealizer)
235+
lock_script = CKB::Types::Script.new(code_hash: "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8", hash_type: "type", args: "0xdde7801c073dfb3464c7b1f05b806bb2bbb84e99")
236+
addr = CKB::Address.new(lock_script).send(:generate_full_payload_address)
237+
address = Address.find_or_create_address(lock_script, Time.current.to_i)
238+
address = Address.cached_find(addr)
239+
assert_equal address, Rails.cache.realize("Address/#{lock_script.compute_hash}")
240+
end
241+
242+
test "cached find returned address's query address should be short payload address when query key is short payload address" do
243+
redis_cache_store = ActiveSupport::Cache.lookup_store(:redis_cache_store)
244+
Rails.stubs(:cache).returns(redis_cache_store)
245+
Rails.cache.extend(CacheRealizer)
246+
lock_script = CKB::Types::Script.new(code_hash: "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8", hash_type: "type", args: "0xdde7801c073dfb3464c7b1f05b806bb2bbb84e99")
247+
addr = CKB::Address.new(lock_script).generate
248+
full_addr = CKB::Address.new(lock_script).send(:generate_full_payload_address)
249+
Address.find_or_create_address(lock_script, Time.current.to_i)
250+
Address.cached_find(full_addr)
251+
address = Address.cached_find(addr)
252+
253+
assert_equal addr, address.query_address
254+
end
255+
256+
test "cached find returned address's query address should be short payload address when query key is full payload address" do
257+
redis_cache_store = ActiveSupport::Cache.lookup_store(:redis_cache_store)
258+
Rails.stubs(:cache).returns(redis_cache_store)
259+
Rails.cache.extend(CacheRealizer)
260+
lock_script = CKB::Types::Script.new(code_hash: "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8", hash_type: "type", args: "0xdde7801c073dfb3464c7b1f05b806bb2bbb84e99")
261+
addr = CKB::Address.new(lock_script).generate
262+
full_addr = CKB::Address.new(lock_script).send(:generate_full_payload_address)
263+
Address.find_or_create_address(lock_script, Time.current.to_i)
264+
Address.cached_find(addr)
265+
address = Address.cached_find(full_addr)
266+
267+
assert_equal full_addr, address.query_address
268+
end
269+
270+
test "cached find should return nil when query key is a hex string and there is no matched record" do
271+
redis_cache_store = ActiveSupport::Cache.lookup_store(:redis_cache_store)
272+
Rails.stubs(:cache).returns(redis_cache_store)
273+
Rails.cache.extend(CacheRealizer)
274+
address = Address.cached_find("0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8")
275+
276+
assert_nil address
277+
end
278+
279+
test "cached find should return null address when there is no matched record" do
280+
redis_cache_store = ActiveSupport::Cache.lookup_store(:redis_cache_store)
281+
Rails.stubs(:cache).returns(redis_cache_store)
282+
Rails.cache.extend(CacheRealizer)
283+
lock_script = CKB::Types::Script.new(code_hash: "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8", hash_type: "type", args: "0xdde7801c073dfb3464c7b1f05b806bb2bbb84e99")
284+
addr = CKB::Address.new(lock_script).generate
285+
address = Address.cached_find(addr)
286+
expected_address = NullAddress.new(addr)
287+
assert_equal expected_address.query_address, address.query_address
288+
end
289+
290+
test "cached find should returned corresponding address when query key is hex string and there is a matched record" do
291+
redis_cache_store = ActiveSupport::Cache.lookup_store(:redis_cache_store)
292+
Rails.stubs(:cache).returns(redis_cache_store)
293+
Rails.cache.extend(CacheRealizer)
294+
lock_script = CKB::Types::Script.new(code_hash: "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8", hash_type: "type", args: "0xdde7801c073dfb3464c7b1f05b806bb2bbb84e99")
295+
full_addr = CKB::Address.new(lock_script).send(:generate_full_payload_address)
296+
address = Address.find_or_create_address(lock_script, Time.current.to_i)
297+
actual_address = Address.cached_find(lock_script.compute_hash)
298+
299+
assert_equal address, actual_address
300+
end
219301
end

0 commit comments

Comments
 (0)