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) (*core.Signature, error) {
36 return core.Sign(node.PrivK, block.Hash[:])
37}
38
39func (node *Node) AddToPendingTxs(tx core.Tx) {
40 node.PendingTxs = append(node.PendingTxs, tx)
41}
42
43func (node *Node) BlockFromPendingTxs() (*core.Block, error) {
44 block := node.NewBlock(node.PendingTxs)
45 err := block.CalculatePoW(node.Bc.Difficulty)
46 if err != nil {
47 return nil, err
48 }
49 sig, err := node.SignBlock(block)
50 if err != nil {
51 return nil, err
52 }
53 block.Signature = sig.Bytes()
54 return block, nil
55}
56
57func (node *Node) NewBlock(txs []core.Tx) *core.Block {
58 block := &core.Block{
59 Height: node.Bc.GetHeight() + 1,
60 PrevHash: node.Bc.LastBlock.Hash,
61 Txs: txs,
62 Miner: core.Address{},
63 MinerPubK: &node.PrivK.PublicKey,
64 Timestamp: time.Now(),
65 Nonce: 0,
66 Hash: core.Hash{},
67 Signature: []byte{},
68 }
69 return block
70}