# Fake RPC Server for Testing

## Dependencies

Please follow the guide for [multi-node testnet](broken://pages/-Mb5hpSce9HHUCYcyAPm). And do add the `--mainnet-url` option to specifiy a bitcoincashnode's RPC endpoint, which can be a real one or a fake one, just as following:

```
./smartbchd start --mainnet-url=http://node-ip-address:port-number
```

## Running a Fake RPC Server for Testing

The `bchnode` tool mimics a real bitcoincashnode's RPC behavior. You can use it with the following steps:

### Start the bchnode RPC Server

```
Git clone https://github.com/smartbch/testkit.git
cd bchnode
go run main.go &
```

### Add a New Validator's public key and voting power

The format is `pubkey`-`votingPower`-`action`, where the action can be "add", "edit" or "retire".

```
cd scripts ;# there are some utility scripts in the directory testkit/bchnode/scripts
./pubkey.sh eeed4fae3da010e393efed2aacd271971fd2383fc68109a475d6c9ef65435d52-9-add
```

The `bchnode` produces blocks with fixed interval (default is 3 seconds) to vote for the validators.

### Adjust block interval

To change the block interval to 10 seconds:

```
./interval.sh 10
```

### Simulate a Block Reorg

```
./reorg.sh
```

The `bchnode` will simulate a fork at the height which is 8 blocks less than current height, and re-generate the recent 8 blocks.

## The Suggested Scenarios for Test

1. Configure `bchnode` to follow the voting power and pubkeys specified in genesis.json
2. Keep the current voting power and pubkeys for three epochs.
3. Change the voting power setting of `bchnode`, such that at new epochs, the smartbchd follows the new voting power.
4. Run block reorg at `bchnode`, and smartbchd can work normally.
5. Add new validators in and let `bchnode` vote them to be active.
6. Restart smartbchd and it can also work fine.

## smartBCH parameters for testing with bchnode

```
NumBlocksInEpoch       int64 = 30
NumBlocksToClearMemory int64 = 1000s
WaitingBlockDelayTime  int64 = 2s
SwitchEpochDelayTime   int64 = 10s
MinVotingPercentPerEpoch        = 10 //10 percent in NumBlocksInEpoch, like 2016 / 10 = 201
MinVotingPubKeysPercentPerEpoch = 34 //34 percent in active validators,
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.smartbch.org/smartbch/archives/runmultinodewithfakenode.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
