Improve UTXOSet

This commit is contained in:
Ivan Kuznetsov 2017-09-17 10:30:30 +07:00
parent 249b7f4eff
commit 7eda539141
3 changed files with 36 additions and 15 deletions

13
cli.go
View File

@ -17,6 +17,7 @@ func (cli *CLI) printUsage() {
fmt.Println(" getbalance -address ADDRESS - Get balance of ADDRESS")
fmt.Println(" listaddresses - Lists all addresses from the wallet file")
fmt.Println(" printchain - Print all the blocks of the blockchain")
fmt.Println(" reindexutxo - Rebuilds the UTXO set")
fmt.Println(" send -from FROM -to TO -amount AMOUNT - Send AMOUNT of coins from FROM address to TO")
}
@ -35,8 +36,9 @@ func (cli *CLI) Run() {
createBlockchainCmd := flag.NewFlagSet("createblockchain", flag.ExitOnError)
createWalletCmd := flag.NewFlagSet("createwallet", flag.ExitOnError)
listAddressesCmd := flag.NewFlagSet("listaddresses", flag.ExitOnError)
sendCmd := flag.NewFlagSet("send", flag.ExitOnError)
printChainCmd := flag.NewFlagSet("printchain", flag.ExitOnError)
reindexUTXOCmd := flag.NewFlagSet("reindexutxo", flag.ExitOnError)
sendCmd := flag.NewFlagSet("send", flag.ExitOnError)
getBalanceAddress := getBalanceCmd.String("address", "", "The address to get balance for")
createBlockchainAddress := createBlockchainCmd.String("address", "", "The address to send genesis block reward to")
@ -75,6 +77,11 @@ func (cli *CLI) Run() {
if err != nil {
log.Panic(err)
}
case "reindexutxo":
err := reindexUTXOCmd.Parse(os.Args[2:])
if err != nil {
log.Panic(err)
}
default:
cli.printUsage()
os.Exit(1)
@ -108,6 +115,10 @@ func (cli *CLI) Run() {
cli.printChain()
}
if reindexUTXOCmd.Parsed() {
cli.reindexUTXO()
}
if sendCmd.Parsed() {
if *sendFrom == "" || *sendTo == "" || *sendAmount <= 0 {
sendCmd.Usage()

12
cli_reindexutxo.go Normal file
View File

@ -0,0 +1,12 @@
package main
import "fmt"
func (cli *CLI) reindexUTXO() {
bc := NewBlockchain("")
UTXOSet := UTXOSet{bc}
UTXOSet.Reindex()
count := UTXOSet.GetCount()
fmt.Printf("Done! There are %d transactions in the UTXO set.", count)
}

View File

@ -10,16 +10,15 @@ import (
const utxoBucket = "chainstate"
// UTXOSet represents UTXO set
type UTXOSet struct{}
type UTXOSet struct {
Blockchain *Blockchain
}
// Reindex rebuilds the UTXO set
func (u UTXOSet) Reindex(bc *Blockchain) {
db, err := bolt.Open(dbFile, 0600, nil)
if err != nil {
log.Panic(err)
}
func (u UTXOSet) Reindex() {
db := u.Blockchain.db
err = db.Update(func(tx *bolt.Tx) error {
err := db.Update(func(tx *bolt.Tx) error {
bucketName := []byte(utxoBucket)
b := tx.Bucket(bucketName)
@ -41,7 +40,7 @@ func (u UTXOSet) Reindex(bc *Blockchain) {
log.Panic(err)
}
UTXO := bc.FindAllUTXO()
UTXO := u.Blockchain.FindAllUTXO()
err = db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte(utxoBucket))
@ -64,14 +63,10 @@ func (u UTXOSet) Reindex(bc *Blockchain) {
// GetCount returns the number of transactions in the UTXO set
func (u UTXOSet) GetCount() int {
db := u.Blockchain.db
counter := 0
db, err := bolt.Open(dbFile, 0600, nil)
if err != nil {
log.Panic(err)
}
err = db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte(utxoBucket))
c := b.Cursor()
@ -81,6 +76,9 @@ func (u UTXOSet) GetCount() int {
return nil
})
if err != nil {
log.Panic(err)
}
return counter
}