MinaProtocol / mina

Mina is a cryptocurrency protocol with a constant size blockchain, improving scaling while maintaining decentralization and security.
https://minaprotocol.com
Apache License 2.0
1.98k stars 527 forks source link

Failing unit test on `compatible` (July 07, 2024) #15806

Closed georgeee closed 2 weeks ago

georgeee commented 2 weeks ago

Unit test is failing on compatible: https://buildkite.com/o-1-labs-2/mina-o-1-labs/builds/34306#019096de-114e-4cbe-950e-28c43274683a

File "src/lib/merkle_ledger_tests/dune", line 45, characters 8-12:
--
  | 45 \|  (names main)
  | ^^^^
  | Testing Merkle ledger.
  | This run has ID `F4859EC1-6CA0-41C6-9F23-A04F058CF7C5`.
  | [OK]                In-memory db (depth 4)                               0   getting a non existing account returns None.
  | [OK]                In-memory db (depth 4)                               1   add and retrieve an account.
  | [OK]                In-memory db (depth 4)                               2   accounts are atomic.
  | [OK]                In-memory db (depth 4)                               3   length.
  | [OK]                In-memory db (depth 4)                               4   no update on get_or_create_acount if key already exists.
  | [OK]                In-memory db (depth 4)                               5   get_or_create_account t account = location_of_account account.key.
  | [OK]                In-memory db (depth 4)                               6   set_inner_hash_at_addr_exn(address,hash); get_inner_hash_at_addr_exn(address) = hash.
  | [OK]                In-memory db (depth 4)                               7   set_batch_accounts all_accounts doesn't change already full database .
  | [OK]                In-memory db (depth 4)                               8   set_batch_accounts would change the merkle root.
  | [OK]                In-memory db (depth 4)                               9   key by key account retrieval after set_batch_accounts works.
  | [OK]                In-memory db (depth 4)                              10   when database is full, set_all_accounts_rooted_at_exn(address,accounts);get_all_accounts_rooted_at_exn(address) = accounts .
  | [OK]                In-memory db (depth 4)                              11   create_empty doesn't modify the hash.
  | [OK]                In-memory db (depth 4)                              12   get_at_index_exn t (index_of_account_exn t public_key) = account.
  | [OK]                In-memory db (depth 4)                              13   set_at_index_exn t index  account; get_at_index_exn t index = account.
  | [OK]                In-memory db (depth 4)                              14   implied_root(account) = root_hash.
  | [OK]                In-memory db (depth 4)                              15   implied_root(index) = root_hash.
  | [OK]                In-memory db (depth 4)                              16   iter.
  | [OK]                In-memory db (depth 4)                              17   add 2^4 accounts.
  | [OK]                In-memory db (depth 4)                              18   fold over account balances.
  | [OK]                In-memory db (depth 4)                              19   fold_until over account balances.
  | [OK]                In-memory db (depth 30)                              0   getting a non existing account returns None.
  | [OK]                In-memory db (depth 30)                              1   add and retrieve an account.
  | [OK]                In-memory db (depth 30)                              2   accounts are atomic.
  | [OK]                In-memory db (depth 30)                              3   length.
  | [OK]                In-memory db (depth 30)                              4   no update on get_or_create_acount if key already exists.
  | [OK]                In-memory db (depth 30)                              5   get_or_create_account t account = location_of_account account.key.
  | [OK]                In-memory db (depth 30)                              6   set_inner_hash_at_addr_exn(address,hash); get_inner_hash_at_addr_exn(address) = hash.
  | [OK]                In-memory db (depth 30)                              7   set_batch_accounts all_accounts doesn't change already full database .
  | [OK]                In-memory db (depth 30)                              8   set_batch_accounts would change the merkle root.
  | [OK]                In-memory db (depth 30)                              9   key by key account retrieval after set_batch_accounts works.
  | [OK]                In-memory db (depth 30)                             10   when database is full, set_all_accounts_rooted_at_exn(address,accounts);get_all_accounts_rooted_at_exn(address) = accounts .
  | [OK]                In-memory db (depth 30)                             11   create_empty doesn't modify the hash.
  | [OK]                In-memory db (depth 30)                             12   get_at_index_exn t (index_of_account_exn t public_key) = account.
  | [OK]                In-memory db (depth 30)                             13   set_at_index_exn t index  account; get_at_index_exn t index = account.
  | [OK]                In-memory db (depth 30)                             14   implied_root(account) = root_hash.
  | [OK]                In-memory db (depth 30)                             15   implied_root(index) = root_hash.
  | [OK]                In-memory db (depth 30)                             16   iter.
  | [OK]                In-memory db (depth 30)                             17   fold over account balances.
  | [OK]                In-memory db (depth 30)                             18   fold_until over account balances.
  | [OK]                Databases                                            0   equivalent hash values.
  | [OK]                Mask with underlying Merkle tree (depth:4)           0   parent, mask agree on set.
  | [OK]                Mask with underlying Merkle tree (depth:4)           1   parent, mask agree on hashes; set in both mask and parent.
  | [OK]                Mask with underlying Merkle tree (depth:4)           2   parent, mask agree on hashes; set only in parent.
  | [OK]                Mask with underlying Merkle tree (depth:4)           3   mask prune after parent notification.
  | [OK]                Mask with underlying Merkle tree (depth:4)           4   commit puts mask contents in parent, flushes mask.
  | [OK]                Mask with underlying Merkle tree (depth:4)           5   commit at layer2, dumps to layer1, not in base.
  | [OK]                Mask with underlying Merkle tree (depth:4)           6   register and unregister mask.
  | [OK]                Mask with underlying Merkle tree (depth:4)           7   root hash invariant if interior changes but not accounts.
  | [OK]                Mask with underlying Merkle tree (depth:4)           8   mask and parent agree on Merkle path.
  | [OK]                Mask with underlying Merkle tree (depth:4)           9   mask and parent agree on Merkle root before set.
  | [OK]                Mask with underlying Merkle tree (depth:4)          10   mask and parent agree on Merkle root after set.
  | [OK]                Mask with underlying Merkle tree (depth:4)          11   add and retrieve a block of accounts.
  | [FAIL]              Mask with underlying Merkle tree (depth:4)          12   get_all_accounts should preserve the ordering of accounts by location with noncontiguous updates of accounts on the mask.
  | [OK]                Mask with underlying Merkle tree (depth:4)          13   fold of addition over account balances in parent and mask.
  | [OK]                Mask with underlying Merkle tree (depth:4)          14   masking in to_list.
  | [OK]                Mask with underlying Merkle tree (depth:4)          15   masking in foldi.
  | [OK]                Mask with underlying Merkle tree (depth:4)          16   create_empty doesn't modify the hash.
  | [OK]                Mask with underlying Merkle tree (depth:4)          17   num_accounts for unique keys in mask and parent.
  | [OK]                Mask with underlying Merkle tree (depth:4)          18   mask reparenting works.
  | [OK]                Mask with underlying Merkle tree (depth:4)          19   setting account in parent doesn't remove masked copy if mask is still dirty for said account.
  | [OK]                Mask with underlying Merkle tree (depth:30)          0   parent, mask agree on set.
  | [OK]                Mask with underlying Merkle tree (depth:30)          1   parent, mask agree on hashes; set in both mask and parent.
  | [OK]                Mask with underlying Merkle tree (depth:30)          2   parent, mask agree on hashes; set only in parent.
  | [OK]                Mask with underlying Merkle tree (depth:30)          3   mask prune after parent notification.
  | [OK]                Mask with underlying Merkle tree (depth:30)          4   commit puts mask contents in parent, flushes mask.
  | [OK]                Mask with underlying Merkle tree (depth:30)          5   commit at layer2, dumps to layer1, not in base.
  | [OK]                Mask with underlying Merkle tree (depth:30)          6   register and unregister mask.
  | [OK]                Mask with underlying Merkle tree (depth:30)          7   mask and parent agree on Merkle path.
  | [OK]                Mask with underlying Merkle tree (depth:30)          8   mask and parent agree on Merkle root before set.
  | [OK]                Mask with underlying Merkle tree (depth:30)          9   mask and parent agree on Merkle root after set.
  | [OK]                Mask with underlying Merkle tree (depth:30)         10   fold of addition over account balances in parent and mask.
  | [OK]                Mask with underlying Merkle tree (depth:30)         11   masking in to_list.
  | [OK]                Mask with underlying Merkle tree (depth:30)         12   masking in foldi.
  | [OK]                Mask with underlying Merkle tree (depth:30)         13   create_empty doesn't modify the hash.
  | [OK]                Mask with underlying Merkle tree (depth:30)         14   num_accounts for unique keys in mask and parent.
  | [OK]                Mask with underlying Merkle tree (depth:30)         15   mask reparenting works.
  | [OK]                Mask with underlying Merkle tree (depth:30)         16   setting account in parent doesn't remove masked copy if mask is still dirty for said account.
  | -- Mask with underlying Merkle tree (depth:4).012 [get_all_accounts should preserve the ordering of accounts by location with noncontiguous updates of accounts on the mask.] Failed --
  | in `/workdir/_build/default/src/lib/merkle_ledger_tests/_build/_tests/F4859EC1-6CA0-41C6-9F23-A04F058CF7C5/mask with underlying merkle tree (depth:4).012.output`:
  | [exception] "Assert_failure _none_:0:-1"
  | Raised at Stdlib__String.index_rec in file "string.ml", line 128, characters 19-34
  | Called from Sexplib0__Sexp.Printing.index_of_newline in file "src/sexp.ml", line 113, characters 13-47
georgeee commented 2 weeks ago

Same test for the same commit succeeds on nightly: https://buildkite.com/o-1-labs-2/mina-end-to-end-nightlies/builds/2217#019094cc-4bb5-481c-a62d-4fa9d2e1b701

georgeee commented 2 weeks ago

Duplicates #15790