package node
|
|
|
|
import (
|
|
"crypto/ecdsa"
|
|
|
|
"github.com/arnaucube/slowlorisdb/core"
|
|
"github.com/arnaucube/slowlorisdb/db"
|
|
)
|
|
|
|
type Node struct {
|
|
PrivK *ecdsa.PrivateKey
|
|
Addr core.Address
|
|
Bc *core.Blockchain
|
|
PendingTxs []core.Tx
|
|
}
|
|
|
|
func NewNode(db *db.Db, dif uint64) (*Node, error) {
|
|
privK, err := core.NewKey()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
addr := core.AddressFromPrivK(privK)
|
|
|
|
bc := core.NewBlockchain(db, dif)
|
|
|
|
node := &Node{
|
|
PrivK: privK,
|
|
Addr: addr,
|
|
Bc: bc,
|
|
}
|
|
return node, nil
|
|
}
|
|
|
|
func (node *Node) Sign(m []byte) (*core.Signature, error) {
|
|
return core.Sign(node.PrivK, m)
|
|
}
|
|
|
|
func (node *Node) SignBlock(block *core.Block) (*core.Signature, error) {
|
|
return core.Sign(node.PrivK, block.Hash[:])
|
|
}
|
|
|
|
func (node *Node) AddToPendingTxs(tx core.Tx) {
|
|
node.PendingTxs = append(node.PendingTxs, tx)
|
|
}
|
|
|
|
func (node *Node) BlockFromPendingTxs() (*core.Block, error) {
|
|
block := node.Bc.NewBlock(node.PendingTxs)
|
|
err := block.CalculatePoW(node.Bc.Difficulty)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
sig, err := node.SignBlock(block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
block.Signature = sig.Bytes()
|
|
return block, nil
|
|
}
|