| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | // 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" | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2017-06-18 00:25:39 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/contracts/ens" | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/swarm/network" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/swarm/services/swap" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/swarm/storage" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2017-05-21 23:56:40 -07:00
										 |  |  | 	DefaultHTTPListenAddr = "127.0.0.1" | 
					
						
							|  |  |  | 	DefaultHTTPPort       = "8500" | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // separate bzz directories | 
					
						
							|  |  |  | // allow several bzz nodes running in parallel | 
					
						
							|  |  |  | type Config struct { | 
					
						
							|  |  |  | 	// serialised/persisted fields | 
					
						
							|  |  |  | 	*storage.StoreParams | 
					
						
							|  |  |  | 	*storage.ChunkerParams | 
					
						
							|  |  |  | 	*network.HiveParams | 
					
						
							|  |  |  | 	Swap *swap.SwapParams | 
					
						
							|  |  |  | 	*network.SyncParams | 
					
						
							| 
									
										
										
										
											2017-05-21 23:56:40 -07:00
										 |  |  | 	Path       string | 
					
						
							|  |  |  | 	ListenAddr string | 
					
						
							|  |  |  | 	Port       string | 
					
						
							|  |  |  | 	PublicKey  string | 
					
						
							|  |  |  | 	BzzKey     string | 
					
						
							|  |  |  | 	EnsRoot    common.Address | 
					
						
							|  |  |  | 	NetworkId  uint64 | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // config is agnostic to where private key is coming from | 
					
						
							|  |  |  | // so managing accounts is outside swarm and left to wrappers | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | func NewConfig(path string, contract common.Address, prvKey *ecdsa.PrivateKey, networkId uint64) (self *Config, err error) { | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 	address := crypto.PubkeyToAddress(prvKey.PublicKey) // default beneficiary address | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:03 +02:00
										 |  |  | 	dirpath := filepath.Join(path, "bzz-"+common.Bytes2Hex(address.Bytes())) | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 	err = os.MkdirAll(dirpath, os.ModePerm) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	confpath := filepath.Join(dirpath, "config.json") | 
					
						
							|  |  |  | 	var data []byte | 
					
						
							|  |  |  | 	pubkey := crypto.FromECDSAPub(&prvKey.PublicKey) | 
					
						
							|  |  |  | 	pubkeyhex := common.ToHex(pubkey) | 
					
						
							| 
									
										
										
										
											2017-01-09 11:16:06 +01:00
										 |  |  | 	keyhex := crypto.Keccak256Hash(pubkey).Hex() | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	self = &Config{ | 
					
						
							|  |  |  | 		SyncParams:    network.NewSyncParams(dirpath), | 
					
						
							|  |  |  | 		HiveParams:    network.NewHiveParams(dirpath), | 
					
						
							|  |  |  | 		ChunkerParams: storage.NewChunkerParams(), | 
					
						
							|  |  |  | 		StoreParams:   storage.NewStoreParams(dirpath), | 
					
						
							| 
									
										
										
										
											2017-05-21 23:56:40 -07:00
										 |  |  | 		ListenAddr:    DefaultHTTPListenAddr, | 
					
						
							|  |  |  | 		Port:          DefaultHTTPPort, | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 		Path:          dirpath, | 
					
						
							|  |  |  | 		Swap:          swap.DefaultSwapParams(contract, prvKey), | 
					
						
							|  |  |  | 		PublicKey:     pubkeyhex, | 
					
						
							|  |  |  | 		BzzKey:        keyhex, | 
					
						
							| 
									
										
										
										
											2017-06-18 00:25:39 +02:00
										 |  |  | 		EnsRoot:       ens.TestNetAddress, | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 		NetworkId:     networkId, | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	data, err = ioutil.ReadFile(confpath) | 
					
						
							| 
									
										
										
										
											2017-01-26 20:33:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// if not set in function param, then set default for swarm network, will be overwritten by config file if present | 
					
						
							|  |  |  | 	if networkId == 0 { | 
					
						
							|  |  |  | 		self.NetworkId = network.NetworkId | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		if !os.IsNotExist(err) { | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-26 20:33:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 		// file does not exist | 
					
						
							|  |  |  | 		// write out config file | 
					
						
							|  |  |  | 		err = self.Save() | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			err = fmt.Errorf("error writing config: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-26 20:33:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 	// file exists, deserialise | 
					
						
							|  |  |  | 	err = json.Unmarshal(data, self) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("unable to parse config: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// check public key | 
					
						
							|  |  |  | 	if pubkeyhex != self.PublicKey { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("public key does not match the one in the config file %v != %v", pubkeyhex, self.PublicKey) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if keyhex != self.BzzKey { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("bzz key does not match the one in the config file %v != %v", keyhex, self.BzzKey) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-26 20:33:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// if set in function param, replace id set from config file | 
					
						
							|  |  |  | 	if networkId != 0 { | 
					
						
							|  |  |  | 		self.NetworkId = networkId | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 	self.Swap.SetKey(prvKey) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (self.EnsRoot == common.Address{}) { | 
					
						
							| 
									
										
										
										
											2017-06-18 00:25:39 +02:00
										 |  |  | 		self.EnsRoot = ens.TestNetAddress | 
					
						
							| 
									
										
										
										
											2016-08-29 21:18:00 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *Config) Save() error { | 
					
						
							|  |  |  | 	data, err := json.MarshalIndent(self, "", "    ") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err = os.MkdirAll(self.Path, os.ModePerm) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	confpath := filepath.Join(self.Path, "config.json") | 
					
						
							|  |  |  | 	return ioutil.WriteFile(confpath, data, os.ModePerm) | 
					
						
							|  |  |  | } |