Browse Source

:wrench: Allow to specify max blockchain size

Ettore Di Giacinto 3 years ago
parent
commit
4f7b7f90bc
6 changed files with 43 additions and 55 deletions
  1. 2 10
      cmd/api.go
  2. 5 14
      cmd/file.go
  3. 1 9
      cmd/join.go
  4. 4 13
      cmd/service.go
  5. 25 6
      pkg/edgevpn/edgevpn.go
  6. 6 3
      pkg/edgevpn/options.go

+ 2 - 10
cmd/api.go

@@ -2,7 +2,6 @@ package cmd
 
 
 import (
 import (
 	"github.com/mudler/edgevpn/api"
 	"github.com/mudler/edgevpn/api"
-	"github.com/mudler/edgevpn/pkg/blockchain"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/urfave/cli"
 	"github.com/urfave/cli"
 )
 )
@@ -26,18 +25,11 @@ A simple UI interface is available to display network data.`,
 
 
 			displayStart(e)
 			displayStart(e)
 
 
-			mw, err := e.MessageWriter()
-			if err != nil {
-				return err
-			}
-
-			ledger := blockchain.New(mw, 1000)
-
 			// Join the node to the network, using our ledger
 			// Join the node to the network, using our ledger
-			if err := e.Join(ledger); err != nil {
+			if err := e.Join(); err != nil {
 				return err
 				return err
 			}
 			}
-
+			ledger, _ := e.Ledger()
 			return api.API(c.String("listen"), ledger)
 			return api.API(c.String("listen"), ledger)
 		},
 		},
 	}
 	}

+ 5 - 14
cmd/file.go

@@ -1,7 +1,6 @@
 package cmd
 package cmd
 
 
 import (
 import (
-	"github.com/mudler/edgevpn/pkg/blockchain"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/urfave/cli"
 	"github.com/urfave/cli"
 )
 )
@@ -31,17 +30,14 @@ This is also the ID used to refer when receiving it.`,
 
 
 			displayStart(e)
 			displayStart(e)
 
 
-			mw, err := e.MessageWriter()
+			ledger, err := e.Ledger()
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
-
-			ledger := blockchain.New(mw, 1000)
-
 			// Join the node to the network, using our ledger
 			// Join the node to the network, using our ledger
 			e.SendFile(ledger, c.String("name"), c.String("path"))
 			e.SendFile(ledger, c.String("name"), c.String("path"))
 			// Join the node to the network, using our ledger
 			// Join the node to the network, using our ledger
-			if err := e.Join(ledger); err != nil {
+			if err := e.Join(); err != nil {
 				return err
 				return err
 			}
 			}
 
 
@@ -75,18 +71,13 @@ func FileReceive() cli.Command {
 
 
 			displayStart(e)
 			displayStart(e)
 
 
-			mw, err := e.MessageWriter()
-			if err != nil {
-				return err
-			}
-
-			ledger := blockchain.New(mw, 1000)
-
 			// Join the node to the network, using our ledger
 			// Join the node to the network, using our ledger
-			if err := e.Join(ledger); err != nil {
+			if err := e.Join(); err != nil {
 				return err
 				return err
 			}
 			}
 
 
+			ledger, _ := e.Ledger()
+
 			return e.ReceiveFile(ledger, c.String("name"), c.String("path"))
 			return e.ReceiveFile(ledger, c.String("name"), c.String("path"))
 		},
 		},
 	}
 	}

+ 1 - 9
cmd/join.go

@@ -1,7 +1,6 @@
 package cmd
 package cmd
 
 
 import (
 import (
-	"github.com/mudler/edgevpn/pkg/blockchain"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/urfave/cli"
 	"github.com/urfave/cli"
 )
 )
@@ -19,15 +18,8 @@ Useful for setting up relays or hop nodes to improve the network connectivity.`,
 
 
 			displayStart(e)
 			displayStart(e)
 
 
-			mw, err := e.MessageWriter()
-			if err != nil {
-				return err
-			}
-
-			ledger := blockchain.New(mw, 1000)
-
 			// Join the node to the network, using our ledger
 			// Join the node to the network, using our ledger
-			if err := e.Join(ledger); err != nil {
+			if err := e.Join(); err != nil {
 				return err
 				return err
 			}
 			}
 
 

+ 4 - 13
cmd/service.go

@@ -1,7 +1,6 @@
 package cmd
 package cmd
 
 
 import (
 import (
-	"github.com/mudler/edgevpn/pkg/blockchain"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/urfave/cli"
 	"github.com/urfave/cli"
 )
 )
@@ -32,17 +31,15 @@ For example, '192.168.1.1:80', or '127.0.0.1:22'.`,
 
 
 			displayStart(e)
 			displayStart(e)
 
 
-			mw, err := e.MessageWriter()
+			ledger, err := e.Ledger()
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
 
 
-			ledger := blockchain.New(mw, 1000)
-
 			// Join the node to the network, using our ledger
 			// Join the node to the network, using our ledger
 			e.ExposeService(ledger, c.String("name"), c.String("remoteaddress"))
 			e.ExposeService(ledger, c.String("name"), c.String("remoteaddress"))
 			// Join the node to the network, using our ledger
 			// Join the node to the network, using our ledger
-			if err := e.Join(ledger); err != nil {
+			if err := e.Join(); err != nil {
 				return err
 				return err
 			}
 			}
 
 
@@ -79,18 +76,12 @@ to the service over the network`,
 
 
 			displayStart(e)
 			displayStart(e)
 
 
-			mw, err := e.MessageWriter()
-			if err != nil {
-				return err
-			}
-
-			ledger := blockchain.New(mw, 1000)
-
 			// Join the node to the network, using our ledger
 			// Join the node to the network, using our ledger
-			if err := e.Join(ledger); err != nil {
+			if err := e.Join(); err != nil {
 				return err
 				return err
 			}
 			}
 
 
+			ledger, _ := e.Ledger()
 			return e.ConnectToService(ledger, c.String("name"), c.String("srcaddress"))
 			return e.ConnectToService(ledger, c.String("name"), c.String("srcaddress"))
 		},
 		},
 	}
 	}

+ 25 - 6
pkg/edgevpn/edgevpn.go

@@ -32,6 +32,8 @@ type EdgeVPN struct {
 	inputCh chan *hub.Message
 	inputCh chan *hub.Message
 	seed    int64
 	seed    int64
 	host    host.Host
 	host    host.Host
+
+	ledger *blockchain.Ledger
 }
 }
 
 
 func New(p ...Option) *EdgeVPN {
 func New(p ...Option) *EdgeVPN {
@@ -51,10 +53,29 @@ func New(p ...Option) *EdgeVPN {
 	}
 	}
 }
 }
 
 
+func (e *EdgeVPN) Ledger() (*blockchain.Ledger, error) {
+	if e.ledger != nil {
+		return e.ledger, nil
+	}
+	mw, err := e.MessageWriter()
+	if err != nil {
+		return nil, err
+	}
+
+	e.ledger = blockchain.New(mw, e.config.MaxBlockChainLength)
+	return e.ledger, nil
+}
+
 // Join the network with the ledger.
 // Join the network with the ledger.
 // It does the minimal action required to be connected
 // It does the minimal action required to be connected
 // without any active packet routing
 // without any active packet routing
-func (e *EdgeVPN) Join(ledger *blockchain.Ledger) error {
+func (e *EdgeVPN) Join() error {
+
+	ledger, err := e.Ledger()
+	if err != nil {
+		return err
+	}
+
 	// Set the handler when we receive messages
 	// Set the handler when we receive messages
 	// The ledger needs to read them and update the internal blockchain
 	// The ledger needs to read them and update the internal blockchain
 	e.config.Handlers = append(e.config.Handlers, ledger.Update)
 	e.config.Handlers = append(e.config.Handlers, ledger.Update)
@@ -62,7 +83,7 @@ func (e *EdgeVPN) Join(ledger *blockchain.Ledger) error {
 	e.config.Logger.Info("Starting EdgeVPN network")
 	e.config.Logger.Info("Starting EdgeVPN network")
 
 
 	// Startup libp2p network
 	// Startup libp2p network
-	err := e.startNetwork()
+	err = e.startNetwork()
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -94,20 +115,18 @@ func (e *EdgeVPN) Start() error {
 	}
 	}
 	defer ifce.Close()
 	defer ifce.Close()
 
 
-	mw, err := e.MessageWriter()
+	ledger, err := e.Ledger()
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
 
 
-	ledger := blockchain.New(mw, e.config.MaxBlockChainLength)
-
 	// Set the stream handler to get back the packets from the stream to the interface
 	// Set the stream handler to get back the packets from the stream to the interface
 	e.config.StreamHandlers[protocol.ID(Protocol)] = streamHandler(ledger, ifce)
 	e.config.StreamHandlers[protocol.ID(Protocol)] = streamHandler(ledger, ifce)
 
 
 	// Join the node to the network, using our ledger
 	// Join the node to the network, using our ledger
 	// it also starts up a goroutine that periodically sends
 	// it also starts up a goroutine that periodically sends
 	// messages to the network with our blockchain content
 	// messages to the network with our blockchain content
-	if err := e.Join(ledger); err != nil {
+	if err := e.Join(); err != nil {
 		return err
 		return err
 	}
 	}
 
 

+ 6 - 3
pkg/edgevpn/options.go

@@ -203,9 +203,10 @@ type OTP struct {
 type YAMLConnectionConfig struct {
 type YAMLConnectionConfig struct {
 	OTP OTP `yaml:"otp"`
 	OTP OTP `yaml:"otp"`
 
 
-	RoomName   string `yaml:"room"`
-	Rendezvous string `yaml:"rendezvous"`
-	MDNS       string `yaml:"mdns"`
+	RoomName            string `yaml:"room"`
+	Rendezvous          string `yaml:"rendezvous"`
+	MDNS                string `yaml:"mdns"`
+	MaxBlockChainLength int    `yaml:"max_blockchain_length"`
 }
 }
 
 
 func (y YAMLConnectionConfig) copy(cfg *Config) {
 func (y YAMLConnectionConfig) copy(cfg *Config) {
@@ -222,6 +223,7 @@ func (y YAMLConnectionConfig) copy(cfg *Config) {
 	cfg.SealKeyInterval = y.OTP.Crypto.Interval
 	cfg.SealKeyInterval = y.OTP.Crypto.Interval
 	cfg.ServiceDiscovery = []ServiceDiscovery{d, m}
 	cfg.ServiceDiscovery = []ServiceDiscovery{d, m}
 	cfg.SealKeyLength = y.OTP.Crypto.Length
 	cfg.SealKeyLength = y.OTP.Crypto.Length
+	cfg.MaxBlockChainLength = y.MaxBlockChainLength
 }
 }
 
 
 func GenerateNewConnectionData() (*YAMLConnectionConfig, error) {
 func GenerateNewConnectionData() (*YAMLConnectionConfig, error) {
@@ -237,6 +239,7 @@ func GenerateNewConnectionData() (*YAMLConnectionConfig, error) {
 	config.OTP.Crypto.Interval = 9000
 	config.OTP.Crypto.Interval = 9000
 	config.OTP.Crypto.Length = 12
 	config.OTP.Crypto.Length = 12
 	config.OTP.DHT.Length = 12
 	config.OTP.DHT.Length = 12
+	config.MaxBlockChainLength = 1000
 
 
 	return &config, nil
 	return &config, nil
 }
 }