コード例 #1
0
        private void HandleBlockchainData(IAsyncResult ar)
        {
            var state = (StateObject)ar.AsyncState;

            try
            {
                using (var scope = _serviceProvider.CreateScope())
                {
                    List <Block> incomingChain = state.Blockchain;

                    incomingChain.ForEach(b => b.Id = 0);
                    Console.WriteLine(JsonConvert.SerializeObject(state.Blockchain));

                    _blockChainService = scope.ServiceProvider.GetService <BlockChainService>();

                    _blockChainService.ReplaceChain(incomingChain);

                    Console.WriteLine("Received Blockchain : ");
                    Console.WriteLine(Encoding.UTF8.GetString(state.buffer));
                }
            }
            finally
            {
                messageManualReset.Set();
                state.workSocket.EndReceive(ar);
            }
        }
コード例 #2
0
        public void BuyCoins_ValidValue()
        {
            ModelStateDictionary modelState = new ModelStateDictionary();

            User user = new User
            {
                Email          = "*****@*****.**",
                FirstName      = "Amir",
                LastName       = "Akobirovich",
                MiddleName     = "Rofeev",
                Login          = "******",
                Money          = 0,
                Password       = "******",
                RepeatPassword = "******",
                WalletID       = "WalletID"
            };

            double sendMoney = 143.3;

            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), new BlockChainRepository());

            BlockChain blockChain = BlockChain.Instance(blockChainService);

            MoneySend moneySend = new MoneySend {
                Amount = sendMoney, UserName = user.Login, WalletId = user.WalletID
            };

            blockChain.BuyCoins(moneySend);

            Thread.Sleep(35000);

            Assert.AreEqual(blockChain.GetBalanceOfUser(user), sendMoney);
        }
コード例 #3
0
ファイル: Chain.cs プロジェクト: zeppaman/BlockChainDNS
        public void CRUD()
        {
            var                domain        = "dns-blockchain.io";
            LookupClient       lookupClient  = new LookupClient(IPAddress.Parse("127.0.0.1"), 53);
            ICryptoService     cryptoService = new CryptoService();
            IBlockChainService service       = new BlockChainService(cli, lookupClient, cryptoService);

            // private for reader, public for writer
            var publicKey  = File.ReadAllBytes("./public.txt");
            var privateKey = File.ReadAllBytes("./private.txt");

            this.OutputHelper.WriteLine($"public key: {publicKey}");
            this.OutputHelper.WriteLine($"private key: {privateKey}");


            var data = new JObject();

            data["date"]    = DateTime.Now.ToLongDateString();
            data["text"]    = Guid.NewGuid();
            data["message"] = "I love you";

            this.OutputHelper.WriteLine($"object: {data.ToString()}");

            var node = new BlockChainNode();

            node.Data = data;

            this.OutputHelper.WriteLine($"Node Hash: {node.Hash}");
            //node.TokenMap.ToList().ForEach((x) => { Console.WriteLine(x.Key + " | " + x.Value); });
            this.OutputHelper.WriteLine($"Domain: {domain}");
            this.OutputHelper.WriteLine($"Public Key: {publicKey}");
            service.Add(node, 1, domain, publicKey);
            Thread.Sleep(3000);
            var node2 = service.Get(node.Hash, 1, domain, privateKey);

            this.OutputHelper.WriteLine($"Result Hash: {node2.Hash}");
            this.OutputHelper.WriteLine($"Result Data: {node2.Data.ToString()}");

            var node3 = service.New(node2, publicKey, data);

            node3.Data["message"] = "Second Item in flow";
            service.Add(node3, 1, domain, publicKey);

            timer.Start();
            var node4 = service.Get(node3.Hash, 1, domain, privateKey);

            timer.Stop();
            Console.WriteLine($"timing {timer.ElapsedMilliseconds}ms");


            var emptylist  = service.GetAncerstor(node2, 1, domain, privateKey);
            var parentList = service.GetAncerstor(node4, 1, domain, privateKey);


            var errors = service.Validate(node4.Data, node4.Hash, 1, domain, privateKey);
        }
コード例 #4
0
        public int WrongIntializeBlockChain()
        {
            ModelStateDictionary modelState = new ModelStateDictionary();

            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), new BlockChainRepository());

            FakeBlockChain blockChain = new FakeBlockChain();

            return(blockChain.GetHashCode());
        }
コード例 #5
0
 public MinerService(BlockChainService blockChainService,
                     TransactionPoolService transactionPoolService,
                     WalletService walletService,
                     TransactionService transactionService,
                     P2PNetwork p2PNetwork)
 {
     _blockChainService      = blockChainService;
     _transactionPoolService = transactionPoolService;
     _transactionService     = transactionService;
     _walletService          = walletService;
     _p2pNetwork             = p2PNetwork;
 }
コード例 #6
0
        public void GetBalanceOfUser_MultyValidValue()
        {
            ModelStateDictionary modelState = new ModelStateDictionary();

            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), new BlockChainRepository());

            BlockChain blockChain = BlockChain.Instance(blockChainService);

            var users = new User[100];

            for (int i = 0; i < users.Length; i++)
            {
                users[i] = new User
                {
                    Email          = "*****@*****.**",
                    FirstName      = "Amir",
                    LastName       = "Akobirovich",
                    MiddleName     = "Rofeev",
                    Login          = new Random().GetHashCode().ToString(),
                    Money          = 0,
                    Password       = "******",
                    RepeatPassword = "******",
                    WalletID       = "WalletID"
                };
            }

            var usersActions = new Task[100];

            for (int i = 0; i < users.Length; i++)
            {
                Task.Run(() =>
                {
                    MoneySend moneySend = new MoneySend {
                        Amount = 100, UserName = users[i].Login, WalletId = users[i].WalletID
                    };

                    blockChain.BuyCoins(moneySend);

                    blockChain.AddTransaction(new Transactions {
                        Amount = 50, DateTime = DateTime.Now, FromUser = users[i].Login, ToUser = "******", TransactionID = 12
                    });
                }).Wait();
            }

            Thread.Sleep(35000);

            foreach (var user in users)
            {
                Assert.AreNotEqual(blockChain.GetBalanceOfUser(user), 0);
            }
        }
コード例 #7
0
        public void TransactionsHistory_ValidValues()
        {
            bool workProccess = false;

            IBlockChainRepository blockChainRepository = new BlockChainRepository();

            ModelStateDictionary modelState = new ModelStateDictionary();

            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), blockChainRepository);

            BlockChain blockChain = BlockChain.Instance(blockChainService);

            User user = new User
            {
                Email          = "*****@*****.**",
                FirstName      = "Amir",
                LastName       = "Akobirovich",
                MiddleName     = "Rofeev",
                Login          = "******",
                Money          = 0,
                Password       = "******",
                RepeatPassword = "******",
                WalletID       = "WalletID"
            };

            blockChain.AddTransaction(new Transactions {
                Amount = 1231, DateTime = DateTime.Now, FromUser = user.Login, ToUser = "******", TransactionID = 13
            });

            blockChain.AddTransaction(new Transactions {
                Amount = 32, DateTime = DateTime.Now, FromUser = "******", ToUser = user.Login, TransactionID = 14
            });

            MoneySend moneySend = new MoneySend {
                Amount = 100, UserName = user.Login, WalletId = user.WalletID
            };

            blockChain.BuyCoins(moneySend);

            Thread.Sleep(35000);

            IEnumerable <Transactions> transactionsHistory = blockChain.TransactionsHistory(user);

            foreach (var transaction in transactionsHistory)
            {
                workProccess = Equals(transaction.FromUser, user.Login) || Equals(transaction.ToUser, user.Login);
            }

            Assert.IsTrue(workProccess);
        }
コード例 #8
0
        public void BuyCoins_MultyValidValue()
        {
            ModelStateDictionary modelState = new ModelStateDictionary();

            var users = new User[100];

            var usersAction = new Task[100];

            double sendMoney = 143.3;

            for (int i = 0; i < users.Length; i++)
            {
                users[i] = new User
                {
                    Email          = "*****@*****.**",
                    FirstName      = "Amir",
                    LastName       = "Akobirovich",
                    MiddleName     = "Rofeev",
                    Login          = new Random().GetHashCode().ToString(),
                    Money          = 0,
                    Password       = "******",
                    RepeatPassword = "******",
                    WalletID       = "WalletID"
                };
            }


            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), new BlockChainRepository());

            BlockChain blockChain = BlockChain.Instance(blockChainService);

            for (int i = 0; i < users.Length; i++)
            {
                Task.Run(() =>
                {
                    MoneySend moneySend = new MoneySend {
                        Amount = sendMoney, UserName = users[i].Login, WalletId = users[i].WalletID
                    };

                    blockChain.BuyCoins(moneySend);
                }).Wait();
            }

            Thread.Sleep(35000);

            foreach (var user in users)
            {
                Assert.AreEqual(blockChain.GetBalanceOfUser(user), sendMoney);
            }
        }
コード例 #9
0
ファイル: Chain.cs プロジェクト: zeppaman/BlockChainDNS
        public void WriteDecryptKey()
        {
            var                domain        = "dns-blockchain.io";
            var                privateKey    = File.ReadAllBytes("./private.txt");
            LookupClient       lookupClient  = new LookupClient(IPAddress.Parse("127.0.0.1"), 53);
            ICryptoService     cryptoService = new CryptoService();
            IBlockChainService service       = new BlockChainService(cli, lookupClient, cryptoService);
            DecriptKey         decriptKey    = new DecriptKey();

            decriptKey.Storage = KeyStorage.DNS;
            decriptKey.Value   = Convert.ToBase64String(privateKey);
            service.CreateDatabase(1, domain, decriptKey);

            var key = service.GetDecryptKey(1, domain);

            Assert.Equal(key.Value, Convert.ToBase64String(privateKey));
            Assert.Equal(key.Key, privateKey);
        }
コード例 #10
0
        private void HandleBlockchainData(IAsyncResult ar)
        {
            var state = (StateObject)ar.AsyncState;

            try
            {
                List <Block> incomingChain = state.BLockchain;

                _blockChainService = _serviceProvider.GetService <BlockChainService>();
                _blockChainService.ReplaceChain(incomingChain);

                Console.WriteLine("Received Blockchain : ");
                Console.WriteLine(Encoding.UTF8.GetString(state.buffer));
            }
            finally
            {
                messageManualReset.Set();
                state.workSocket.EndReceive(ar);
            }
        }
コード例 #11
0
        public void GetBalanceOfUser_ValidValue()
        {
            ModelStateDictionary modelState = new ModelStateDictionary();

            User user = new User
            {
                Email          = "*****@*****.**",
                FirstName      = "Amir",
                LastName       = "Akobirovich",
                MiddleName     = "Rofeev",
                Login          = "******",
                Money          = 0,
                Password       = "******",
                RepeatPassword = "******",
                WalletID       = "WalletID"
            };

            double predictableBalanceOfUser = 0;

            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), new BlockChainRepository());

            BlockChain blockChain = BlockChain.Instance(blockChainService);

            MoneySend moneySend = new MoneySend {
                Amount = 100, UserName = user.Login, WalletId = user.WalletID
            };

            blockChain.BuyCoins(moneySend);

            predictableBalanceOfUser = 100;

            blockChain.AddTransaction(new Transactions {
                Amount = 50, DateTime = DateTime.Now, FromUser = user.Login, ToUser = "******", TransactionID = 12
            });

            predictableBalanceOfUser -= 50;

            Thread.Sleep(35000);

            Assert.AreEqual(blockChain.GetBalanceOfUser(user), predictableBalanceOfUser);
        }
コード例 #12
0
        public byte[] DecodeData(byte[] text, byte[] sharedKey)
        {
            using (SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create("Rijndael"))
            {
                algorithm.GenerateIV();
                algorithm.GenerateKey();
                //algorithm.Padding = PaddingMode.Zeros;
                //algorithm.Mode = CipherMode.CBC;
                var key = new byte[algorithm.Key.Length];
                var iv  = new byte[algorithm.IV.Length];
                Array.Copy(sharedKey, 0, key, 0, key.Length);
                Array.Copy(sharedKey, key.Length, iv, 0, iv.Length);


                BlockChainService.WriteLogByteArray("Crypte:Decode:key", key);
                BlockChainService.WriteLogByteArray("Crypte:Decode:iv", iv);

                using (var cryptoTransform = algorithm.CreateDecryptor(key, iv))
                {
                    return(Transform(text, cryptoTransform));
                }
            }
        }
コード例 #13
0
        public void AddTransaction_MultyValidAdding()
        {
            WebWalletDbContext webWalletDbContext = new WebWalletDbContext();

            int previouseTransactionAmount = webWalletDbContext.Transactions.Count(), afterTransactionAmount;

            ModelStateDictionary modelState = new ModelStateDictionary();

            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), new BlockChainRepository());

            var addingTransactions = new Task[100];

            for (int i = 0; i < addingTransactions.Length; i++)
            {
                addingTransactions[i] = new Task(new Action(
                                                     () =>
                {
                    BlockChain blockChain = BlockChain.Instance(blockChainService);

                    Transactions transactions = new Transactions {
                        Amount = 122, DateTime = DateTime.Now, FromUser = "******", ToUser = "******", TransactionID = 12
                    };

                    blockChain.AddTransaction(transactions);
                }
                                                     ));

                addingTransactions[i].Start();
            }

            Thread.Sleep(35000);

            afterTransactionAmount = webWalletDbContext.Transactions.Count();

            Assert.AreNotEqual(previouseTransactionAmount, afterTransactionAmount);
        }
コード例 #14
0
        public void AddTransaction_ValidAdding()
        {
            WebWalletDbContext webWalletDbContext = new WebWalletDbContext();

            int previouseTransactionAmount = webWalletDbContext.Transactions.Count(), afterTransactionAmount;

            ModelStateDictionary modelState = new ModelStateDictionary();

            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), new BlockChainRepository());

            BlockChain blockChain = BlockChain.Instance(blockChainService);

            Transactions transactions = new Transactions {
                Amount = 122, DateTime = DateTime.Now, FromUser = "******", ToUser = "******", TransactionID = 12
            };

            blockChain.AddTransaction(transactions);

            Thread.Sleep(35000);

            afterTransactionAmount = webWalletDbContext.Transactions.Count();

            Assert.AreNotEqual(previouseTransactionAmount, afterTransactionAmount);
        }
コード例 #15
0
        // Composition Root - 组合根:
        // 设计模式。在程序的入口处进行抽象-具体的依赖关系配置。
        // Pure DI
        public static void Main()
        {
            // 出创世区块:通过执行一批交易来初始化整条链,一般包括部署系统合约,如共识合约,多资产合约等,并对系统合约做初步配置
            //   准备交易
            var transactionPool = new TransactionPool
            {
                Logger = new ConsoleLogger()
            };

            foreach (var genesisTransaction in TransactionGenerationHelper.GetGenesisTransactions())
            {
                transactionPool.AddTransaction(genesisTransaction);
            }

            //   打包创世区块
            //     准备MineService
            var blockValidationService = new BlockValidationService(new List <IBlockValidationProvider>
            {
                new BlockTransactionValidationProvider
                {
                    Logger = new ConsoleLogger()
                },
                new BlockBasicInformationValidationProvider
                {
                    Logger = new ConsoleLogger()
                }
            })
            {
                Logger = new ConsoleLogger()
            };
            var blockChainService = new BlockChainService(new PureDIChainIdProvider(), blockValidationService)
            {
                Logger = new ConsoleLogger()
            };
            var transactionExecutingService = new TransactionExecutingService
            {
                Logger = new ConsoleLogger()
            };

            var mineService = new MineService(transactionPool, blockChainService, transactionExecutingService);

            //     生产创世区块
            var genesisBlock = mineService.Mine();

            //     把创世区块添加到链上
            blockChainService.AppendBlock(genesisBlock);
            //   创世区块不广播,每一个节点都独立生成创世区块

            // 所以NetworkService实例较晚才出现
            var networkService = new NetworkService
            {
                Logger = new ConsoleLogger()
            };

            // 开始产生其他区块 - 挖矿
            // Demo: 出2个块
            var count = 2;

            while (count > 0)
            {
                // 交易应该是从网络收取的,这里随机生成一些
                var txs = TransactionGenerationHelper.GetSomeRandomTransactions();
                // 正常流程:从网络中收到交易,验证交易,然后丢进交易池
                foreach (var tx in txs)
                {
                    transactionPool.AddTransaction(tx);
                }
                // 交易池里已经有交易了,然后开始出块
                var block = mineService.Mine();
                // 拿到区块以后,自己做一些列验证,没问题的话就广播,并添加到本地的链上
                networkService.BroadcastBlock(block);
                blockChainService.AppendBlock(block);
                count--;
            }
            // 实际上,共识决定了谁应该在什么时候出块,以及收到一个区块以后该怎么验证这个区块的合法性
        }
コード例 #16
0
        public void TransactionsHistory_MultyValidValues()
        {
            bool workProccess = false;

            IBlockChainRepository blockChainRepository = new BlockChainRepository();

            ModelStateDictionary modelState = new ModelStateDictionary();

            IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), blockChainRepository);

            BlockChain blockChain = BlockChain.Instance(blockChainService);

            var users = new User[100];

            for (int i = 0; i < users.Length; i++)
            {
                users[i] = new User
                {
                    Email          = "*****@*****.**",
                    FirstName      = "Amir",
                    LastName       = "Akobirovich",
                    MiddleName     = "Rofeev",
                    Login          = new Random().GetHashCode().ToString(),
                    Money          = 0,
                    Password       = "******",
                    RepeatPassword = "******",
                    WalletID       = "WalletID"
                };
            }

            var usersActions = new Task[100];

            for (int i = 0; i < users.Length; i++)
            {
                Task.Run(() =>
                {
                    blockChain.AddTransaction(new Transactions {
                        Amount = 1231, DateTime = DateTime.Now, FromUser = users[i].Login, ToUser = "******", TransactionID = 13
                    });

                    blockChain.AddTransaction(new Transactions {
                        Amount = 32, DateTime = DateTime.Now, FromUser = "******", ToUser = users[i].Login, TransactionID = 14
                    });

                    MoneySend moneySend = new MoneySend {
                        Amount = 100, UserName = users[i].Login, WalletId = users[i].WalletID
                    };

                    blockChain.BuyCoins(moneySend);
                }).Wait();
            }

            Thread.Sleep(35000);

            foreach (var user in users)
            {
                IEnumerable <Transactions> transactionsHistory = blockChain.TransactionsHistory(user);

                foreach (var transaction in transactionsHistory)
                {
                    workProccess = Equals(transaction.FromUser, user.Login) || Equals(transaction.ToUser, user.Login);
                }
            }

            Assert.IsTrue(workProccess);
        }