Skip to content

Commit

Permalink
added fs helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Fayemi committed Dec 20, 2022
1 parent 89b36fd commit 7c6fd2c
Show file tree
Hide file tree
Showing 8 changed files with 155 additions and 74 deletions.
Binary file modified .DS_Store
Binary file not shown.
15 changes: 12 additions & 3 deletions cmd/flt/balances.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,19 @@ package main
import (
"flutechain/database"
"fmt"
"github.com/spf13/cobra"
"os"

"github.com/spf13/cobra"
)

var balancesListCommand = &cobra.Command{
Use: "list",
Short: "list all wallet balances.",
Run: func(cmd *cobra.Command, args []string) {
state, err := database.NewStateFromDisk()

dataDir, _ := cmd.Flags().GetString(flagDataDir)
state, err := database.NewStateFromDisk(dataDir)

if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
Expand All @@ -34,7 +38,9 @@ func balancesCmd() *cobra.Command {
Use: "balances",
Short: "interact with balances",
Run: func(cmd *cobra.Command, args []string) {
state, err := database.NewStateFromDisk()

dataDir, _ := cmd.Flags().GetString(flagDataDir)
state, err := database.NewStateFromDisk(dataDir)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
Expand All @@ -53,6 +59,9 @@ func balancesCmd() *cobra.Command {
},
}

balanceCmd.Flags().String(accountFlag, "", "account to get balance")
balanceCmd.MarkFlagRequired(accountFlag)

addDefaultRequiredFlags(balanceCmd)

balanceCmd.AddCommand(balancesListCommand)
Expand Down
8 changes: 5 additions & 3 deletions cmd/flt/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ package main

import (
"fmt"
"github.com/spf13/cobra"
"os"

"github.com/spf13/cobra"
)

const accountFlag = "account"

const fromFlag = "from"
const toFlag = "to"
const valueFlag = "value"
const flagDataDir = "datadir"

func main() {
var cmd = &cobra.Command{
Expand All @@ -36,6 +38,6 @@ func incorrectUsageErr() error {
}

func addDefaultRequiredFlags(cmd *cobra.Command) {
cmd.Flags().String(accountFlag, "", "account to get balance")
cmd.MarkFlagRequired(accountFlag)
cmd.Flags().String(flagDataDir, "", "Absolute path to your node's data dir where the DB will be/is stored")
cmd.MarkFlagRequired(flagDataDir)
}
10 changes: 8 additions & 2 deletions cmd/flt/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package main
import (
"flutechain/database"
"fmt"
"github.com/spf13/cobra"
"os"

"github.com/spf13/cobra"
)

func txCmd() *cobra.Command {
Expand All @@ -29,6 +30,9 @@ func txAddCmd() *cobra.Command {
Use: "add",
Short: "Adds new Tx to database",
Run: func(cmd *cobra.Command, args []string) {

dataDir, _ := cmd.Flags().GetString(flagDataDir)

from, _ := cmd.Flags().GetString(fromFlag)
to, _ := cmd.Flags().GetString(toFlag)
value, _ := cmd.Flags().GetUint(valueFlag)
Expand All @@ -38,7 +42,7 @@ func txAddCmd() *cobra.Command {

tx := database.NewTx(fromAcc, toAcc, value, "")

state, err := database.NewStateFromDisk()
state, err := database.NewStateFromDisk(dataDir)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
Expand All @@ -60,6 +64,8 @@ func txAddCmd() *cobra.Command {
},
}

addDefaultRequiredFlags(cmd)

cmd.Flags().String(fromFlag, "", "Account to send tokens from")
cmd.Flags().String(toFlag, "", "Account to send tokens to")
cmd.Flags().Uint(valueFlag, 0, "Amount of tokens to send")
Expand Down
112 changes: 57 additions & 55 deletions cmd/fltmigrate/main.go
Original file line number Diff line number Diff line change
@@ -1,61 +1,63 @@
package main

import (
"flutechain/database"
"fmt"
"os"
"time"
)
// "flutechain/database"
// "fmt"
// "os"
// "time"

func main() {
state, err := database.NewStateFromDisk()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}

defer state.Close()

state.Add(database.NewTx(database.Account("dan"), database.Account("andre"), 400, ""))
state.Add(database.NewTx(database.Account("dan"), database.Account("dan"), 1500, "reward"))

hash, err := state.Persist()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}

block0 := database.NewBlock(
hash,
uint64(time.Now().Unix()),
[]database.Tx{
database.NewTx(database.Account("dan"), database.Account("andre"), 400, ""),
database.NewTx(database.Account("dan"), database.Account("dan"), 1500, "reward"),
},
)

err = state.AddBlock(block0)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}

blockHash0 := state.LatestHash()

block1 := database.NewBlock(
blockHash0,
uint64(time.Now().Unix()),
[]database.Tx{
database.NewTx(database.Account("andre"), database.Account("dan"), 100, ""),
database.NewTx(database.Account("dan"), database.Account("sam"), 500, ""),
database.NewTx(database.Account("dan"), database.Account("dan"), 1000, "reward"),
},
)

err = state.AddBlock(block1)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// dataDir, _ := cmd.Flags().GetString(flagDataDir)

// state, err := database.NewStateFromDisk()
// if err != nil {
// fmt.Fprintln(os.Stderr, err)
// os.Exit(1)
// }

// defer state.Close()

// // state.Add(database.NewTx(database.Account("dan"), database.Account("andre"), 400, ""))
// // state.Add(database.NewTx(database.Account("dan"), database.Account("dan"), 1500, "reward"))

// hash, err := state.Persist()
// if err != nil {
// fmt.Fprintln(os.Stderr, err)
// os.Exit(1)
// }

// block0 := database.NewBlock(
// hash,
// uint64(time.Now().Unix()),
// []database.Tx{
// database.NewTx(database.Account("dan"), database.Account("andre"), 400, ""),
// database.NewTx(database.Account("dan"), database.Account("dan"), 1500, "reward"),
// },
// )

// err = state.AddBlock(block0)
// if err != nil {
// fmt.Fprintln(os.Stderr, err)
// os.Exit(1)
// }

// blockHash0 := state.LatestHash()

// block1 := database.NewBlock(
// blockHash0,
// uint64(time.Now().Unix()),
// []database.Tx{
// database.NewTx(database.Account("andre"), database.Account("dan"), 100, ""),
// database.NewTx(database.Account("dan"), database.Account("sam"), 500, ""),
// database.NewTx(database.Account("dan"), database.Account("dan"), 1000, "reward"),
// },
// )

// state.AddBlock(block1)
// // state.Persist()

// if err != nil {
// fmt.Fprintln(os.Stderr, err)
// os.Exit(1)
// }

}
55 changes: 55 additions & 0 deletions database/fs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package database

import (
"io/ioutil"
"os"
"path/filepath"
)

func initDataDirIfNotExists(dataDir string) error {
if fileExist(getGenesisJsonFilePath(dataDir)) {
return nil
}

dbDir := getDatabaseDirPath(dataDir)
if err := os.MkdirAll(dbDir, os.ModePerm); err != nil {
return err
}

gen := getGenesisJsonFilePath(dataDir)
if err := writeEmptyBlocksDbToDisk(gen); err != nil {
return err
}

blocks := getBlocksDbFilePath(dataDir)
if err := writeEmptyBlocksDbToDisk(blocks); err != nil {
return err
}

return nil
}

func getDatabaseDirPath(dataDir string) string {
return filepath.Join(dataDir, "database")
}

func getGenesisJsonFilePath(dataDir string) string {
return filepath.Join(dataDir, "genesis.json")
}

func getBlocksDbFilePath(dataDir string) string {
return filepath.Join(getDatabaseDirPath(dataDir), "block.db")
}

func fileExist(filePath string) bool {
_, err := os.Stat(filePath)
if err != nil && os.IsNotExist(err) {
return false
}

return true
}

func writeEmptyBlocksDbToDisk(path string) error {
return ioutil.WriteFile(path, []byte(""), os.ModePerm)
}
27 changes: 17 additions & 10 deletions database/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"time"
)

Expand All @@ -18,30 +17,38 @@ type State struct {
dbFile *os.File
}

func NewStateFromDisk() (*State, error) {
func NewStateFromDisk(dataDir string) (*State, error) {

// to get working dir
cwd, err := os.Getwd()
err := initDataDirIfNotExists(dataDir)
if err != nil {
return nil, err
}

// get genesis file path
genesisFilePath := filepath.Join(cwd, "database", "genesis.json")
genesis, err := LoadGenesis(genesisFilePath)
genesis, err := LoadGenesis(getGenesisJsonFilePath(dataDir))
if err != nil {
return nil, err
}

// // to get working dir
// cwd, err := os.Getwd()
// if err != nil {
// return nil, err
// }

// // get genesis file path
// genesisFilePath := filepath.Join(cwd, "database", "genesis.json")
// genesis, err := LoadGenesis(genesisFilePath)
// if err != nil {
// return nil, err
// }

balances := make(map[Account]uint)

for account, balance := range genesis.Balances {
balances[account] = balance
}

// get transactions file path
blockFilePath := filepath.Join(cwd, "database", "block.db")
f, err := os.OpenFile(blockFilePath, os.O_APPEND|os.O_RDWR, 0600)
f, err := os.OpenFile(getBlocksDbFilePath(dataDir), os.O_APPEND|os.O_RDWR, 0600)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ go 1.18

require (
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/spf13/cobra v1.5.0 // indirect
github.com/spf13/cobra v1.5.0
github.com/spf13/pflag v1.0.5 // indirect
)

0 comments on commit 7c6fd2c

Please sign in to comment.