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/client/client.go

75 lines
2.3 KiB

package client
import (
"github.com/harmony-one/harmony/core/types"
"github.com/simple-rules/harmony-benchmark/blockchain"
"sync"
"github.com/harmony-one/harmony/log"
"github.com/harmony-one/harmony/p2p"
"github.com/harmony-one/harmony/p2p/host"
)
// Client represents a node (e.g. a wallet) which sends transactions and receives responses from the harmony network
type Client struct {
Leaders *map[uint32]p2p.Peer // Map of shard Id and corresponding leader
UpdateBlocks func([]*types.Block) // Closure function used to sync new block with the leader. Once the leader finishes the consensus on a new block, it will send it to the clients. Clients use this method to update their blockchain
6 years ago
ShardUtxoMap map[uint32]blockchain.UtxoMap
ShardUtxoMapMutex sync.Mutex // Mutex for the UTXO maps
log log.Logger // Log utility
// The p2p host used to send/receive p2p messages
host host.Host
}
// NewClient creates a new Client
func NewClient(host host.Host, leaders *map[uint32]p2p.Peer) *Client {
client := Client{}
client.Leaders = leaders
client.host = host
// Logger
client.log = log.New()
return &client
}
// BuildOutputShardTransactionMap builds output shard transaction map.
func BuildOutputShardTransactionMap(txs []*blockchain.Transaction) map[uint32][]*blockchain.Transaction {
txsShardMap := make(map[uint32][]*blockchain.Transaction)
// Put txs into corresponding output shards
for _, crossTx := range txs {
for curShardID := range GetOutputShardIDsOfCrossShardTx(crossTx) {
txsShardMap[curShardID] = append(txsShardMap[curShardID], crossTx)
}
}
return txsShardMap
}
// GetInputShardIDsOfCrossShardTx gets input shardID.
func GetInputShardIDsOfCrossShardTx(crossTx *blockchain.Transaction) map[uint32]bool {
shardIDs := map[uint32]bool{}
for _, txInput := range crossTx.TxInput {
shardIDs[txInput.ShardID] = true
}
return shardIDs
}
// GetOutputShardIDsOfCrossShardTx gets output shard ids.
func GetOutputShardIDsOfCrossShardTx(crossTx *blockchain.Transaction) map[uint32]bool {
shardIDs := map[uint32]bool{}
for _, txOutput := range crossTx.TxOutput {
shardIDs[txOutput.ShardID] = true
}
return shardIDs
}
// GetLeaders returns leader peers.
func (client *Client) GetLeaders() []p2p.Peer {
leaders := []p2p.Peer{}
for _, leader := range *client.Leaders {
leaders = append(leaders, leader)
}
return leaders
}