Ejemplo n.º 1
0
        public Server Build(
            NodeConnectionInfo myConnectionInfo,
            KnownNodeStore knownNodeStore,
            NodeClientFactory nodeClientFactory,
            NodeClientStore nodeClientStore,
            VoteMemoryPool voteMemoryPool,
            Blockchain blockchain,
            Miner miner,
            VoteValidator voteValidator,
            BlockValidator blockValidator,
            BlockchainAdder blockchainAdder,
            IConsole console)
        {
            var handshakeService = new NodeService(
                knownNodeStore,
                nodeClientFactory,
                nodeClientStore,
                voteMemoryPool,
                blockchain,
                miner,
                voteValidator,
                blockValidator,
                blockchainAdder,
                console);
            var server = new Server
            {
                Services = { Node.BindService(handshakeService) },
                Ports    = { new ServerPort(myConnectionInfo.Ip, myConnectionInfo.Port, ServerCredentials.Insecure) }
            };

            return(server);
        }
Ejemplo n.º 2
0
 public BlockchainAdder(
     Blockchain blockchain,
     VoteMemoryPool voteMemoryPool,
     BlockForwarder blockForwarder)
 {
     this.blockchain     = blockchain;
     this.voteMemoryPool = voteMemoryPool;
     this.blockForwarder = blockForwarder;
 }
 public ElectionResultProvider(
     IElectionAlgorithm electionAlgorithm,
     DateTime electionEndTime,
     VoteMemoryPool voteMemoryPool,
     Blockchain blockchain)
 {
     this.electionAlgorithm = electionAlgorithm;
     this.electionEndTime   = electionEndTime;
     this.voteMemoryPool    = voteMemoryPool;
     this.blockchain        = blockchain;
 }
Ejemplo n.º 4
0
 public BlockchainAdder(
     Blockchain blockchain,
     VoteMemoryPool voteMemoryPool,
     BlockForwarder blockForwarder,
     IConsole console)
 {
     this.blockchain     = blockchain;
     this.voteMemoryPool = voteMemoryPool;
     this.blockForwarder = blockForwarder;
     this.console        = console;
 }
Ejemplo n.º 5
0
 public VoterTerminal(
     VoterDatabaseFacade voterDb,
     string[] candidateArr,
     IVoteSerializer voteSerializer,
     VoteMemoryPool voteMemoryPool,
     ElectionResultProvider electionResultProvider,
     Blockchain blockchain)
 {
     this.voterDb                = voterDb;
     this.candidateArr           = candidateArr;
     this.voteSerializer         = voteSerializer;
     this.voteMemoryPool         = voteMemoryPool;
     this.electionResultProvider = electionResultProvider;
     this.blockchain             = blockchain;
 }
Ejemplo n.º 6
0
        public Miner(
            Blockchain blockchain,
            VoteMemoryPool voteMemoryPool,
            BigInteger difficultyTarget,
            BlockFactory blockFactory,
            BlockchainAdder blockchainAdder)
        {
            this.blockchain       = blockchain;
            this.voteMemoryPool   = voteMemoryPool;
            this.difficultyTarget = difficultyTarget;
            this.blockFactory     = blockFactory;
            this.blockchainAdder  = blockchainAdder;
            this.locker           = new object();

            this.shouldAbandonBlock = false;
        }
Ejemplo n.º 7
0
 public NodeService(
     KnownNodeStore knownNodeStore,
     NodeClientFactory nodeClientFactory,
     NodeClientStore nodeClientStore,
     VoteMemoryPool voteMemoryPool,
     Blockchain blockchain,
     Miner miner,
     VoteValidator voteValidator,
     BlockValidator blockValidator,
     BlockchainAdder blockchainAdder)
 {
     this.knownNodeStore    = knownNodeStore;
     this.nodeClientFactory = nodeClientFactory;
     this.nodeClientStore   = nodeClientStore;
     this.voteMemoryPool    = voteMemoryPool;
     this.blockchain        = blockchain;
     this.miner             = miner;
     this.voteValidator     = voteValidator;
     this.blockValidator    = blockValidator;
     this.blockchainAdder   = blockchainAdder;
 }
Ejemplo n.º 8
0
        public static void Main(string[] args)
        {
            var password   = args[0];
            var dbFilepath = args[1];
            var port       = int.Parse(args[2]);

            var voterDb    = new VoterDatabaseFacade(dbFilepath);
            var foundMiner = voterDb.TryGetVoterEncryptedKeyPair(password, out var encryptedKeyPair);

            if (!foundMiner)
            {
                Console.WriteLine("incorrect password: you may not mine!");
                return;
            }

            var blockchain = new Blockchain();

            // networking
            var registrarClientFactory     = new RegistrarClientFactory();
            var registrarClient            = registrarClientFactory.Build(Localhost, RegistrarPort);
            var registrationRequestFactory = new RegistrationRequestFactory();
            var myConnectionInfo           = new NodeConnectionInfo(Localhost, port);
            var knownNodeStore             = new KnownNodeStore();
            var nodeClientFactory          = new NodeClientFactory();
            var handshakeRequestFactory    = new HandshakeRequestFactory(blockchain);
            var nodeClientStore            = new NodeClientStore();
            var nodeServerFactory          = new NodeServerFactory();

            // votes
            var protoVoteFactory = new ProtoVoteFactory();
            var voteForwarder    = new VoteForwarder(nodeClientStore, protoVoteFactory);
            var voteMemoryPool   = new VoteMemoryPool(voteForwarder);

            // blocks
            var merkleNodeFactory = new MerkleNodeFactory();
            var merkleTreeFactory = new MerkleTreeFactory(merkleNodeFactory);
            var minerId           = encryptedKeyPair.PublicKey.GetBase64String();
            var blockFactory      = new BlockFactory(merkleTreeFactory, minerId);
            var protoBlockFactory = new ProtoBlockFactory(protoVoteFactory);
            var blockForwarder    = new BlockForwarder(nodeClientStore, protoBlockFactory);
            var voteValidator     = new VoteValidator(blockchain, voterDb);
            var blockValidator    = new BlockValidator(blockFactory, voteValidator);
            var blockchainAdder   = new BlockchainAdder(blockchain, voteMemoryPool, blockForwarder);

            // mining
            var difficultyTarget = TargetFactory.Build(BlockHeader.DefaultBits);
            var miner            = new Miner(
                blockchain,
                voteMemoryPool,
                difficultyTarget,
                blockFactory,
                blockchainAdder);

            // startup
            var nodeServer = nodeServerFactory.Build(
                myConnectionInfo,
                knownNodeStore,
                nodeClientFactory,
                nodeClientStore,
                voteMemoryPool,
                blockchain,
                miner,
                voteValidator,
                blockValidator,
                blockchainAdder);
            var boostrapper = new Bootstrapper(
                MinNetworkSize,
                knownNodeStore,
                nodeClientFactory,
                handshakeRequestFactory,
                nodeClientStore,
                registrarClient,
                registrationRequestFactory,
                nodeServer);

            Console.WriteLine("bootstrapping node network...");
            boostrapper.Bootstrap(myConnectionInfo);
            Console.WriteLine($"{MinNetworkSize} nodes in network! bootstrapping complete");


            Console.WriteLine("starting miner...");
            miner.Start();

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("Press any key to quit");
            Console.ReadKey();
        }
Ejemplo n.º 9
0
        public static void Main(string[] args)
        {
            var configFilepath = args[0];
            var password       = args[1];

            // config
            var nodeConfig      = ConfigDeserializer.Deserialize <NodeConfig>(configFilepath);
            var console         = ConsoleFactory.Build(nodeConfig.IsMiningNode);
            var ipAddress       = IpAddressProvider.GetLocalIpAddress();
            var electionEndTime = nodeConfig.IsClassDemo ? DateTime.Now.AddSeconds(120) : nodeConfig.ElectionEndTime;

            // password check
            var voterDb    = new VoterDatabaseFacade(nodeConfig.VoterDbFilepath);
            var foundMiner = voterDb.TryGetVoterEncryptedKeyPair(password, out var encryptedKeyPair);

            if (!foundMiner)
            {
                Console.WriteLine("incorrect password: you may not mine!");
                return;
            }

            // blockchain
            var blockchain = new Blockchain();

            // networking
            var registrarClientFactory     = new RegistrarClientFactory();
            var registrarClient            = registrarClientFactory.Build(ipAddress, RegistrarPort);
            var registrationRequestFactory = new RegistrationRequestFactory();
            var myConnectionInfo           = new NodeConnectionInfo(ipAddress, nodeConfig.Port);
            var knownNodeStore             = new KnownNodeStore();
            var nodeClientFactory          = new NodeClientFactory();
            var handshakeRequestFactory    = new HandshakeRequestFactory(blockchain);
            var nodeClientStore            = new NodeClientStore();
            var nodeServerFactory          = new NodeServerFactory();

            // votes
            var protoVoteFactory = new ProtoVoteFactory();
            var voteForwarder    = new VoteForwarder(nodeClientStore, protoVoteFactory);
            var voteMemoryPool   = new VoteMemoryPool(voteForwarder, console);

            // blocks
            var merkleNodeFactory = new MerkleNodeFactory();
            var merkleTreeFactory = new MerkleTreeFactory(merkleNodeFactory);
            var minerId           = encryptedKeyPair.PublicKey.GetBase64String();
            var blockFactory      = new BlockFactory(merkleTreeFactory, minerId);
            var protoBlockFactory = new ProtoBlockFactory(protoVoteFactory);
            var blockForwarder    = new BlockForwarder(nodeClientStore, protoBlockFactory);
            var voteValidator     = new VoteValidator(blockchain, voterDb, electionEndTime);
            var blockValidator    = new BlockValidator(blockFactory, voteValidator);
            var blockchainAdder   = new BlockchainAdder(blockchain, voteMemoryPool, blockForwarder, console);

            // mining
            var difficultyTarget = TargetFactory.Build(BlockHeader.DefaultBits);
            var miner            = new Miner(
                blockchain,
                voteMemoryPool,
                difficultyTarget,
                blockFactory,
                blockchainAdder,
                console);

            // interaction
            var voteSerializer           = new VoteSerializer();
            var electionAlgorithmFactory = new ElectionAlgorithmFactory(voteSerializer);
            var electionAlgorithm        = electionAlgorithmFactory.Build(nodeConfig.ElectionType);
            var electionResultProvider   = new ElectionResultProvider(
                electionAlgorithm,
                electionEndTime,
                voteMemoryPool,
                blockchain);
            var voterTerminal = new VoterTerminal.VoterTerminal(
                voterDb,
                nodeConfig.Candidates.ToArray(),
                voteSerializer,
                voteMemoryPool,
                electionResultProvider,
                blockchain);
            var votingBooth = new VoterTerminal.VoterBooth(voterTerminal, nodeConfig.ElectionType);

            // startup
            var nodeServer = nodeServerFactory.Build(
                myConnectionInfo,
                knownNodeStore,
                nodeClientFactory,
                nodeClientStore,
                voteMemoryPool,
                blockchain,
                miner,
                voteValidator,
                blockValidator,
                blockchainAdder,
                console);
            var boostrapper = new Bootstrapper(
                MinNetworkSize,
                knownNodeStore,
                nodeClientFactory,
                handshakeRequestFactory,
                nodeClientStore,
                registrarClient,
                registrationRequestFactory,
                nodeServer);

            Console.WriteLine("bootstrapping node network...");
            boostrapper.Bootstrap(myConnectionInfo);
            Console.WriteLine($"{MinNetworkSize} nodes in network! bootstrapping complete");

            if (nodeConfig.IsMiningNode)
            {
                Console.WriteLine("starting miner...");
                miner.Start();

                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Press any key to quit");
                Console.ReadKey();
            }
            else
            {
                votingBooth.LaunchBooth();
            }
        }