The core protocol of WoopChain
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
woop/node/node.go

101 lines
2.8 KiB

package node
import (
"harmony-benchmark/blockchain"
6 years ago
"harmony-benchmark/consensus"
"harmony-benchmark/log"
"net"
"os"
"sync"
"strconv"
)
var pendingTxMutex = &sync.Mutex{}
// A node represents a program (machine) participating in the network
type Node struct {
consensus *consensus.Consensus
BlockChannel chan blockchain.Block
pendingTransactions []*blockchain.Transaction
transactionInConsensus []*blockchain.Transaction
blockchain *blockchain.Blockchain
UtxoPool *blockchain.UTXOPool
log log.Logger
}
func (node *Node) addPendingTransactions(newTxs []*blockchain.Transaction) {
pendingTxMutex.Lock()
node.pendingTransactions = append(node.pendingTransactions, newTxs...)
pendingTxMutex.Unlock()
}
func (node *Node) getTransactionsForNewBlock() []*blockchain.Transaction {
pendingTxMutex.Lock()
selected, unselected := node.UtxoPool.SelectTransactionsForNewBlock(node.pendingTransactions)
node.pendingTransactions = unselected
pendingTxMutex.Unlock()
return selected
}
// Start a server and process the request by a handler.
func (node *Node) StartServer(port string) {
node.log.Debug("Starting server", "node", node)
node.listenOnPort(port)
}
6 years ago
func (node *Node) listenOnPort(port string) {
listen, err := net.Listen("tcp4", ":"+port)
defer listen.Close()
if err != nil {
node.log.Crit("Socket listen port failed", "port", port, "err", err)
os.Exit(1)
}
for {
conn, err := listen.Accept()
if err != nil {
node.log.Crit("Error listening on port. Exiting.", "port", port)
continue
}
go node.NodeHandler(conn)
}
}
6 years ago
func (node *Node) String() string {
return node.consensus.String()
}
// Testing code. Should be deleted for production
// Create in genesis block 1000 transactions assigning 1000 token to each address in [1 - 1000]
func (node *Node) AddMoreFakeTransactions() {
txs := make([]*blockchain.Transaction, 1000)
for i := range txs {
txs[i] = blockchain.NewCoinbaseTX(strconv.Itoa(i), "")
}
node.blockchain.Blocks[0].Transactions = append(node.blockchain.Blocks[0].Transactions, txs...)
node.UtxoPool.Update(txs)
}
// Create a new Node
func NewNode(consensus *consensus.Consensus) Node {
node := Node{}
// Consensus and associated channel to communicate blocks
node.consensus = consensus
node.BlockChannel = make(chan blockchain.Block)
6 years ago
// Genesis Block
genesisBlock := &blockchain.Blockchain{}
genesisBlock.Blocks = make([]*blockchain.Block, 0)
coinbaseTx := blockchain.NewCoinbaseTX("harmony", "1")
genesisBlock.Blocks = append(genesisBlock.Blocks, blockchain.NewGenesisBlock(coinbaseTx))
node.blockchain = genesisBlock
// UTXO pool from Genesis block
node.UtxoPool = blockchain.CreateUTXOPoolFromGenesisBlockChain(node.blockchain)
// Logger
6 years ago
node.log = node.consensus.Log
return node
6 years ago
}