store_disk.go 734 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package blockchain
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strconv"
  6. "github.com/peterbourgon/diskv"
  7. )
  8. type DiskStore struct {
  9. chain *diskv.Diskv
  10. }
  11. func NewDiskStore(d *diskv.Diskv) *DiskStore {
  12. return &DiskStore{chain: d}
  13. }
  14. func (m *DiskStore) Add(b Block) {
  15. bb, _ := json.Marshal(b)
  16. m.chain.Write(fmt.Sprint(b.Index), bb)
  17. m.chain.Write("index", []byte(fmt.Sprint(b.Index)))
  18. }
  19. func (m *DiskStore) Len() int {
  20. count, err := m.chain.Read("index")
  21. if err != nil {
  22. return 0
  23. }
  24. c, _ := strconv.Atoi(string(count))
  25. return c
  26. }
  27. func (m *DiskStore) Last() Block {
  28. b := &Block{}
  29. count, err := m.chain.Read("index")
  30. if err != nil {
  31. return *b
  32. }
  33. dat, _ := m.chain.Read(string(count))
  34. json.Unmarshal(dat, b)
  35. return *b
  36. }