Skip to main content

Replay From a blocks.log File

Overview

This guide shows how to reconstruct a chain state using a downloaded blocks.log file rather than performing a full peer-to-peer sync. By replacing your local data/blocks/blocks.log with the supplied blocks.log and removing state and state historyfiles, you can replay the blockchain from that point onward and rebuild the state up to the last irreversible block contained in the log.

Prerequisites

  • You have followed the instructions to start a local blockchain in Install Dependencies.
  • Ensure that your local nodeop instance(s) are not running - pidof nodeop should return nothing.
  • Back up your current contents in the data/blocks; data/state and data/state-history directories if you wish to preserve them.
  • Obtain the blocks.log file you intend to replay the blockchain from.

Steps

Prepare the blocks/ directory

Once you have obtained a copy of the blocks.log file you wish to replay from, simply replace the current blocks.log with it:

cp blocks.log /opt/wire-network/blockproducer/data/blocks/
cp blocks.log /opt/wire-network/chain-api/data/blocks/

Next, you need to remove the following files and directories:

  • data/blocks/blocks.index
  • data/blocks/reversible
  • data/state
rm -rf data/blocks/blocks.index
rm -rf data/blocks/reversible
rm -rf data/state

After removing data/blocks/blocks.index and copying the new blocks.log file, use leap-util to create a new blocks.index file:

leap-util block-log make-index --blocks-dir=/opt/wire-network/blockproducer/data/blocks/
leap-util block-log make-index --blocks-dir=/opt/wire-network/chain-api/data/blocks/

If you are doing a replay on a chain API(non-producing) node with enabled state_history_plugin, you will also need to remove the data/blocks/state-history directory.

rm -rf data/blocks/state-history
info

The blocks.log file is located in the blocks/ directory by default, but this can be customized by setting blocks-dir in config.ini file or by passing the --blocks-dir option to nodeop on the command line.

3. Launch nodeop in Replay Mode

Block Producing node replay

Assuming you have started you local blockchain with wire-cli, following the instructions in Install Dependencies, you can use the start script and pass the --replay-blockchain option to it:

cd /opt/wire-network/blockproducer
./start.sh --replay-blockchain

Else, your nodeop command would be:

nodeop --replay-blockchain \
--plugin sysio::producer_plugin \
--plugin sysio::chain_api_plugin \
--plugin sysio::http_plugin \
>> nodeop.log 2>&1 &

Chain API(non-producing) replay

Before proceeding with the replay, you need to trim the blocks-state.log to the same block number as the blocks.log, else you would get the following error:

Block log and block state log need to be at the same block number. This can be fixed by running "leap-util block-state-log trim-blocklog --first 1 --last 156282 --blocks-dir <your blocks dir>". The other log is at block num: 163208 
{"command":"block-state-log","last":156282,"bn":163208}
nodeop controller.cpp:798 init

To fix this, you can run the following command:

leap-util block-state-log trim-blocklog --first 1 --last 156282 --blocks-dir /opt/wire-network/chain-api/data/blocks/
cd /opt/wire-network/chain-api
./start.sh --replay-blockchain