mirror of
https://git.wownero.com/wownero/wownero.git
synced 2024-08-15 01:03:23 +00:00
Merge pull request #6111
d20ff4f64
functional_tests: add a large (many randomx epochs) p2p reorg test (moneromooo-monero)6a0b3b1f8
functional_tests: add randomx tests (moneromooo-monero)9d42649d5
core: fix mining from a block that's not the current top (moneromooo-monero)
This commit is contained in:
commit
aefa7740c3
14 changed files with 306 additions and 55 deletions
|
@ -409,9 +409,9 @@ void test_generator::fill_nonce(cryptonote::block& blk, const difficulty_type& d
|
|||
}
|
||||
|
||||
blk.nonce = 0;
|
||||
while (!miner::find_nonce_for_given_block([blockchain](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash){
|
||||
return cryptonote::get_block_longhash(blockchain, b, hash, height, threads);
|
||||
}, blk, diffic, height)) {
|
||||
while (!miner::find_nonce_for_given_block([blockchain](const cryptonote::block &b, uint64_t height, const crypto::hash *seed_hash, unsigned int threads, crypto::hash &hash){
|
||||
return cryptonote::get_block_longhash(blockchain, b, hash, height, seed_hash, threads);
|
||||
}, blk, diffic, height, NULL)) {
|
||||
blk.timestamp++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,6 +92,9 @@ try:
|
|||
os.environ['PYTHONIOENCODING'] = 'utf-8'
|
||||
os.environ['DIFFICULTY'] = str(DIFFICULTY)
|
||||
os.environ['MAKE_TEST_SIGNATURE'] = builddir + '/tests/functional_tests/make_test_signature'
|
||||
os.environ['SEEDHASH_EPOCH_BLOCKS'] = "8"
|
||||
os.environ['SEEDHASH_EPOCH_LAG'] = "4"
|
||||
|
||||
for i in range(len(command_lines)):
|
||||
#print('Running: ' + str(command_lines[i]))
|
||||
processes.append(subprocess.Popen(command_lines[i], stdout = outputs[i]))
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
from __future__ import print_function
|
||||
import time
|
||||
import os
|
||||
|
||||
"""Test daemon mining RPC calls
|
||||
|
||||
|
@ -49,6 +50,8 @@ class MiningTest():
|
|||
self.mine(True)
|
||||
self.mine(False)
|
||||
self.submitblock()
|
||||
self.reset()
|
||||
self.test_randomx()
|
||||
|
||||
def reset(self):
|
||||
print('Resetting blockchain')
|
||||
|
@ -169,6 +172,117 @@ class MiningTest():
|
|||
assert res.height == height + i + 1
|
||||
assert res.hash == block_hash
|
||||
|
||||
def test_randomx(self):
|
||||
print("Test RandomX")
|
||||
|
||||
daemon = Daemon()
|
||||
wallet = Wallet()
|
||||
|
||||
res = daemon.get_height()
|
||||
daemon.pop_blocks(res.height - 1)
|
||||
daemon.flush_txpool()
|
||||
|
||||
epoch = int(os.environ['SEEDHASH_EPOCH_BLOCKS'])
|
||||
lag = int(os.environ['SEEDHASH_EPOCH_LAG'])
|
||||
address = '42ey1afDFnn4886T7196doS9GPMzexD9gXpsZJDwVjeRVdFCSoHnv7KPbBeGpzJBzHRCAs9UxqeoyFQMYbqSWYTfJJQAWDm'
|
||||
|
||||
# check we can generate blocks, and that the seed hash changes when expected
|
||||
res = daemon.getblocktemplate(address)
|
||||
first_seed_hash = res.seed_hash
|
||||
daemon.generateblocks(address, 1 + lag)
|
||||
res = daemon.mining_status()
|
||||
assert res.active == False
|
||||
assert res.pow_algorithm == 'RandomX'
|
||||
res = daemon.getblocktemplate(address)
|
||||
seed_hash = res.seed_hash
|
||||
t0 = time.time()
|
||||
daemon.generateblocks(address, epoch - 3)
|
||||
t0 = time.time() - t0
|
||||
res = daemon.get_info()
|
||||
assert res.height == lag + epoch - 1
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert seed_hash == res.seed_hash
|
||||
t0 = time.time()
|
||||
daemon.generateblocks(address, 1)
|
||||
t0 = time.time() - t0
|
||||
res = daemon.get_info()
|
||||
assert res.height == lag + epoch
|
||||
daemon.generateblocks(address, 1)
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert seed_hash != res.seed_hash
|
||||
new_seed_hash = res.seed_hash
|
||||
t0 = time.time()
|
||||
daemon.generateblocks(address, epoch - 1)
|
||||
t0 = time.time() - t0
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert new_seed_hash == res.seed_hash
|
||||
daemon.generateblocks(address, 1)
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert new_seed_hash != res.seed_hash
|
||||
new_seed_hash = res.seed_hash
|
||||
t0 = time.time()
|
||||
daemon.generateblocks(address, epoch - 1)
|
||||
t0 = time.time() - t0
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert new_seed_hash == res.seed_hash
|
||||
daemon.generateblocks(address, 1)
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert new_seed_hash != res.seed_hash
|
||||
#print('First mining: ' + str(t0))
|
||||
|
||||
# pop all these blocks, and feed them again to monerod
|
||||
print('Recreating the chain')
|
||||
res = daemon.get_info()
|
||||
height = res.height
|
||||
assert height == lag + epoch * 3 + 1
|
||||
block_hashes = [x.hash for x in daemon.getblockheadersrange(0, height - 1).headers]
|
||||
assert len(block_hashes) == height
|
||||
blocks = []
|
||||
for i in range(len(block_hashes)):
|
||||
res = daemon.getblock(height = i)
|
||||
assert res.block_header.hash == block_hashes[i]
|
||||
blocks.append(res.blob)
|
||||
daemon.pop_blocks(height)
|
||||
res = daemon.get_info()
|
||||
assert res.height == 1
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert first_seed_hash == res.seed_hash
|
||||
t0 = time.time()
|
||||
for h in range(len(block_hashes)):
|
||||
res = daemon.submitblock(blocks[h])
|
||||
t0 = time.time() - t0
|
||||
res = daemon.get_info()
|
||||
assert height == res.height
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert new_seed_hash != res.seed_hash
|
||||
res = daemon.pop_blocks(1)
|
||||
res = daemon.getblocktemplate(address)
|
||||
assert new_seed_hash == res.seed_hash
|
||||
#print('Submit: ' + str(t0))
|
||||
|
||||
# start mining from the genesis block again
|
||||
print('Mining from genesis block again')
|
||||
res = daemon.get_height()
|
||||
top_hash = res.hash
|
||||
res = daemon.getblockheaderbyheight(0)
|
||||
genesis_block_hash = res.block_header.hash
|
||||
t0 = time.time()
|
||||
daemon.generateblocks(address, height - 2, prev_block = genesis_block_hash)
|
||||
t0 = time.time() - t0
|
||||
res = daemon.get_info()
|
||||
assert res.height == height - 1
|
||||
assert res.top_block_hash == top_hash
|
||||
#print('Second mining: ' + str(t0))
|
||||
|
||||
# that one will cause a huge reorg
|
||||
print('Adding one to reorg')
|
||||
res = daemon.generateblocks(address, 1)
|
||||
assert len(res.blocks) == 1
|
||||
new_top_hash = res.blocks[0]
|
||||
res = daemon.get_info()
|
||||
assert res.height == height
|
||||
assert res.top_block_hash == new_top_hash
|
||||
|
||||
|
||||
class Guard:
|
||||
def __enter__(self):
|
||||
|
|
|
@ -139,6 +139,25 @@ class P2PTest():
|
|||
assert res.height == height + 6
|
||||
assert res.top_block_hash == daemon2_top_block_hash
|
||||
|
||||
# disconnect and mine a lot on daemon3
|
||||
daemon2.out_peers(0)
|
||||
daemon3.out_peers(0)
|
||||
res = daemon3.generateblocks('42ey1afDFnn4886T7196doS9GPMzexD9gXpsZJDwVjeRVdFCSoHnv7KPbBeGpzJBzHRCAs9UxqeoyFQMYbqSWYTfJJQAWDm', 500)
|
||||
|
||||
# reconnect and wait for sync
|
||||
daemon2.out_peers(8)
|
||||
daemon3.out_peers(8)
|
||||
loops = 100
|
||||
while True:
|
||||
res2 = daemon2.get_info()
|
||||
res3 = daemon3.get_info()
|
||||
if res2.top_block_hash == res3.top_block_hash:
|
||||
break
|
||||
time.sleep(10)
|
||||
loops -= 1
|
||||
assert loops >= 0
|
||||
|
||||
|
||||
def test_p2p_tx_propagation(self):
|
||||
print('Testing P2P tx propagation')
|
||||
daemon2 = Daemon(idx = 2)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue