Skip to content
Snippets Groups Projects
Unverified Commit 3270d0c5 authored by Benjamin Bollen's avatar Benjamin Bollen
Browse files

genesis: rework genesis

parent 14ddd4d4
No related branches found
No related tags found
No related merge requests found
// Copyright 2015-2017 Monax Industries Limited.
// This file is part of the Monax platform (Monax)
// Monax is free software: you can use, redistribute it and/or modify
// it only under the terms of the GNU General Public License, version
// 3, as published by the Free Software Foundation.
// Monax is distributed WITHOUT ANY WARRANTY pursuant to
// the terms of the Gnu General Public Licence, version 3, including
// (but not limited to) Clause 15 thereof. See the text of the
// GNU General Public License, version 3 for full terms.
// You should have received a copy of the GNU General Public License,
// version 3, with Monax. If not, see <http://www.gnu.org/licenses/>.
package genesis
import (
......
// Copyright 2015-2017 Monax Industries Limited.
// This file is part of the Monax platform (Monax)
// Monax is free software: you can use, redistribute it and/or modify
// it only under the terms of the GNU General Public License, version
// 3, as published by the Free Software Foundation.
// Monax is distributed WITHOUT ANY WARRANTY pursuant to
// the terms of the Gnu General Public Licence, version 3, including
// (but not limited to) Clause 15 thereof. See the text of the
// GNU General Public License, version 3 for full terms.
// You should have received a copy of the GNU General Public License,
// version 3, with Monax. If not, see <http://www.gnu.org/licenses/>.
package genesis
import (
"bytes"
"encoding/json"
"time"
ptypes "github.com/eris-ltd/eris-db/permission/types"
wire "github.com/tendermint/go-wire"
)
// MakeGenesisDocFromAccounts takes a chainName and a slice of GenesisAccount,
// and a slice of GenesisValidator to construct a GenesisDoc, or returns an error on
// failure. In particular MakeGenesisDocFromAccount uses the local time as a
// timestamp for the GenesisDoc.
func MakeGenesisDocFromAccounts(chainName string, accounts []*GenesisAccount, validators []*GenesisValidator) (
GenesisDoc, error) {
// TODO: assert valid accounts and validators
// TODO: [ben] expose setting global permissions
globalPermissions := ptypes.DefaultAccountPermissions.Clone()
genesisParameters := &GenesisParams{
GlobalPermissions: &globalPermissions,
}
// copy slices of validators and accounts
accountsCopy := make([]GenesisAccount, len(accounts))
copy(accountsCopy, accounts)
genesisDoc := GenesisDoc{
GenesisTime: time.Now(),
// TODO: this needs to be corrected for ChainName, and ChainId
// is the derived hash from the GenesisDoc serialised bytes
ChainID: chainName,
Params: genesisParameters,
Accounts: accounts,
Validators: validators,
}
return genesisDoc, nil
}
// GetGenesisFileBytes returns the JSON (not-yet) canonical bytes for a given
// GenesisDoc or an error. In a first rewrite, rely on go-wire
// for the JSON serialisation with type-bytes.
func GetGenesisFileBytes(genesisDoc *GenesisDoc) ([]byte, error) {
// TODO: write JSON in canonical order
buffer, n, err := new(bytes.Buffer), new(int), new(error)
// write JSON with go-wire type-bytes (for public keys); deprecate
wire.WriteJSON(genesisDoc, buffer, n, &err)
if err != nil {
return nil, err
}
// rewrite buffer with indentation
indentedBuffer := new(bytes.Buffer)
if err := json.Indent(indentedBuffer, buffer.Bytes(), "", "\t"); err != nil {
return nil, err
}
return indentedBuffer.Bytes(), nil
}
// Copyright 2015-2017 Monax Industries Limited.
// This file is part of the Monax platform (Monax)
// Monax is free software: you can use, redistribute it and/or modify
// it only under the terms of the GNU General Public License, version
// 3, as published by the Free Software Foundation.
// Monax is distributed WITHOUT ANY WARRANTY pursuant to
// the terms of the Gnu General Public Licence, version 3, including
// (but not limited to) Clause 15 thereof. See the text of the
// GNU General Public License, version 3 for full terms.
// You should have received a copy of the GNU General Public License,
// version 3, with Monax. If not, see <http://www.gnu.org/licenses/>.
package genesis
import (
"bytes"
"io/ioutil"
"os"
"path/filepath"
"testing"
)
func TestGenesisFileBytes(t *testing.T) {
}
// Copyright 2015-2017 Monax Industries Limited.
// This file is part of the Monax platform (Monax)
// Monax is free software: you can use, redistribute it and/or modify
// it only under the terms of the GNU General Public License, version
// 3, as published by the Free Software Foundation.
// Monax is distributed WITHOUT ANY WARRANTY pursuant to
// the terms of the Gnu General Public Licence, version 3, including
// (but not limited to) Clause 15 thereof. See the text of the
// GNU General Public License, version 3 for full terms.
// You should have received a copy of the GNU General Public License,
// version 3, with Monax. If not, see <http://www.gnu.org/licenses/>.
package genesis
import (
......@@ -78,3 +93,57 @@ func GenesisDocFromJSON(jsonBlob []byte) (genState *GenesisDoc) {
}
return
}
//------------------------------------------------------------
// Methods for genesis types
// NOTE: breaks formatting convention
// TODO: split each genesis type in its own file definition
//------------------------------------------------------------
// GenesisAccount methods
// Clone clones the genesis account
func (genesisAccount *GenesisAccount) Clone() GenesisAccount {
// clone the address
addressClone := make([]byte, len(genesisAccount.Address))
copy(addressClone, genesisAccount.Address)
// clone the account permissions
accountPermissionsClone := genesisAccount.Permissions.Clone()
return GenesisAccount{
Address: addressClone,
Amount: genesisAccount.Amount,
Name: genesisAccount.Name,
Permissions: &accountPermissionsClone,
}
}
//------------------------------------------------------------
// GenesisValidator methods
// Clone clones the genesis validator
func (genesisValidator *GenesisValidator) Clone() GenesisValidator {
// clone the public key
// clone the account permissions
accountPermissionsClone := genesisAccount.Permissions.Clone()
return GenesisAccount{
Address: addressClone,
Amount: genesisAccount.amount,
Name: genesisAccount.Name,
Permissions: &accountPermissionsClone,
}
}
//------------------------------------------------------------
// BasicAccount methods
// Clone clones the basic account
func (basicAccount *BasicAccount) Clone() BasicAccount {
// clone the address
addressClone := make([]byte, len(basicAccount.Address))
copy(addressClone, basicAccount.Address)
return GenesisAccount{
Address: addressClone,
Amount: basicAccount.Amount,
}
}
\ No newline at end of file
......@@ -162,6 +162,21 @@ func (aP *AccountPermissions) RmRole(role string) bool {
return false
}
// Clone clones the account permissions
func (accountPermissions *AccountPermissions) Clone() AccountPermissions {
// clone base permissions
basePermissionsClone := accountPermissions.Base
// clone roles []string
rolesClone := make([]string, len(accountPermissions.Roles))
// strings are immutable so copy suffices
copy(rolesClone, accountPermissions.Roles)
return AccountPermissions{
Base: basePermissionsClone,
Roles: rolesClone,
}
}
//--------------------------------------------------------------------------------
// string utilities
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment