2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								// Copyright 2017 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  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"io" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"os" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"path/filepath" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/cmd/utils" 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-20 14:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/common" 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/log" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/swarm/storage" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"gopkg.in/urfave/cli.v1" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-12 14:51:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								var  dbCommand  =  cli . Command {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Name :                "db" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CustomHelpTemplate :  helpTemplate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Usage :               "manage the local chunk database" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ArgsUsage :           "db COMMAND" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Description :         "Manage the local chunk database" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Subcommands :  [ ] cli . Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Action :              dbExport , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											CustomHelpTemplate :  helpTemplate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Name :                "export" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Usage :               "export a local chunk database as a tar archive (use - to send to stdout)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ArgsUsage :           "<chunkdb> <file>" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Description :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Export  a  local  chunk  database  as  a  tar  archive  ( use  -  to  send  to  stdout ) .  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    swarm  db  export  ~ / . ethereum / swarm / bzz - KEY / chunks  chunks . tar 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The  export  may  be  quite  large ,  consider  piping  the  output  through  the  Unix  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								pv ( 1 )  tool  to  get  a  progress  bar :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    swarm  db  export  ~ / . ethereum / swarm / bzz - KEY / chunks  -  |  pv  >  chunks . tar 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Action :              dbImport , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											CustomHelpTemplate :  helpTemplate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Name :                "import" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Usage :               "import chunks from a tar archive into a local chunk database (use - to read from stdin)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ArgsUsage :           "<chunkdb> <file>" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Description :  ` Import  chunks  from  a  tar  archive  into  a  local  chunk  database  ( use  -  to  read  from  stdin ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    swarm  db  import  ~ / . ethereum / swarm / bzz - KEY / chunks  chunks . tar 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The  import  may  be  quite  large ,  consider  piping  the  input  through  the  Unix  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								pv ( 1 )  tool  to  get  a  progress  bar :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pv  chunks . tar  |  swarm  db  import  ~ / . ethereum / swarm / bzz - KEY / chunks  - ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								func  dbExport ( ctx  * cli . Context )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									args  :=  ctx . Args ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-20 14:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  len ( args )  !=  3  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										utils . Fatalf ( "invalid arguments, please specify both <chunkdb> (path to a local chunk database), <file> (path to write the tar archive to, - for stdout) and the base key" ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-20 14:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									store ,  err  :=  openLDBStore ( args [ 0 ] ,  common . Hex2Bytes ( args [ 2 ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										utils . Fatalf ( "error opening local chunk database: %s" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  store . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  out  io . Writer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  args [ 1 ]  ==  "-"  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out  =  os . Stdout 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										f ,  err  :=  os . Create ( args [ 1 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											utils . Fatalf ( "error opening output file: %s" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										defer  f . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out  =  f 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									count ,  err  :=  store . Export ( out ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										utils . Fatalf ( "error exporting local chunk database: %s" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									log . Info ( fmt . Sprintf ( "successfully exported %d chunks" ,  count ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  dbImport ( ctx  * cli . Context )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									args  :=  ctx . Args ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-20 14:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  len ( args )  !=  3  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										utils . Fatalf ( "invalid arguments, please specify both <chunkdb> (path to a local chunk database), <file> (path to read the tar archive from, - for stdin) and the base key" ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-20 14:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									store ,  err  :=  openLDBStore ( args [ 0 ] ,  common . Hex2Bytes ( args [ 2 ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										utils . Fatalf ( "error opening local chunk database: %s" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  store . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  in  io . Reader 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  args [ 1 ]  ==  "-"  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										in  =  os . Stdin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										f ,  err  :=  os . Open ( args [ 1 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											utils . Fatalf ( "error opening input file: %s" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										defer  f . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										in  =  f 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									count ,  err  :=  store . Import ( in ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										utils . Fatalf ( "error importing local chunk database: %s" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									log . Info ( fmt . Sprintf ( "successfully imported %d chunks" ,  count ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-20 14:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  openLDBStore ( path  string ,  basekey  [ ] byte )  ( * storage . LDBStore ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  _ ,  err  :=  os . Stat ( filepath . Join ( path ,  "CURRENT" ) ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  fmt . Errorf ( "invalid chunkdb path: %s" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-20 14:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									storeparams  :=  storage . NewDefaultStoreParams ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ldbparams  :=  storage . NewLDBStoreParams ( storeparams ,  path ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ldbparams . BaseKey  =  basekey 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  storage . NewLDBStore ( ldbparams ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-31 12:23:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}