88 lines
1.7 KiB
Go
88 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/ed25519"
|
|
"crypto/rand"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/decred/dcrd/chaincfg/v3"
|
|
"github.com/jholdstock/dcrvsp/database"
|
|
"github.com/jrick/wsrpc/v2"
|
|
)
|
|
|
|
const listen = ":3000"
|
|
|
|
type Config struct {
|
|
signKey ed25519.PrivateKey
|
|
pubKey ed25519.PublicKey
|
|
poolFees float64
|
|
netParams *chaincfg.Params
|
|
dbFile string
|
|
}
|
|
|
|
var cfg Config
|
|
|
|
// Database with stubbed methods
|
|
var db *database.VspDatabase
|
|
|
|
var nodeConnection *wsrpc.Client
|
|
|
|
func initConfig() (*Config, error) {
|
|
homePath := "~/.dcrvsp"
|
|
|
|
seedPath := filepath.Join(homePath, "sign.seed")
|
|
seed, err := ioutil.ReadFile(seedPath)
|
|
var signKey ed25519.PrivateKey
|
|
if err != nil {
|
|
if !os.IsNotExist(err) {
|
|
return nil, errors.New("seedPath does not exist")
|
|
}
|
|
|
|
_, signKey, err = ed25519.GenerateKey(rand.Reader)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to generate signing key: %v", err)
|
|
}
|
|
err = ioutil.WriteFile(seedPath, signKey.Seed(), 0400)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to save signing key: %v", err)
|
|
}
|
|
} else {
|
|
signKey = ed25519.NewKeyFromSeed(seed)
|
|
}
|
|
|
|
pubKey, ok := signKey.Public().(ed25519.PublicKey)
|
|
if !ok {
|
|
return nil, fmt.Errorf("failed to cast signing key: %T", pubKey)
|
|
}
|
|
|
|
return &Config{
|
|
netParams: chaincfg.TestNet3Params(),
|
|
dbFile: filepath.Join(homePath, "database.db"),
|
|
pubKey: pubKey,
|
|
poolFees: 0.1,
|
|
signKey: signKey,
|
|
}, nil
|
|
}
|
|
|
|
func main() {
|
|
|
|
cfg, err := initConfig()
|
|
if err != nil {
|
|
log.Fatalf("config error: %v", err)
|
|
}
|
|
|
|
db, err = database.New(cfg.dbFile)
|
|
if err != nil {
|
|
log.Fatalf("database error: %v", err)
|
|
}
|
|
|
|
// Start HTTP server
|
|
log.Printf("Listening on %s", listen)
|
|
log.Print(newRouter().Run(listen))
|
|
}
|