arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
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}