slowlorisdb/node/node.go
node/node.goRaw
1package node
2
3import (
4 "crypto/ecdsa"
5
6 "github.com/arnaucube/slowlorisdb/core"
7 "github.com/arnaucube/slowlorisdb/db"
8)
9
10type Node struct {
11 PrivK *ecdsa.PrivateKey
12 Addr core.Address
13 Bc *core.Blockchain
14 PendingTxs []core.Tx
15}
16
17func NewNode(db *db.Db, dif uint64) (*Node, error) {
18 privK, err := core.NewKey()
19 if err != nil {
20 return nil, err
21 }
22 addr := core.AddressFromPrivK(privK)
23
24 bc := core.NewBlockchain(db, dif)
25
26 node := &Node{
27 PrivK: privK,
28 Addr: addr,
29 Bc: bc,
30 }
31 return node, nil
32}
33
34func (node *Node) Sign(m []byte) (*core.Signature, error) {
35 return core.Sign(node.PrivK, m)
36}
37
38func (node *Node) AddToPendingTxs(tx core.Tx) {
39 node.PendingTxs = append(node.PendingTxs, tx)
40}
41
42func (node *Node) BlockFromPendingTxs() (*core.Block, error) {
43 block := node.Bc.NewBlock(node.PendingTxs)
44 err := block.CalculatePoW(node.Bc.Difficulty)
45 if err != nil {
46 return nil, err
47 }
48 sig, err := node.Sign(block.Bytes())
49 if err != nil {
50 return nil, err
51 }
52 block.Signature = sig.Bytes()
53 return block, nil
54}