arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
slowlorisdb/node/node.go
node/node.goRaw
 1package node
 2
 3import (
 4	"crypto/ecdsa"
 5
 6	"github.com/arnaucube/slowlorisdb/core"
 7	"github.com/arnaucube/slowlorisdb/db"
 8)
 9
10type Node struct {
11	PrivK      *ecdsa.PrivateKey
12	Addr       core.Address
13	Bc         *core.Blockchain
14	PendingTxs []core.Tx
15}
16
17func NewNode(db *db.Db, dif uint64) (*Node, error) {
18	privK, err := core.NewKey()
19	if err != nil {
20		return nil, err
21	}
22	addr := core.AddressFromPrivK(privK)
23
24	bc := core.NewBlockchain(db, dif)
25
26	node := &Node{
27		PrivK: privK,
28		Addr:  addr,
29		Bc:    bc,
30	}
31	return node, nil
32}
33
34func (node *Node) Sign(m []byte) (*core.Signature, error) {
35	return core.Sign(node.PrivK, m)
36}
37
38func (node *Node) SignBlock(block *core.Block) (*core.Signature, error) {
39	return core.Sign(node.PrivK, block.Hash[:])
40}
41
42func (node *Node) AddToPendingTxs(tx core.Tx) {
43	node.PendingTxs = append(node.PendingTxs, tx)
44}
45
46func (node *Node) BlockFromPendingTxs() (*core.Block, error) {
47	block := node.Bc.NewBlock(node.PendingTxs)
48	err := block.CalculatePoW(node.Bc.Difficulty)
49	if err != nil {
50		return nil, err
51	}
52	sig, err := node.SignBlock(block)
53	if err != nil {
54		return nil, err
55	}
56	block.Signature = sig.Bytes()
57	return block, nil
58}