|
@@ -1,9 +1,12 @@
|
|
package blockchain
|
|
package blockchain
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "bytes"
|
|
|
|
+ "compress/gzip"
|
|
"context"
|
|
"context"
|
|
"encoding/json"
|
|
"encoding/json"
|
|
"io"
|
|
"io"
|
|
|
|
+ "io/ioutil"
|
|
"log"
|
|
"log"
|
|
"sync"
|
|
"sync"
|
|
"time"
|
|
"time"
|
|
@@ -52,11 +55,13 @@ func (l *Ledger) Syncronizer(ctx context.Context, t time.Duration) {
|
|
select {
|
|
select {
|
|
case <-t.C:
|
|
case <-t.C:
|
|
l.Lock()
|
|
l.Lock()
|
|
|
|
+
|
|
bytes, err := json.Marshal(l.blockchain.Last())
|
|
bytes, err := json.Marshal(l.blockchain.Last())
|
|
if err != nil {
|
|
if err != nil {
|
|
log.Println(err)
|
|
log.Println(err)
|
|
}
|
|
}
|
|
- l.channel.Write(bytes)
|
|
|
|
|
|
+
|
|
|
|
+ l.channel.Write(compress(bytes).Bytes())
|
|
|
|
|
|
l.Unlock()
|
|
l.Unlock()
|
|
case <-ctx.Done():
|
|
case <-ctx.Done():
|
|
@@ -66,12 +71,39 @@ func (l *Ledger) Syncronizer(ctx context.Context, t time.Duration) {
|
|
}()
|
|
}()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func compress(b []byte) *bytes.Buffer {
|
|
|
|
+ var buf bytes.Buffer
|
|
|
|
+ gz := gzip.NewWriter(&buf)
|
|
|
|
+ gz.Write(b)
|
|
|
|
+ gz.Close()
|
|
|
|
+ return &buf
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func deCompress(b []byte) (*bytes.Buffer, error) {
|
|
|
|
+ r, err := gzip.NewReader(bytes.NewReader(b))
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ result, err := ioutil.ReadAll(r)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return bytes.NewBuffer(result), nil
|
|
|
|
+}
|
|
|
|
+
|
|
// Update the blockchain from a message
|
|
// Update the blockchain from a message
|
|
func (l *Ledger) Update(h *hub.Message) (err error) {
|
|
func (l *Ledger) Update(h *hub.Message) (err error) {
|
|
//chain := make(Blockchain, 0)
|
|
//chain := make(Blockchain, 0)
|
|
block := &Block{}
|
|
block := &Block{}
|
|
|
|
|
|
- err = json.Unmarshal([]byte(h.Message), block)
|
|
|
|
|
|
+ b, err := deCompress([]byte(h.Message))
|
|
|
|
+ if err != nil {
|
|
|
|
+ err = errors.Wrap(err, "failed decompressing")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = json.Unmarshal(b.Bytes(), block)
|
|
if err != nil {
|
|
if err != nil {
|
|
err = errors.Wrap(err, "failed unmarshalling blockchain data")
|
|
err = errors.Wrap(err, "failed unmarshalling blockchain data")
|
|
return
|
|
return
|
|
@@ -278,5 +310,5 @@ func (l *Ledger) writeData(s map[string]map[string]Data) {
|
|
log.Println(err)
|
|
log.Println(err)
|
|
}
|
|
}
|
|
|
|
|
|
- l.channel.Write(bytes)
|
|
|
|
|
|
+ l.channel.Write(compress(bytes).Bytes())
|
|
}
|
|
}
|