Added description of what's going on in the tests

This commit is contained in:
vub 2017-03-26 05:34:27 -04:00
parent e790aaf02f
commit 952179fc52
1 changed files with 42 additions and 0 deletions

View File

@ -55,26 +55,31 @@ def mk_status_flicker(epoch, login, key):
# Begin the test # Begin the test
print("Starting tests")
# Initialize the first epoch # Initialize the first epoch
s.state.block_number = EPOCH_LENGTH s.state.block_number = EPOCH_LENGTH
casper.initialize_epoch(1) casper.initialize_epoch(1)
assert casper.get_nextValidatorIndex() == 1 assert casper.get_nextValidatorIndex() == 1
start = s.snapshot() start = s.snapshot()
print("Epoch initialized")
# Send a prepare message # Send a prepare message
casper.prepare(0, mk_prepare(1, '\x35' * 32, '\x00' * 32, 0, '\x00' * 32, t.k0)) casper.prepare(0, mk_prepare(1, '\x35' * 32, '\x00' * 32, 0, '\x00' * 32, t.k0))
epoch_1_anchash = utils.sha3(b'\x35' * 32 + b'\x00' * 32) epoch_1_anchash = utils.sha3(b'\x35' * 32 + b'\x00' * 32)
assert casper.get_consensus_messages__hash_justified(1, b'\x35' * 32) assert casper.get_consensus_messages__hash_justified(1, b'\x35' * 32)
assert casper.get_consensus_messages__ancestry_hash_justified(1, epoch_1_anchash) assert casper.get_consensus_messages__ancestry_hash_justified(1, epoch_1_anchash)
print("Prepare message processed")
# Send a commit message # Send a commit message
casper.commit(0, mk_commit(1, '\x35' * 32, t.k0)) casper.commit(0, mk_commit(1, '\x35' * 32, t.k0))
# Check that we committed # Check that we committed
assert casper.get_consensus_messages__committed(1) assert casper.get_consensus_messages__committed(1)
print("Commit message processed")
# Initialize the second epoch # Initialize the second epoch
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(2) casper.initialize_epoch(2)
# Check that the dynasty increased as expected # Check that the dynasty increased as expected
assert casper.get_dynasty() == 1 assert casper.get_dynasty() == 1
assert casper.get_total_deposits(1) == casper.get_total_deposits(0) > 0 assert casper.get_total_deposits(1) == casper.get_total_deposits(0) > 0
print("Second epoch initialized, dynasty increased as expected")
# Send a prepare message # Send a prepare message
casper.prepare(0, mk_prepare(2, '\x45' * 32, epoch_1_anchash, 1, epoch_1_anchash, t.k0)) casper.prepare(0, mk_prepare(2, '\x45' * 32, epoch_1_anchash, 1, epoch_1_anchash, t.k0))
# Send a commit message # Send a commit message
@ -87,17 +92,20 @@ assert casper.get_consensus_messages__committed(2)
# Initialize the third epoch # Initialize the third epoch
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(3) casper.initialize_epoch(3)
print("Second epoch prepared and committed, third epoch initialized")
# Test the NO_DBL_PREPARE slashing condition # Test the NO_DBL_PREPARE slashing condition
p1 = mk_prepare(3, '\x56' * 32, epoch_2_anchash, 2, epoch_2_anchash, t.k0) p1 = mk_prepare(3, '\x56' * 32, epoch_2_anchash, 2, epoch_2_anchash, t.k0)
p2 = mk_prepare(3, '\x57' * 32, epoch_2_anchash, 2, epoch_2_anchash, t.k0) p2 = mk_prepare(3, '\x57' * 32, epoch_2_anchash, 2, epoch_2_anchash, t.k0)
snapshot = s.snapshot() snapshot = s.snapshot()
casper.double_prepare_slash(0, p1, p2) casper.double_prepare_slash(0, p1, p2)
s.revert(snapshot) s.revert(snapshot)
print("NO_DBL_PREPARE slashing condition works")
# Test the PREPARE_COMMIT_CONSISTENCY slashing condition # Test the PREPARE_COMMIT_CONSISTENCY slashing condition
p3 = mk_prepare(3, '\x58' * 32, epoch_2_anchash, 0, b'\x00' * 32, t.k0) p3 = mk_prepare(3, '\x58' * 32, epoch_2_anchash, 0, b'\x00' * 32, t.k0)
snapshot = s.snapshot() snapshot = s.snapshot()
casper.prepare_commit_inconsistency_slash(0, p3, epoch_2_commit) casper.prepare_commit_inconsistency_slash(0, p3, epoch_2_commit)
s.revert(snapshot) s.revert(snapshot)
print("PREPARE_COMMIT_CONSISTENCY slashing condition works")
# Finish the third epoch # Finish the third epoch
casper.prepare(0, p1) casper.prepare(0, p1)
casper.commit(0, mk_commit(3, '\x56' * 32, t.k0)) casper.commit(0, mk_commit(3, '\x56' * 32, t.k0))
@ -114,6 +122,7 @@ p4 = mk_prepare(4, '\x78' * 32, '\x12' * 32, 3, '\x24' * 32, t.k0)
# Initialize the fifth epoch # Initialize the fifth epoch
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(5) casper.initialize_epoch(5)
print("Epochs up to 5 initialized")
# Dynasty not incremented because no commits were made # Dynasty not incremented because no commits were made
assert casper.get_dynasty() == 3 assert casper.get_dynasty() == 3
epoch_5_anchash = utils.sha3(b'\x78' * 32 + epoch_4_anchash) epoch_5_anchash = utils.sha3(b'\x78' * 32 + epoch_4_anchash)
@ -122,8 +131,10 @@ casper.prepare(0, p5)
# Test the COMMIT_REQ slashing condition # Test the COMMIT_REQ slashing condition
kommit = mk_commit(5, b'\x80' * 32, t.k0) kommit = mk_commit(5, b'\x80' * 32, t.k0)
s.state.block_number += EPOCH_LENGTH * 30 s.state.block_number += EPOCH_LENGTH * 30
print("Speeding up time to test remaining two slashing conditions")
for i in range(6, 36): for i in range(6, 36):
casper.initialize_epoch(i) casper.initialize_epoch(i)
print("Epochs up to 36 initialized")
snapshot = s.snapshot() snapshot = s.snapshot()
casper.commit_non_justification_slash(0, kommit) casper.commit_non_justification_slash(0, kommit)
s.revert(snapshot) s.revert(snapshot)
@ -133,6 +144,7 @@ try:
except: except:
success = False success = False
assert not success assert not success
print("COMMIT_REQ slashing condition works")
# Test the PREPARE_REQ slashing condition # Test the PREPARE_REQ slashing condition
casper.derive_ancestry(epoch_3_anchash, epoch_2_anchash, epoch_1_anchash) casper.derive_ancestry(epoch_3_anchash, epoch_2_anchash, epoch_1_anchash)
snapshot = s.snapshot() snapshot = s.snapshot()
@ -144,31 +156,40 @@ try:
except: except:
success = False success = False
assert not success assert not success
print("PREPARE_REQ slashing condition works")
print("Restarting the chain for test 2")
# Restart the chain # Restart the chain
s.revert(start) s.revert(start)
assert casper.get_dynasty() == 0 assert casper.get_dynasty() == 0
assert casper.get_current_epoch() == 1 assert casper.get_current_epoch() == 1
assert casper.get_consensus_messages__ancestry_hash_justified(0, b'\x00' * 32) assert casper.get_consensus_messages__ancestry_hash_justified(0, b'\x00' * 32)
print("Epoch 1 initialized")
for k in (t.k1, t.k2, t.k3, t.k4, t.k5, t.k6): for k in (t.k1, t.k2, t.k3, t.k4, t.k5, t.k6):
casper.deposit(utils.privtoaddr(k), utils.privtoaddr(k), value=3 * 10**15) casper.deposit(utils.privtoaddr(k), utils.privtoaddr(k), value=3 * 10**15)
print("Processed 6 deposits")
casper.prepare(0, mk_prepare(1, b'\x10' * 32, b'\x00' * 32, 0, b'\x00' * 32, t.k0)) casper.prepare(0, mk_prepare(1, b'\x10' * 32, b'\x00' * 32, 0, b'\x00' * 32, t.k0))
casper.commit(0, mk_commit(1, b'\x10' * 32, t.k0)) casper.commit(0, mk_commit(1, b'\x10' * 32, t.k0))
epoch_1_anchash = utils.sha3(b'\x10' * 32 + b'\x00' * 32) epoch_1_anchash = utils.sha3(b'\x10' * 32 + b'\x00' * 32)
assert casper.get_consensus_messages__committed(1) assert casper.get_consensus_messages__committed(1)
print("Prepared and committed")
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(2) casper.initialize_epoch(2)
print("Epoch 2 initialized")
assert casper.get_dynasty() == 1 assert casper.get_dynasty() == 1
casper.prepare(0, mk_prepare(2, b'\x20' * 32, epoch_1_anchash, 1, epoch_1_anchash, t.k0)) casper.prepare(0, mk_prepare(2, b'\x20' * 32, epoch_1_anchash, 1, epoch_1_anchash, t.k0))
casper.commit(0, mk_commit(2, b'\x20' * 32, t.k0)) casper.commit(0, mk_commit(2, b'\x20' * 32, t.k0))
epoch_2_anchash = utils.sha3(b'\x20' * 32 + epoch_1_anchash) epoch_2_anchash = utils.sha3(b'\x20' * 32 + epoch_1_anchash)
assert casper.get_consensus_messages__committed(2) assert casper.get_consensus_messages__committed(2)
print("Confirmed that one key is still sufficient to prepare and commit")
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(3) casper.initialize_epoch(3)
print("Epoch 3 initialized")
assert casper.get_dynasty() == 2 assert casper.get_dynasty() == 2
assert 3 * 10**15 <= casper.get_total_deposits(0) < 4 * 10**15 assert 3 * 10**15 <= casper.get_total_deposits(0) < 4 * 10**15
assert 3 * 10**15 <= casper.get_total_deposits(1) < 4 * 10**15 assert 3 * 10**15 <= casper.get_total_deposits(1) < 4 * 10**15
assert 21 * 10**15 <= casper.get_total_deposits(2) < 22 * 10**15 assert 21 * 10**15 <= casper.get_total_deposits(2) < 22 * 10**15
print("Confirmed new total_deposits")
try: try:
# Try to log out, but sign with the wrong key # Try to log out, but sign with the wrong key
casper.flick_status(0, mk_status_flicker(3, 0, t.k1)) casper.flick_status(0, mk_status_flicker(3, 0, t.k1))
@ -180,6 +201,7 @@ assert not success
casper.flick_status(4, mk_status_flicker(3, 0, t.k4)) casper.flick_status(4, mk_status_flicker(3, 0, t.k4))
casper.flick_status(5, mk_status_flicker(3, 0, t.k5)) casper.flick_status(5, mk_status_flicker(3, 0, t.k5))
casper.flick_status(6, mk_status_flicker(3, 0, t.k6)) casper.flick_status(6, mk_status_flicker(3, 0, t.k6))
print("Logged out three validators")
# Validators leave the fwd validator set in dynasty 4 # Validators leave the fwd validator set in dynasty 4
assert casper.get_validators__dynasty_end(4) == 4 assert casper.get_validators__dynasty_end(4) == 4
epoch_3_anchash = utils.sha3(b'\x30' * 32 + epoch_2_anchash) epoch_3_anchash = utils.sha3(b'\x30' * 32 + epoch_2_anchash)
@ -187,24 +209,29 @@ epoch_3_anchash = utils.sha3(b'\x30' * 32 + epoch_2_anchash)
casper.prepare(0, mk_prepare(3, b'\x30' * 32, epoch_2_anchash, 2, epoch_2_anchash, t.k0)) casper.prepare(0, mk_prepare(3, b'\x30' * 32, epoch_2_anchash, 2, epoch_2_anchash, t.k0))
# Not prepared yet # Not prepared yet
assert not casper.get_consensus_messages__hash_justified(3, b'\x30' * 32) assert not casper.get_consensus_messages__hash_justified(3, b'\x30' * 32)
print("Prepare from one validator no longer sufficient")
# Prepare from 3 more validators # Prepare from 3 more validators
for i, k in ((1, t.k1), (2, t.k2), (3, t.k3)): for i, k in ((1, t.k1), (2, t.k2), (3, t.k3)):
casper.prepare(i, mk_prepare(3, b'\x30' * 32, epoch_2_anchash, 2, epoch_2_anchash, k)) casper.prepare(i, mk_prepare(3, b'\x30' * 32, epoch_2_anchash, 2, epoch_2_anchash, k))
# Still not prepared # Still not prepared
assert not casper.get_consensus_messages__hash_justified(3, b'\x30' * 32) assert not casper.get_consensus_messages__hash_justified(3, b'\x30' * 32)
print("Prepare from four of seven validators still not sufficient")
# Prepare from a firth validator # Prepare from a firth validator
casper.prepare(4, mk_prepare(3, b'\x30' * 32, epoch_2_anchash, 2, epoch_2_anchash, t.k4)) casper.prepare(4, mk_prepare(3, b'\x30' * 32, epoch_2_anchash, 2, epoch_2_anchash, t.k4))
# NOW we're prepared! # NOW we're prepared!
assert casper.get_consensus_messages__hash_justified(3, b'\x30' * 32) assert casper.get_consensus_messages__hash_justified(3, b'\x30' * 32)
print("Prepare from five of seven validators sufficient!")
# Five commits # Five commits
for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]): for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]):
casper.commit(i, mk_commit(3, b'\x30' * 32, k)) casper.commit(i, mk_commit(3, b'\x30' * 32, k))
# And we committed! # And we committed!
assert casper.get_consensus_messages__committed(3) assert casper.get_consensus_messages__committed(3)
print("Commit from five of seven validators sufficient")
# Start epoch 4 # Start epoch 4
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(4) casper.initialize_epoch(4)
assert casper.get_dynasty() == 3 assert casper.get_dynasty() == 3
print("Epoch 4 initialized")
# Prepare and commit # Prepare and commit
epoch_4_anchash = utils.sha3(b'\x40' * 32 + epoch_3_anchash) epoch_4_anchash = utils.sha3(b'\x40' * 32 + epoch_3_anchash)
for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]): for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]):
@ -212,9 +239,11 @@ for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]):
for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]): for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]):
casper.commit(i, mk_commit(4, b'\x40' * 32, k)) casper.commit(i, mk_commit(4, b'\x40' * 32, k))
assert casper.get_consensus_messages__committed(4) assert casper.get_consensus_messages__committed(4)
print("Prepared and committed")
# Start epoch 5 / dynasty 4 # Start epoch 5 / dynasty 4
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(5) casper.initialize_epoch(5)
print("Epoch 5 initialized")
assert casper.get_dynasty() == 4 assert casper.get_dynasty() == 4
assert 21 * 10**15 <= casper.get_total_deposits(3) <= 22 * 10**15 assert 21 * 10**15 <= casper.get_total_deposits(3) <= 22 * 10**15
assert 12 * 10**15 <= casper.get_total_deposits(4) <= 13 * 10**15 assert 12 * 10**15 <= casper.get_total_deposits(4) <= 13 * 10**15
@ -224,11 +253,13 @@ for i, k in enumerate([t.k0, t.k1, t.k2]):
casper.prepare(i, mk_prepare(5, b'\x50' * 32, epoch_4_anchash, 4, epoch_4_anchash, k)) casper.prepare(i, mk_prepare(5, b'\x50' * 32, epoch_4_anchash, 4, epoch_4_anchash, k))
# Three prepares are insufficient because there are still five validators in the rear validator set # Three prepares are insufficient because there are still five validators in the rear validator set
assert not casper.get_consensus_messages__hash_justified(5, b'\x50' * 32) assert not casper.get_consensus_messages__hash_justified(5, b'\x50' * 32)
print("Three prepares insufficient, as rear validator set still has seven")
# Do two more prepares # Do two more prepares
for i, k in [(3, t.k3), (4, t.k4)]: for i, k in [(3, t.k3), (4, t.k4)]:
casper.prepare(i, mk_prepare(5, b'\x50' * 32, epoch_4_anchash, 4, epoch_4_anchash, k)) casper.prepare(i, mk_prepare(5, b'\x50' * 32, epoch_4_anchash, 4, epoch_4_anchash, k))
# Now we're good! # Now we're good!
assert casper.get_consensus_messages__hash_justified(5, b'\x50' * 32) assert casper.get_consensus_messages__hash_justified(5, b'\x50' * 32)
print("Five prepares sufficient")
for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]): for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]):
casper.commit(i, mk_commit(5, b'\x50' * 32, k)) casper.commit(i, mk_commit(5, b'\x50' * 32, k))
# Committed! # Committed!
@ -237,8 +268,10 @@ assert casper.get_consensus_messages__committed(5)
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(6) casper.initialize_epoch(6)
assert casper.get_dynasty() == 5 assert casper.get_dynasty() == 5
print("Epoch 6 initialized")
# Log back in # Log back in
casper.flick_status(4, mk_status_flicker(6, 1, t.k4)) casper.flick_status(4, mk_status_flicker(6, 1, t.k4))
print("One validator logging back in")
assert casper.get_validators__dynasty_start(4) == 7 assert casper.get_validators__dynasty_start(4) == 7
# Here three prepares and three commits should be sufficient! # Here three prepares and three commits should be sufficient!
epoch_6_anchash = utils.sha3(b'\x60' * 32 + epoch_5_anchash) epoch_6_anchash = utils.sha3(b'\x60' * 32 + epoch_5_anchash)
@ -247,10 +280,12 @@ for i, k in enumerate([t.k0, t.k1, t.k2]):
for i, k in enumerate([t.k0, t.k1, t.k2]): for i, k in enumerate([t.k0, t.k1, t.k2]):
casper.commit(i, mk_commit(6, b'\x60' * 32, k)) casper.commit(i, mk_commit(6, b'\x60' * 32, k))
assert casper.get_consensus_messages__committed(6) assert casper.get_consensus_messages__committed(6)
print("Three of four prepares and commits sufficient")
# Start epoch 7 / dynasty 6 # Start epoch 7 / dynasty 6
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(7) casper.initialize_epoch(7)
assert casper.get_dynasty() == 6 assert casper.get_dynasty() == 6
print("Epoch 7 initialized")
# Here three prepares and three commits should be sufficient! # Here three prepares and three commits should be sufficient!
epoch_7_anchash = utils.sha3(b'\x70' * 32 + epoch_6_anchash) epoch_7_anchash = utils.sha3(b'\x70' * 32 + epoch_6_anchash)
for i, k in enumerate([t.k0, t.k1, t.k2]): for i, k in enumerate([t.k0, t.k1, t.k2]):
@ -258,10 +293,12 @@ for i, k in enumerate([t.k0, t.k1, t.k2]):
for i, k in enumerate([t.k0, t.k1, t.k2]): for i, k in enumerate([t.k0, t.k1, t.k2]):
casper.commit(i, mk_commit(7, b'\x70' * 32, k)) casper.commit(i, mk_commit(7, b'\x70' * 32, k))
assert casper.get_consensus_messages__committed(7) assert casper.get_consensus_messages__committed(7)
print("Three of four prepares and commits sufficient")
# Start epoch 8 / dynasty 7 # Start epoch 8 / dynasty 7
s.state.block_number += EPOCH_LENGTH s.state.block_number += EPOCH_LENGTH
casper.initialize_epoch(8) casper.initialize_epoch(8)
assert casper.get_dynasty() == 7 assert casper.get_dynasty() == 7
print("Epoch 8 initialized")
assert 12 * 10**15 <= casper.get_total_deposits(6) <= 13 * 10**15 assert 12 * 10**15 <= casper.get_total_deposits(6) <= 13 * 10**15
assert 15 * 10**15 <= casper.get_total_deposits(7) <= 16 * 10**15 assert 15 * 10**15 <= casper.get_total_deposits(7) <= 16 * 10**15
epoch_8_anchash = utils.sha3(b'\x80' * 32 + epoch_7_anchash) epoch_8_anchash = utils.sha3(b'\x80' * 32 + epoch_7_anchash)
@ -270,11 +307,16 @@ for i, k in enumerate([t.k0, t.k1, t.k2]):
casper.prepare(i, mk_prepare(8, b'\x80' * 32, epoch_7_anchash, 7, epoch_7_anchash, k)) casper.prepare(i, mk_prepare(8, b'\x80' * 32, epoch_7_anchash, 7, epoch_7_anchash, k))
# Three prepares are insufficient because there are still five validators in the rear validator set # Three prepares are insufficient because there are still five validators in the rear validator set
assert not casper.get_consensus_messages__hash_justified(8, b'\x80' * 32) assert not casper.get_consensus_messages__hash_justified(8, b'\x80' * 32)
print("Three prepares no longer sufficient, as the forward validator set has five validators")
# Do one more prepare # Do one more prepare
for i, k in [(3, t.k3)]: for i, k in [(3, t.k3)]:
casper.prepare(i, mk_prepare(8, b'\x80' * 32, epoch_7_anchash, 7, epoch_7_anchash, k)) casper.prepare(i, mk_prepare(8, b'\x80' * 32, epoch_7_anchash, 7, epoch_7_anchash, k))
# Now we're good! # Now we're good!
assert casper.get_consensus_messages__hash_justified(8, b'\x80' * 32) assert casper.get_consensus_messages__hash_justified(8, b'\x80' * 32)
print("Four of five prepares sufficient")
for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]): for i, k in enumerate([t.k0, t.k1, t.k2, t.k3, t.k4]):
casper.commit(i, mk_commit(8, b'\x80' * 32, k)) casper.commit(i, mk_commit(8, b'\x80' * 32, k))
assert casper.get_consensus_messages__committed(8) assert casper.get_consensus_messages__committed(8)
print("Committed")
print("All tests passed")