# ADR 034: PrivValidator file structure

## Changelog

03-11-2018: Initial Draft

## Context

For now, the PrivValidator file `priv_validator.json` contains mutable and immutable parts. 
Even in an insecure mode which does not encrypt private key on disk, it is reasonable to separate 
the mutable part and immutable part.

References:
[#1181](https://github.com/tendermint/tendermint/issues/1181)
[#2657](https://github.com/tendermint/tendermint/issues/2657)
[#2313](https://github.com/tendermint/tendermint/issues/2313)

## Proposed Solution

We can split mutable and immutable parts with two structs:
```go
// FilePVKey stores the immutable part of PrivValidator
type FilePVKey struct {
	Address types.Address  `json:"address"`
	PubKey  crypto.PubKey  `json:"pub_key"`
	PrivKey crypto.PrivKey `json:"priv_key"`

	filePath string
}

// FilePVState stores the mutable part of PrivValidator
type FilePVLastSignState struct {
	Height    int64        `json:"height"`
	Round     int          `json:"round"`
	Step      int8         `json:"step"`
	Signature []byte       `json:"signature,omitempty"`
	SignBytes cmn.HexBytes `json:"signbytes,omitempty"`

	filePath string
	mtx      sync.Mutex
}
```

Then we can combine `FilePVKey` with `FilePVLastSignState` and will get the original `FilePV`.

```go
type FilePV struct {
	Key           FilePVKey
	LastSignState FilePVLastSignState
}
```

As discussed, `FilePV` should be located in `config`, and `FilePVLastSignState` should be stored in `data`. The 
store path of each file should be specified in `config.yml`.

What we need to do next is changing the methods of `FilePV`.

## Status

Accepted and implemented in [#2870](https://github.com/tendermint/tendermint/pull/2870).

## Consequences

### Positive

- separate the mutable and immutable of PrivValidator

### Negative

- need to add more config for file path

### Neutral
