forked from mirror/go-ethereum
parent
52952e274d
commit
5da78427d0
@ -0,0 +1,97 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"bufio" |
||||
"strings" |
||||
"os" |
||||
"errors" |
||||
"encoding/hex" |
||||
) |
||||
|
||||
type DbInterface struct { |
||||
db *MemDatabase |
||||
trie *Trie |
||||
} |
||||
|
||||
func NewDBInterface() *DbInterface { |
||||
db, _ := NewMemDatabase() |
||||
trie := NewTrie(db, "") |
||||
|
||||
return &DbInterface{db: db, trie: trie} |
||||
} |
||||
|
||||
func (i *DbInterface) ValidateInput(action string, argumentLength int) error { |
||||
err := false |
||||
var expArgCount int |
||||
|
||||
switch { |
||||
case action == "update" && argumentLength != 2: |
||||
err = true |
||||
expArgCount = 2 |
||||
case action == "get" && argumentLength != 1: |
||||
err = true |
||||
expArgCount = 1 |
||||
case (action == "quit" || action == "exit") && argumentLength != 0: |
||||
err = true |
||||
expArgCount = 0 |
||||
} |
||||
|
||||
if err { |
||||
return errors.New(fmt.Sprintf("'%s' requires %d args, got %d", action, expArgCount, argumentLength)) |
||||
} else { |
||||
return nil |
||||
} |
||||
} |
||||
|
||||
func (i *DbInterface) ParseInput(input string) bool { |
||||
scanner := bufio.NewScanner(strings.NewReader(input)) |
||||
scanner.Split(bufio.ScanWords) |
||||
|
||||
count := 0 |
||||
var tokens []string |
||||
for scanner.Scan() { |
||||
count++ |
||||
tokens = append(tokens, scanner.Text()) |
||||
} |
||||
if err := scanner.Err(); err != nil { |
||||
fmt.Fprintln(os.Stderr, "reading input:", err) |
||||
} |
||||
|
||||
if len(tokens) == 0 { return true } |
||||
|
||||
err := i.ValidateInput(tokens[0], count-1) |
||||
if err != nil { |
||||
fmt.Println(err) |
||||
} else { |
||||
switch tokens[0] { |
||||
case "update": |
||||
i.trie.Update(tokens[1], tokens[2]) |
||||
|
||||
fmt.Println(hex.EncodeToString([]byte(i.trie.root))) |
||||
case "get": |
||||
fmt.Println(i.trie.Get(tokens[1])) |
||||
case "exit", "quit", "q": |
||||
return false |
||||
default: |
||||
fmt.Println("Unknown command:", tokens[0]) |
||||
} |
||||
} |
||||
|
||||
return true |
||||
} |
||||
|
||||
func (i *DbInterface) Start() { |
||||
reader := bufio.NewReader(os.Stdin) |
||||
for { |
||||
fmt.Printf("db >>> ") |
||||
str, _, err := reader.ReadLine() |
||||
if err != nil { |
||||
fmt.Println("Error reading input", err) |
||||
} else { |
||||
if !i.ParseInput(string(str)) { |
||||
return |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,25 @@ |
||||
package main |
||||
|
||||
import ( |
||||
) |
||||
|
||||
/* |
||||
* This is a test memory database. Do not use for any production it does not get persisted |
||||
*/ |
||||
type MemDatabase struct { |
||||
db map[string][]byte |
||||
} |
||||
|
||||
func NewMemDatabase() (*MemDatabase, error) { |
||||
db := &MemDatabase{db: make(map[string][]byte)} |
||||
|
||||
return db, nil |
||||
} |
||||
|
||||
func (db *MemDatabase) Put(key []byte, value []byte) { |
||||
db.db[string(key)] = value |
||||
} |
||||
|
||||
func (db *MemDatabase) Get(key []byte) ([]byte, error) { |
||||
return db.db[string(key)], nil |
||||
} |
@ -0,0 +1,36 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
) |
||||
|
||||
func Testing() { |
||||
bm := NewBlockManager() |
||||
|
||||
tx := NewTransaction("\x00", 20, []string{ |
||||
"SET 10 6", |
||||
"LD 10 10", |
||||
"LT 10 1 20", |
||||
"SET 255 7", |
||||
"JMPI 20 255", |
||||
"STOP", |
||||
"SET 30 200", |
||||
"LD 30 31", |
||||
"SET 255 22", |
||||
"JMPI 31 255", |
||||
"SET 255 15", |
||||
"JMP 255", |
||||
}) |
||||
txData := tx.MarshalRlp() |
||||
|
||||
copyTx := &Transaction{} |
||||
copyTx.UnmarshalRlp(txData) |
||||
|
||||
tx2 := NewTransaction("\x00", 20, []string{"SET 10 6", "LD 10 10"}) |
||||
|
||||
blck := CreateBlock([]*Transaction{tx2, tx}) |
||||
|
||||
bm.ProcessBlock( blck ) |
||||
|
||||
fmt.Println("GenesisBlock:", GenisisBlock, "hashed", GenisisBlock.Hash()) |
||||
} |
Loading…
Reference in new issue