slowlorisdb/node/node.go
node/node.goRaw
1package node
2
3import (
4 "crypto/ecdsa"
5 "time"
6
7 "github.com/arnaucube/slowlorisdb/core"
8)
9
10type Node struct {
11 PrivK *ecdsa.PrivateKey
12 Addr core.Address
13 Bc *core.Blockchain
14 Miner bool // indicates if the node is running as a miner
15 PendingTxs []core.Tx
16}
17
18func NewNode(privK *ecdsa.PrivateKey, bc *core.Blockchain, isMiner bool) (*Node, error) {
19 addr := core.AddressFromPrivK(privK)
20
21 node := &Node{
22 PrivK: privK,
23 Addr: addr,
24 Bc: bc,
25 Miner: isMiner,
26 PendingTxs: []core.Tx{},
27 }
28 return node, nil
29}
30
31func (node *Node) Sign(m []byte) (*core.Signature, error) {
32 return core.Sign(node.PrivK, m)
33}
34
35func (node *Node) SignBlock(block *core.Block) error {
36 sig, err := core.Sign(node.PrivK, block.Hash[:])
37 if err != nil {
38 return err
39 }
40 block.Signature = sig.Bytes()
41 return nil
42}
43
44func (node *Node) AddToPendingTxs(tx core.Tx) {
45 node.PendingTxs = append(node.PendingTxs, tx)
46}
47
48func (node *Node) BlockFromPendingTxs() (*core.Block, error) {
49 block := node.NewBlock(node.PendingTxs)
50 block.PrevHash = node.Bc.LastBlock.Hash
51 err := block.CalculatePoW(node.Bc.Difficulty)
52 if err != nil {
53 return nil, err
54 }
55 err = node.SignBlock(block)
56 if err != nil {
57 return nil, err
58 }
59 block.CalculateHash()
60
61 return block, nil
62}
63
64func (node *Node) NewBlock(txs []core.Tx) *core.Block {
65 block := &core.Block{
66 Height: node.Bc.GetHeight() + 1,
67 PrevHash: node.Bc.LastBlock.Hash,
68 Txs: txs,
69 Miner: core.Address{},
70 MinerPubK: &node.PrivK.PublicKey,
71 Timestamp: time.Now(),
72 Nonce: 0,
73 Hash: core.Hash{},
74 Signature: []byte{},
75 }
76 return block
77}
78
79func (node *Node) CreateGenesis() (*core.Block, error) {
80 block := &core.Block{
81 Height: node.Bc.LastBlock.Height,
82 PrevHash: node.Bc.LastBlock.Hash,
83 Txs: []core.Tx{},
84 Miner: node.Addr,
85 MinerPubK: &node.PrivK.PublicKey,
86 Timestamp: time.Now(),
87 Nonce: uint64(0),
88 Hash: core.Hash{},
89 Signature: []byte{},
90 }
91
92 err := node.SignBlock(block)
93 if err != nil {
94 return nil, err
95 }
96 block.CalculateHash()
97 return block, nil
98}