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 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 }