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 block.CalculateHash()
37 sig, err := core.Sign(node.PrivK, block.Hash[:])
38 if err != nil {
39 return err
40 }
41 block.Signature = sig.Bytes()
42 return nil
43}
44
45func (node *Node) AddToPendingTxs(tx core.Tx) {
46 node.PendingTxs = append(node.PendingTxs, tx)
47}
48
49func (node *Node) BlockFromPendingTxs() (*core.Block, error) {
50 block, err := node.NewBlock(node.PendingTxs)
51 if err != nil {
52 return nil, err
53 }
54 block.PrevHash = node.Bc.LastBlock.Hash
55 err = block.CalculatePoW(node.Bc.Difficulty)
56 if err != nil {
57 return nil, err
58 }
59 err = node.SignBlock(block)
60 if err != nil {
61 return nil, err
62 }
63 block.CalculateHash()
64
65 return block, nil
66}
67
68func (node *Node) NewBlock(txs []core.Tx) (*core.Block, error) {
69 block := &core.Block{
70 Height: node.Bc.GetHeight() + 1,
71 PrevHash: node.Bc.LastBlock.Hash,
72 Txs: txs,
73 Miner: core.Address{},
74 MinerPubK: &node.PrivK.PublicKey,
75 Timestamp: time.Now(),
76 Nonce: 0,
77 Hash: core.Hash{},
78 Signature: []byte{},
79 }
80 block.CalculateHash()
81 err := node.SignBlock(block)
82 if err != nil {
83 return nil, err
84 }
85 return block, nil
86}
87
88func (node *Node) CreateGenesis() (*core.Block, error) {
89 block := &core.Block{
90 Height: node.Bc.LastBlock.Height + 1,
91 PrevHash: node.Bc.LastBlock.Hash,
92 Txs: []core.Tx{},
93 Miner: node.Addr,
94 MinerPubK: &node.PrivK.PublicKey,
95 Timestamp: time.Now(),
96 Nonce: uint64(0),
97 Hash: core.Hash{},
98 Signature: []byte{},
99 }
100
101 block.CalculateHash()
102 err := node.SignBlock(block)
103 if err != nil {
104 return nil, err
105 }
106 return block, nil
107}