| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | // Copyright 2016 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of go-ethereum. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // go-ethereum is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // go-ethereum 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 General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"crypto/ecdsa" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2017-02-07 00:38:38 +06:30
										 |  |  | 	"os/signal" | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	"runtime" | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2017-02-07 00:38:38 +06:30
										 |  |  | 	"syscall" | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/accounts" | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/accounts/keystore" | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/cmd/utils" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/console" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/ethclient" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/internal/debug" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/logger/glog" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/node" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/p2p" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/p2p/discover" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/swarm" | 
					
						
							|  |  |  | 	bzzapi "github.com/ethereum/go-ethereum/swarm/api" | 
					
						
							|  |  |  | 	"gopkg.in/urfave/cli.v1" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	clientIdentifier = "swarm" | 
					
						
							|  |  |  | 	versionString    = "0.2" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							| 
									
										
										
										
											2016-12-13 09:49:02 +01:00
										 |  |  | 	gitCommit        string // Git SHA1 commit hash of the release (set via linker flags) | 
					
						
							|  |  |  | 	app              = utils.NewApp(gitCommit, "Ethereum Swarm") | 
					
						
							|  |  |  | 	testbetBootNodes = []string{ | 
					
						
							| 
									
										
										
										
											2016-12-13 13:08:41 +01:00
										 |  |  | 		"enode://ec8ae764f7cb0417bdfb009b9d0f18ab3818a3a4e8e7c67dd5f18971a93510a2e6f43cd0b69a27e439a9629457ea804104f37c85e41eed057d3faabbf7744cdf@13.74.157.139:30429", | 
					
						
							|  |  |  | 		"enode://c2e1fceb3bf3be19dff71eec6cccf19f2dbf7567ee017d130240c670be8594bc9163353ca55dd8df7a4f161dd94b36d0615c17418b5a3cdcbb4e9d99dfa4de37@13.74.157.139:30430", | 
					
						
							|  |  |  | 		"enode://fe29b82319b734ce1ec68b84657d57145fee237387e63273989d354486731e59f78858e452ef800a020559da22dcca759536e6aa5517c53930d29ce0b1029286@13.74.157.139:30431", | 
					
						
							|  |  |  | 		"enode://1d7187e7bde45cf0bee489ce9852dd6d1a0d9aa67a33a6b8e6db8a4fbc6fcfa6f0f1a5419343671521b863b187d1c73bad3603bae66421d157ffef357669ddb8@13.74.157.139:30432", | 
					
						
							|  |  |  | 		"enode://0e4cba800f7b1ee73673afa6a4acead4018f0149d2e3216be3f133318fd165b324cd71b81fbe1e80deac8dbf56e57a49db7be67f8b9bc81bd2b7ee496434fb5d@13.74.157.139:30433", | 
					
						
							| 
									
										
										
										
											2016-12-13 09:49:02 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	ChequebookAddrFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "chequebook", | 
					
						
							|  |  |  | 		Usage: "chequebook contract address", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	SwarmAccountFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "bzzaccount", | 
					
						
							|  |  |  | 		Usage: "Swarm account key file", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	SwarmPortFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "bzzport", | 
					
						
							|  |  |  | 		Usage: "Swarm local http api port", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 	SwarmNetworkIdFlag = cli.IntFlag{ | 
					
						
							|  |  |  | 		Name:  "bzznetworkid", | 
					
						
							| 
									
										
										
										
											2016-12-13 09:24:33 +01:00
										 |  |  | 		Usage: "Network identifier (integer, default 3=swarm testnet)", | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	SwarmConfigPathFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "bzzconfig", | 
					
						
							|  |  |  | 		Usage: "Swarm config file path (datadir/bzz)", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 	SwarmSwapEnabledFlag = cli.BoolFlag{ | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 		Name:  "swap", | 
					
						
							|  |  |  | 		Usage: "Swarm SWAP enabled (default false)", | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 	SwarmSyncEnabledFlag = cli.BoolTFlag{ | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 		Name:  "sync", | 
					
						
							|  |  |  | 		Usage: "Swarm Syncing enabled (default true)", | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 	EthAPIFlag = cli.StringFlag{ | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		Name:  "ethapi", | 
					
						
							|  |  |  | 		Usage: "URL of the Ethereum API provider", | 
					
						
							|  |  |  | 		Value: node.DefaultIPCEndpoint("geth"), | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | 	SwarmApiFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "bzzapi", | 
					
						
							|  |  |  | 		Usage: "Swarm HTTP endpoint", | 
					
						
							|  |  |  | 		Value: "http://127.0.0.1:8500", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	SwarmRecursiveUploadFlag = cli.BoolFlag{ | 
					
						
							|  |  |  | 		Name:  "recursive", | 
					
						
							|  |  |  | 		Usage: "Upload directories recursively", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	SwarmWantManifestFlag = cli.BoolTFlag{ | 
					
						
							|  |  |  | 		Name:  "manifest", | 
					
						
							|  |  |  | 		Usage: "Automatic manifest upload", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-13 12:48:30 +01:00
										 |  |  | 	SwarmUploadDefaultPath = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "defaultpath", | 
					
						
							|  |  |  | 		Usage: "path to file served for empty url path (none)", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 	CorsStringFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "corsdomain", | 
					
						
							| 
									
										
										
										
											2017-01-06 19:44:35 +02:00
										 |  |  | 		Usage: "Domain on which to send Access-Control-Allow-Origin header (multiple domains can be supplied separated by a ',')", | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func init() { | 
					
						
							|  |  |  | 	// Override flag defaults so bzzd can run alongside geth. | 
					
						
							|  |  |  | 	utils.ListenPortFlag.Value = 30399 | 
					
						
							|  |  |  | 	utils.IPCPathFlag.Value = utils.DirectoryString{Value: "bzzd.ipc"} | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 	utils.IPCApiFlag.Value = "admin, bzz, chequebook, debug, rpc, web3" | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Set up the cli app. | 
					
						
							|  |  |  | 	app.Action = bzzd | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | 	app.HideVersion = true // we have a command to print the version | 
					
						
							|  |  |  | 	app.Copyright = "Copyright 2013-2016 The go-ethereum Authors" | 
					
						
							|  |  |  | 	app.Commands = []cli.Command{ | 
					
						
							| 
									
										
										
										
											2017-01-06 15:52:03 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | 			Action:    version, | 
					
						
							|  |  |  | 			Name:      "version", | 
					
						
							|  |  |  | 			Usage:     "Print version numbers", | 
					
						
							|  |  |  | 			ArgsUsage: " ", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | The output of this command is supposed to be machine-readable. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-06 15:52:03 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | 			Action:    upload, | 
					
						
							|  |  |  | 			Name:      "up", | 
					
						
							|  |  |  | 			Usage:     "upload a file or directory to swarm using the HTTP API", | 
					
						
							|  |  |  | 			ArgsUsage: " <file>", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | "upload a file or directory to swarm using the HTTP API and prints the root hash", | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-06 15:52:03 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | 			Action:    hash, | 
					
						
							|  |  |  | 			Name:      "hash", | 
					
						
							|  |  |  | 			Usage:     "print the swarm hash of a file or directory", | 
					
						
							|  |  |  | 			ArgsUsage: " <file>", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | Prints the swarm hash of file or directory. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-02-13 08:03:05 +05:30
										 |  |  | 		{ | 
					
						
							|  |  |  | 			Name:      "manifest", | 
					
						
							|  |  |  | 			Usage:     "update a MANIFEST", | 
					
						
							|  |  |  | 			ArgsUsage: "manifest COMMAND", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | Updates a MANIFEST by adding/removing/updating the hash of a path. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 			Subcommands: []cli.Command{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Action:    add, | 
					
						
							|  |  |  | 					Name:      "add", | 
					
						
							|  |  |  | 					Usage:     "add a new path to the manifest", | 
					
						
							|  |  |  | 					ArgsUsage: "<MANIFEST> <path> <hash> [<content-type>]", | 
					
						
							|  |  |  | 					Description: ` | 
					
						
							|  |  |  | Adds a new path to the manifest | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Action:    update, | 
					
						
							|  |  |  | 					Name:      "update", | 
					
						
							|  |  |  | 					Usage:     "update the hash for an already existing path in the manifest", | 
					
						
							|  |  |  | 					ArgsUsage: "<MANIFEST> <path> <newhash> [<newcontent-type>]", | 
					
						
							|  |  |  | 					Description: ` | 
					
						
							|  |  |  | Update the hash for an already existing path in the manifest | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Action:    remove, | 
					
						
							|  |  |  | 					Name:      "remove", | 
					
						
							|  |  |  | 					Usage:     "removes a path from the manifest", | 
					
						
							|  |  |  | 					ArgsUsage: "<MANIFEST> <path>", | 
					
						
							|  |  |  | 					Description: ` | 
					
						
							|  |  |  | Removes a path from the manifest | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-02-13 18:50:50 +06:30
										 |  |  | 		{ | 
					
						
							|  |  |  | 			Action:    cleandb, | 
					
						
							|  |  |  | 			Name:      "cleandb", | 
					
						
							|  |  |  | 			Usage:     "Cleans database of corrupted entries", | 
					
						
							|  |  |  | 			ArgsUsage: " ", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | Cleans database of corrupted entries. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	app.Flags = []cli.Flag{ | 
					
						
							|  |  |  | 		utils.IdentityFlag, | 
					
						
							|  |  |  | 		utils.DataDirFlag, | 
					
						
							|  |  |  | 		utils.BootnodesFlag, | 
					
						
							|  |  |  | 		utils.KeyStoreDirFlag, | 
					
						
							|  |  |  | 		utils.ListenPortFlag, | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 		utils.NoDiscoverFlag, | 
					
						
							|  |  |  | 		utils.DiscoveryV5Flag, | 
					
						
							| 
									
										
										
										
											2016-11-22 20:52:31 +01:00
										 |  |  | 		utils.NetrestrictFlag, | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		utils.NodeKeyFileFlag, | 
					
						
							|  |  |  | 		utils.NodeKeyHexFlag, | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 		utils.MaxPeersFlag, | 
					
						
							|  |  |  | 		utils.NATFlag, | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		utils.IPCDisabledFlag, | 
					
						
							|  |  |  | 		utils.IPCApiFlag, | 
					
						
							|  |  |  | 		utils.IPCPathFlag, | 
					
						
							|  |  |  | 		// bzzd-specific flags | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 		CorsStringFlag, | 
					
						
							|  |  |  | 		EthAPIFlag, | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		SwarmConfigPathFlag, | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 		SwarmSwapEnabledFlag, | 
					
						
							|  |  |  | 		SwarmSyncEnabledFlag, | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		SwarmPortFlag, | 
					
						
							|  |  |  | 		SwarmAccountFlag, | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 		SwarmNetworkIdFlag, | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		ChequebookAddrFlag, | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | 		// upload flags | 
					
						
							|  |  |  | 		SwarmApiFlag, | 
					
						
							|  |  |  | 		SwarmRecursiveUploadFlag, | 
					
						
							|  |  |  | 		SwarmWantManifestFlag, | 
					
						
							| 
									
										
										
										
											2016-12-13 12:48:30 +01:00
										 |  |  | 		SwarmUploadDefaultPath, | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	app.Flags = append(app.Flags, debug.Flags...) | 
					
						
							|  |  |  | 	app.Before = func(ctx *cli.Context) error { | 
					
						
							|  |  |  | 		runtime.GOMAXPROCS(runtime.NumCPU()) | 
					
						
							|  |  |  | 		return debug.Setup(ctx) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	app.After = func(ctx *cli.Context) error { | 
					
						
							|  |  |  | 		debug.Exit() | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							|  |  |  | 	if err := app.Run(os.Args); err != nil { | 
					
						
							|  |  |  | 		fmt.Fprintln(os.Stderr, err) | 
					
						
							|  |  |  | 		os.Exit(1) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-10 18:45:52 +01:00
										 |  |  | func version(ctx *cli.Context) error { | 
					
						
							|  |  |  | 	fmt.Println(strings.Title(clientIdentifier)) | 
					
						
							|  |  |  | 	fmt.Println("Version:", versionString) | 
					
						
							|  |  |  | 	if gitCommit != "" { | 
					
						
							|  |  |  | 		fmt.Println("Git Commit:", gitCommit) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	fmt.Println("Network Id:", ctx.GlobalInt(utils.NetworkIdFlag.Name)) | 
					
						
							|  |  |  | 	fmt.Println("Go Version:", runtime.Version()) | 
					
						
							|  |  |  | 	fmt.Println("OS:", runtime.GOOS) | 
					
						
							|  |  |  | 	fmt.Printf("GOPATH=%s\n", os.Getenv("GOPATH")) | 
					
						
							|  |  |  | 	fmt.Printf("GOROOT=%s\n", runtime.GOROOT()) | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | func bzzd(ctx *cli.Context) error { | 
					
						
							|  |  |  | 	stack := utils.MakeNode(ctx, clientIdentifier, gitCommit) | 
					
						
							|  |  |  | 	registerBzzService(ctx, stack) | 
					
						
							|  |  |  | 	utils.StartNode(stack) | 
					
						
							| 
									
										
										
										
											2017-02-07 00:38:38 +06:30
										 |  |  | 	go func() { | 
					
						
							|  |  |  | 		sigc := make(chan os.Signal, 1) | 
					
						
							|  |  |  | 		signal.Notify(sigc, syscall.SIGTERM) | 
					
						
							|  |  |  | 		defer signal.Stop(sigc) | 
					
						
							|  |  |  | 		<-sigc | 
					
						
							|  |  |  | 		glog.V(logger.Info).Infoln("Got sigterm, shutting down...") | 
					
						
							|  |  |  | 		stack.Stop() | 
					
						
							|  |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2016-12-13 09:49:02 +01:00
										 |  |  | 	networkId := ctx.GlobalUint64(SwarmNetworkIdFlag.Name) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	// Add bootnodes as initial peers. | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.BootnodesFlag.Name) { | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 		bootnodes := strings.Split(ctx.GlobalString(utils.BootnodesFlag.Name), ",") | 
					
						
							|  |  |  | 		injectBootnodes(stack.Server(), bootnodes) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2016-12-13 09:49:02 +01:00
										 |  |  | 		if networkId == 3 { | 
					
						
							|  |  |  | 			injectBootnodes(stack.Server(), testbetBootNodes) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stack.Wait() | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func registerBzzService(ctx *cli.Context, stack *node.Node) { | 
					
						
							| 
									
										
										
										
											2017-01-26 20:33:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	prvkey := getAccount(ctx, stack) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	chbookaddr := common.HexToAddress(ctx.GlobalString(ChequebookAddrFlag.Name)) | 
					
						
							|  |  |  | 	bzzdir := ctx.GlobalString(SwarmConfigPathFlag.Name) | 
					
						
							|  |  |  | 	if bzzdir == "" { | 
					
						
							|  |  |  | 		bzzdir = stack.InstanceDir() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-26 20:33:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 	bzzconfig, err := bzzapi.NewConfig(bzzdir, chbookaddr, prvkey, ctx.GlobalUint64(SwarmNetworkIdFlag.Name)) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("unable to configure swarm: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	bzzport := ctx.GlobalString(SwarmPortFlag.Name) | 
					
						
							|  |  |  | 	if len(bzzport) > 0 { | 
					
						
							|  |  |  | 		bzzconfig.Port = bzzport | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 	swapEnabled := ctx.GlobalBool(SwarmSwapEnabledFlag.Name) | 
					
						
							|  |  |  | 	syncEnabled := ctx.GlobalBoolT(SwarmSyncEnabledFlag.Name) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 	ethapi := ctx.GlobalString(EthAPIFlag.Name) | 
					
						
							|  |  |  | 	cors := ctx.GlobalString(CorsStringFlag.Name) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	boot := func(ctx *node.ServiceContext) (node.Service, error) { | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 		var client *ethclient.Client | 
					
						
							| 
									
										
										
										
											2016-12-13 10:52:22 +01:00
										 |  |  | 		if len(ethapi) > 0 { | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 			client, err = ethclient.Dial(ethapi) | 
					
						
							| 
									
										
										
										
											2016-12-13 10:52:22 +01:00
										 |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				utils.Fatalf("Can't connect: %v", err) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 11:57:41 +01:00
										 |  |  | 		return swarm.NewSwarm(ctx, client, bzzconfig, swapEnabled, syncEnabled, cors) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if err := stack.Register(boot); err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Failed to register the Swarm service: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func getAccount(ctx *cli.Context, stack *node.Node) *ecdsa.PrivateKey { | 
					
						
							|  |  |  | 	keyid := ctx.GlobalString(SwarmAccountFlag.Name) | 
					
						
							| 
									
										
										
										
											2017-01-26 20:33:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	if keyid == "" { | 
					
						
							|  |  |  | 		utils.Fatalf("Option %q is required", SwarmAccountFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Try to load the arg as a hex key file. | 
					
						
							|  |  |  | 	if key, err := crypto.LoadECDSA(keyid); err == nil { | 
					
						
							|  |  |  | 		glog.V(logger.Info).Infof("swarm account key loaded: %#x", crypto.PubkeyToAddress(key.PublicKey)) | 
					
						
							|  |  |  | 		return key | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Otherwise try getting it from the keystore. | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | 	am := stack.AccountManager() | 
					
						
							| 
									
										
										
										
											2017-02-07 12:47:34 +02:00
										 |  |  | 	ks := am.Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return decryptStoreAccount(ks, keyid) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | func decryptStoreAccount(ks *keystore.KeyStore, account string) *ecdsa.PrivateKey { | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	var a accounts.Account | 
					
						
							|  |  |  | 	var err error | 
					
						
							|  |  |  | 	if common.IsHexAddress(account) { | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | 		a, err = ks.Find(accounts.Account{Address: common.HexToAddress(account)}) | 
					
						
							|  |  |  | 	} else if ix, ixerr := strconv.Atoi(account); ixerr == nil && ix > 0 { | 
					
						
							|  |  |  | 		if accounts := ks.Accounts(); len(accounts) > ix { | 
					
						
							|  |  |  | 			a = accounts[ix] | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			err = fmt.Errorf("index %d higher than number of accounts %d", ix, len(accounts)) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		utils.Fatalf("Can't find swarm account key %s", account) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Can't find swarm account key: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-02-08 15:53:02 +02:00
										 |  |  | 	keyjson, err := ioutil.ReadFile(a.URL.Path) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Can't load swarm account key: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for i := 1; i <= 3; i++ { | 
					
						
							|  |  |  | 		passphrase := promptPassphrase(fmt.Sprintf("Unlocking swarm account %s [%d/3]", a.Address.Hex(), i)) | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | 		key, err := keystore.DecryptKey(keyjson, passphrase) | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			return key.PrivateKey | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	utils.Fatalf("Can't decrypt swarm account key") | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func promptPassphrase(prompt string) string { | 
					
						
							|  |  |  | 	if prompt != "" { | 
					
						
							|  |  |  | 		fmt.Println(prompt) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	password, err := console.Stdin.PromptPassword("Passphrase: ") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Failed to read passphrase: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return password | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func injectBootnodes(srv *p2p.Server, nodes []string) { | 
					
						
							|  |  |  | 	for _, url := range nodes { | 
					
						
							|  |  |  | 		n, err := discover.ParseNode(url) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			glog.Errorf("invalid bootnode %q", err) | 
					
						
							| 
									
										
										
										
											2016-11-28 13:29:33 +01:00
										 |  |  | 			continue | 
					
						
							| 
									
										
										
										
											2016-09-22 02:24:31 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		srv.AddPeer(n) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |