Unreproducible chainspec due to random_id

I made the assumption that chainspec building was reproducible, however, it seems I missed something for ĞTest.

# do this twice for test1 and test2
DUNITER_GTEST_GENESIS=/home/hugo/duniter/specs/gtest_genesis.json \
DUNITER_GTEST_CLIENT_SPEC=/home/hugo/duniter/specs/gtest_client-specs.json \
duniter build-spec --chain gtest_live > test1
# the diff should be empty but is not
diff test1 test2

I can see two differences:

  • in “accounts” randomId are different
  • in “identities” the order of the list is not the same

This is how randomId is generated :

// for wallet
random_id: H256(blake2_256(&(wallet_index, &pubkey).encode())),
// for identity
random_id: H256(blake2_256(&(identity.index, &identity.owner_key).encode())),

The problem is that the hashmaps are not ordered and the wallet_index is based on the order of iteration. I have to make it reproducible (todo).

Note : elois already met this problem and fixed it for genesis in commit fix(idty): make genesis build deterministic (80b78ae2) · Commits · nodes / rust / Duniter v2S · GitLab