package state import ( "encoding/json" "io/ioutil" "time" . "github.com/tendermint/tendermint/binary" . "github.com/tendermint/tendermint/blocks" . "github.com/tendermint/tendermint/common" db_ "github.com/tendermint/tendermint/db" "github.com/tendermint/tendermint/merkle" ) type GenesisDoc struct { GenesisTime time.Time AccountDetails []*AccountDetail } func GenesisDocFromJSON(jsonBlob []byte) (genState *GenesisDoc) { err := json.Unmarshal(jsonBlob, &genState) if err != nil { Panicf("Couldn't read GenesisDoc: %v", err) } return } func GenesisStateFromFile(db db_.DB, genDocFile string) *State { jsonBlob, err := ioutil.ReadFile(genDocFile) if err != nil { Panicf("Couldn't read GenesisDoc file: %v", err) } genDoc := GenesisDocFromJSON(jsonBlob) return GenesisStateFromDoc(db, genDoc) } func GenesisStateFromDoc(db db_.DB, genDoc *GenesisDoc) *State { return GenesisState(db, genDoc.GenesisTime, genDoc.AccountDetails) } func GenesisState(db db_.DB, genesisTime time.Time, accDets []*AccountDetail) *State { if genesisTime.IsZero() { genesisTime = time.Now() } // TODO: Use "uint64Codec" instead of BasicCodec accountDetails := merkle.NewIAVLTree(BasicCodec, AccountDetailCodec, defaultAccountDetailsCacheCapacity, db) validators := []*Validator{} for _, accDet := range accDets { accountDetails.Set(accDet.Id, accDet) if accDet.Status == AccountStatusBonded { validators = append(validators, &Validator{ Account: accDet.Account, BondHeight: 0, VotingPower: accDet.Balance, Accum: 0, }) } } if len(validators) == 0 { panic("Must have some validators") } return &State{ DB: db, LastBlockHeight: 0, LastBlockHash: nil, LastBlockParts: PartSetHeader{}, LastBlockTime: genesisTime, BondedValidators: NewValidatorSet(validators), UnbondingValidators: NewValidatorSet(nil), accountDetails: accountDetails, } }