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); } }
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); }
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); }
public int WrongIntializeBlockChain() { ModelStateDictionary modelState = new ModelStateDictionary(); IBlockChainService blockChainService = new BlockChainService(new ModelStateWrapper(modelState), new BlockChainRepository()); FakeBlockChain blockChain = new FakeBlockChain(); return(blockChain.GetHashCode()); }
public MinerService(BlockChainService blockChainService, TransactionPoolService transactionPoolService, WalletService walletService, TransactionService transactionService, P2PNetwork p2PNetwork) { _blockChainService = blockChainService; _transactionPoolService = transactionPoolService; _transactionService = transactionService; _walletService = walletService; _p2pNetwork = p2PNetwork; }
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); } }
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); }
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); } }
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); }
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); } }
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); }
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)); } } }
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); }
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); }
// 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--; } // 实际上,共识决定了谁应该在什么时候出块,以及收到一个区块以后该怎么验证这个区块的合法性 }
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); }