|
|
- package privval
-
- import (
- "io/ioutil"
- "os"
-
- "github.com/tendermint/tendermint/crypto"
- cmn "github.com/tendermint/tendermint/libs/common"
- "github.com/tendermint/tendermint/types"
- )
-
- // OldFilePV is the old version of the FilePV, pre v0.28.0.
- type OldFilePV struct {
- Address types.Address `json:"address"`
- PubKey crypto.PubKey `json:"pub_key"`
- LastHeight int64 `json:"last_height"`
- LastRound int `json:"last_round"`
- LastStep int8 `json:"last_step"`
- LastSignature []byte `json:"last_signature,omitempty"`
- LastSignBytes cmn.HexBytes `json:"last_signbytes,omitempty"`
- PrivKey crypto.PrivKey `json:"priv_key"`
-
- filePath string
- }
-
- // LoadOldFilePV loads an OldFilePV from the filePath.
- func LoadOldFilePV(filePath string) (*OldFilePV, error) {
- pvJSONBytes, err := ioutil.ReadFile(filePath)
- if err != nil {
- return nil, err
- }
- pv := &OldFilePV{}
- err = cdc.UnmarshalJSON(pvJSONBytes, &pv)
- if err != nil {
- return nil, err
- }
-
- // overwrite pubkey and address for convenience
- pv.PubKey = pv.PrivKey.PubKey()
- pv.Address = pv.PubKey.Address()
-
- pv.filePath = filePath
- return pv, nil
- }
-
- // Upgrade convets the OldFilePV to the new FilePV, separating the immutable and mutable components,
- // and persisting them to the keyFilePath and stateFilePath, respectively.
- // It renames the original file by adding ".bak".
- func (oldFilePV *OldFilePV) Upgrade(keyFilePath, stateFilePath string) *FilePV {
- privKey := oldFilePV.PrivKey
- pvKey := FilePVKey{
- PrivKey: privKey,
- PubKey: privKey.PubKey(),
- Address: privKey.PubKey().Address(),
- filePath: keyFilePath,
- }
-
- pvState := FilePVLastSignState{
- Height: oldFilePV.LastHeight,
- Round: oldFilePV.LastRound,
- Step: oldFilePV.LastStep,
- Signature: oldFilePV.LastSignature,
- SignBytes: oldFilePV.LastSignBytes,
- filePath: stateFilePath,
- }
-
- // Save the new PV files
- pv := &FilePV{
- Key: pvKey,
- LastSignState: pvState,
- }
- pv.Save()
-
- // Rename the old PV file
- err := os.Rename(oldFilePV.filePath, oldFilePV.filePath+".bak")
- if err != nil {
- panic(err)
- }
- return pv
- }
|