package server; import PBFT.*; import com.google.common.collect.Maps; import common.CryptoUtil; import common.Digest; import config.GroupConfigProvider; import config.GroupMember; import org.apache.log4j.*; import org.apache.thrift.TException; import org.apache.thrift.transport.TTransportException; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.security.KeyPair; import java.security.PrivateKey; import java.security.PublicKey; import java.util.Map; /** * Created by andrew on 11/25/14. */ public class PBFTCohortRunner { private static int numServers; private static Logger LOG = LogManager.getLogger(PBFTCohortRunner.class); private static final int CONFIG_FILE_POS = 0; public static void main(final String[] args) throws InterruptedException, IOException { ConsoleAppender appender = new ConsoleAppender(new PatternLayout("{ %X{server-name} } " + PatternLayout.TTCC_CONVERSION_PATTERN)); appender.setThreshold(Priority.INFO); BasicConfigurator.configure(appender); Map<Integer, PublicKey> publicKeyMap = Maps.newHashMap(); Map<Integer, PrivateKey> privateKeyMap = Maps.newHashMap(); Map<Integer, PBFTServerInstance> servers = Maps.newHashMap(); numServers = PBFTServerInstanceRunner.readServerConfigForNumServers(new File(args[CONFIG_FILE_POS])); for (int i = 1; i <= numServers; i++) { KeyPair keyPair = CryptoUtil.generateNewKeyPair(); publicKeyMap.put(i, keyPair.getPublic()); privateKeyMap.put(i, keyPair.getPrivate()); } for (int i = 1; i <= numServers; i++) { PBFTServerInstance server = new PBFTServerInstance( new String[]{String.valueOf(i), "900" + i}, privateKeyMap.get(i), publicKeyMap, args[CONFIG_FILE_POS] ); servers.put(i, server); server.run(); } GroupConfigProvider<PBFTCohort.Client> leaderConfigProvider = servers.get(1).getConfigProvider(); // for (int i = 1; i < 3; i++) { // testSystem(privateKeyMap, leaderConfigProvider, i); // } } private static void testViewChange(GroupConfigProvider<PBFTCohort.Client> leaderConfigProvider) { // make everyone multicast view-change messages for (int i = 1; i <= numServers; i++) { GroupMember<PBFTCohort.Client> groupMember = null; PBFTCohort.Client server = null; try { groupMember = leaderConfigProvider.getGroupMember(i); server = groupMember.getThriftConnection(); server.initiateViewChange(); } catch (TTransportException e) { System.err.println("Failed to initiate view change from server: " + i); e.printStackTrace(); } catch (TException e) { System.err.println("Failed to initiate view change from server: " + i); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { groupMember.returnThriftConnection(server); } } } private static void testSystem( Map<Integer, PrivateKey> privateKeyMap, GroupConfigProvider<PBFTCohort.Client> leaderConfigProvider, int sequenceNumber) { LOG.warn("Starting."); for (int i = 1; i <= numServers; i++) { int sendingReplicaID = leaderConfigProvider.getLeader().getReplicaID(); Viewstamp viewstamp = new Viewstamp(sequenceNumber, 0); TTransaction transaction = new TTransaction( viewstamp, new TOperation( TChineseCheckersOperation.NO_OP.getValue(), "{}", sendingReplicaID ), sendingReplicaID ); Digest transactionDigest = CryptoUtil.computeDigest(common.Transaction.getTransactionForPBFTTransaction(transaction)); PrePrepareMessage prePrepareMessage = new PrePrepareMessage( viewstamp, ByteBuffer.wrap(transactionDigest.getBytes()), sendingReplicaID, ByteBuffer.allocate(0) ); ClientMessage clientMessage = new ClientMessage( transaction.getOperation(), sendingReplicaID, null ); clientMessage.setMessageSignature(CryptoUtil.computeMessageSignature(clientMessage, privateKeyMap.get(sendingReplicaID)).getBytes()); prePrepareMessage.setMessageSignature(CryptoUtil.computeMessageSignature(prePrepareMessage, privateKeyMap.get(sendingReplicaID)).getBytes()); GroupMember<PBFTCohort.Client> groupMember = null; PBFTCohort.Client secondServer = null; try { groupMember = leaderConfigProvider.getGroupMember(i); secondServer = groupMember.getThriftConnection(); secondServer.prePrepare(prePrepareMessage, clientMessage, transaction); } catch (TTransportException e) { System.err.println("Failed to send preprepare for server: " + i); e.printStackTrace(); } catch (TException e) { System.err.println("Failed to send preprepare for server: " + i); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { groupMember.returnThriftConnection(secondServer); } } } }