/// <summary>
        /// Copies states under state root hashes of given <paramref name="stateRootHashes"/>
        /// to <paramref name="targetStateStore"/>.
        /// </summary>
        /// <param name="stateRootHashes">The state root hashes of states to copy.</param>
        /// <param name="targetStateStore">The target state store to copy state root hashes.</param>
        public void CopyStates(
            IImmutableSet <HashDigest <SHA256> > stateRootHashes, TrieStateStore targetStateStore)
        {
            IKeyValueStore targetKeyValueStore = targetStateStore._stateKeyValueStore;
            var            stopwatch           = new Stopwatch();

            _logger.Verbose($"Started {nameof(CopyStates)}()");
            stopwatch.Start();

            foreach (HashDigest <SHA256> stateRootHash in stateRootHashes)
            {
                var stateTrie = new MerkleTrie(
                    _stateKeyValueStore,
                    new HashNode(stateRootHash),
                    _secure
                    );

                foreach (var(key, value) in stateTrie.IterateNodeKeyValuePairs())
                {
                    targetKeyValueStore.Set(key, value);
                }
            }

            stopwatch.Stop();
            _logger.Debug(
                "Finished to copy all states {ElapsedMilliseconds} ms",
                stopwatch.ElapsedMilliseconds);
            _logger.Verbose($"Finished {nameof(CopyStates)}()");
        }