| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- // Copyright 2016 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- package api
- import (
- "crypto/ecdsa"
- "fmt"
- "os"
- "path/filepath"
- "time"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/contracts/ens"
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/node"
- "github.com/ethereum/go-ethereum/p2p/enode"
- "github.com/ethereum/go-ethereum/swarm/network"
- "github.com/ethereum/go-ethereum/swarm/pss"
- "github.com/ethereum/go-ethereum/swarm/services/swap"
- "github.com/ethereum/go-ethereum/swarm/storage"
- )
- const (
- DefaultHTTPListenAddr = "127.0.0.1"
- DefaultHTTPPort = "8500"
- )
- // separate bzz directories
- // allow several bzz nodes running in parallel
- type Config struct {
- // serialised/persisted fields
- *storage.FileStoreParams
- // LocalStore
- ChunkDbPath string
- DbCapacity uint64
- CacheCapacity uint
- BaseKey []byte
- *network.HiveParams
- Swap *swap.LocalProfile
- Pss *pss.PssParams
- Contract common.Address
- EnsRoot common.Address
- EnsAPIs []string
- Path string
- ListenAddr string
- Port string
- PublicKey string
- BzzKey string
- Enode *enode.Node `toml:"-"`
- NetworkID uint64
- SwapEnabled bool
- SyncEnabled bool
- SyncingSkipCheck bool
- DeliverySkipCheck bool
- MaxStreamPeerServers int
- LightNodeEnabled bool
- BootnodeMode bool
- SyncUpdateDelay time.Duration
- SwapAPI string
- Cors string
- BzzAccount string
- GlobalStoreAPI string
- privateKey *ecdsa.PrivateKey
- }
- //create a default config with all parameters to set to defaults
- func NewConfig() (c *Config) {
- c = &Config{
- FileStoreParams: storage.NewFileStoreParams(),
- HiveParams: network.NewHiveParams(),
- Swap: swap.NewDefaultSwapParams(),
- Pss: pss.NewPssParams(),
- ListenAddr: DefaultHTTPListenAddr,
- Port: DefaultHTTPPort,
- Path: node.DefaultDataDir(),
- EnsAPIs: nil,
- EnsRoot: ens.TestNetAddress,
- NetworkID: network.DefaultNetworkID,
- SwapEnabled: false,
- SyncEnabled: true,
- SyncingSkipCheck: false,
- MaxStreamPeerServers: 10000,
- DeliverySkipCheck: true,
- SyncUpdateDelay: 15 * time.Second,
- SwapAPI: "",
- }
- return
- }
- //some config params need to be initialized after the complete
- //config building phase is completed (e.g. due to overriding flags)
- func (c *Config) Init(prvKey *ecdsa.PrivateKey, nodeKey *ecdsa.PrivateKey) error {
- // create swarm dir and record key
- err := c.createAndSetPath(c.Path, prvKey)
- if err != nil {
- return fmt.Errorf("Error creating root swarm data directory: %v", err)
- }
- c.setKey(prvKey)
- // create the new enode record
- // signed with the ephemeral node key
- enodeParams := &network.EnodeParams{
- PrivateKey: prvKey,
- EnodeKey: nodeKey,
- Lightnode: c.LightNodeEnabled,
- Bootnode: c.BootnodeMode,
- }
- c.Enode, err = network.NewEnode(enodeParams)
- if err != nil {
- return fmt.Errorf("Error creating enode: %v", err)
- }
- // initialize components that depend on the swarm instance's private key
- if c.SwapEnabled {
- c.Swap.Init(c.Contract, prvKey)
- }
- c.privateKey = prvKey
- c.ChunkDbPath = filepath.Join(c.Path, "chunks")
- c.BaseKey = common.FromHex(c.BzzKey)
- c.Pss = c.Pss.WithPrivateKey(c.privateKey)
- return nil
- }
- func (c *Config) ShiftPrivateKey() (privKey *ecdsa.PrivateKey) {
- if c.privateKey != nil {
- privKey = c.privateKey
- c.privateKey = nil
- }
- return privKey
- }
- func (c *Config) setKey(prvKey *ecdsa.PrivateKey) {
- bzzkeybytes := network.PrivateKeyToBzzKey(prvKey)
- pubkey := crypto.FromECDSAPub(&prvKey.PublicKey)
- pubkeyhex := hexutil.Encode(pubkey)
- keyhex := hexutil.Encode(bzzkeybytes)
- c.privateKey = prvKey
- c.PublicKey = pubkeyhex
- c.BzzKey = keyhex
- }
- func (c *Config) createAndSetPath(datadirPath string, prvKey *ecdsa.PrivateKey) error {
- address := crypto.PubkeyToAddress(prvKey.PublicKey)
- bzzdirPath := filepath.Join(datadirPath, "bzz-"+common.Bytes2Hex(address.Bytes()))
- err := os.MkdirAll(bzzdirPath, os.ModePerm)
- if err != nil {
- return err
- }
- c.Path = bzzdirPath
- return nil
- }
|