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
|
|
}
|