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) (*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}