// Adiciona uma CHAVE com valores ou Atualiza os valores de uma CHAVE de um Dictionary public void AddOrUpdateUTXOs(String key, TransactionOutput value) { if (UTXOs.ContainsKey(key)) { UTXOs[key] = value; } else { UTXOs.Add(key, value); } }
public double GetBalance() { double total = 0; foreach (KeyValuePair <String, TransactionOutput> item in Program.UTXOs) { // EM CONSTRUÇÃO (CÓDIGO QUE PUXA INFORMAÇÕES DOS OUTPUTS DO BANCO DE DADOS) TransactionOutput UTXO = item.Value; if (UTXO.isMine(keyParameters)) // Se a saída pertence a mim ( se o dinheiro pertence a mim ) { // Verifica se a chave já existe no Dicionário AddOrUpdateUTXOs(UTXO.id, UTXO); //UTXOs.Add(UTXO.id, UTXO); // Adiciona na nossa lista de transações não gastas total += UTXO.value; } } return(total); }
static void Main(string[] args) { // --- TESTE BANCO DE DADOS --- CoinDatabaseDAO db = new CoinDatabaseDAO(); /*db.WriteToWalletSQL("batata", "hamburguer", "100.00"); * db.WriteToWalletSQL("batata", "hamburguer", "200.00"); * db.WriteToWalletSQL("batata", "hamburguer", "300.00"); * db.WriteToWalletSQL("batata", "hamburguer", "800.00");*/ /*Debug.WriteLine(db.GetRowCountSQL("C_WALLET")); * String[] test = db.ReadFromWalletSQL(1); * Debug.WriteLine("TESTE CARTEIRA SQL"); * Debug.WriteLine(test[0] + ", " + test[1] + ", " + test[2] + ", " + test[3]); * * Debug.WriteLine(db.DataExistsWalletSQL());*/ /*// Lê os dados do banco de dados e preenche o UTXOs * if(db.GetRowCountSQL("C_UTXOS") > 0) * { * for(int i = 0; i < db.GetRowCountSQL("C_UTXOS"); i++) * { * String[] recipiente = db.ReadFromUTXOSQL(i); * TransactionOutput output = new TransactionOutput(recipiente[2], Convert.ToDouble(recipiente[3]), recipiente[4]); * UTXOs.Add(recipiente[1] + "A", output); * } * }*/ // -------------------------------------- // --- INICIALIZAÇÃO DO CONSOLE DEBUG --- // Instancia as novas carteiras Wallet coinbase = new Wallet(); walletA = new Wallet(); db.WriteToWalletSQL(StringUtil.GetStringFromPublicKey(walletA.keyParameters), StringUtil.GetStringFromPrivateKey(walletA.keyParameters), walletA.GetBalance()); walletB = new Wallet(); db.WriteToWalletSQL(StringUtil.GetStringFromPublicKey(walletB.keyParameters), StringUtil.GetStringFromPrivateKey(walletB.keyParameters), walletB.GetBalance()); // Cria a transação GENESIS, na qual envia 100 CSharpCoins para a walletA: genesisTransaction = new Transaction(coinbase.keyParameters, walletA.keyParameters, 100, null); genesisTransaction.GenerateSignature(coinbase.keyParameters); // Assina manualmente a transação GENESIS genesisTransaction.transactionId = "0"; // Seta manualmente o ID de transação genesisTransaction.outputs.Add(new TransactionOutput(StringUtil.GetStringFromPublicKey(genesisTransaction.reciepient), genesisTransaction.value, genesisTransaction.transactionId)); // Manualmente adiciona as saídas da transação //UTXOs.Add(genesisTransaction.outputs[0].id, genesisTransaction.outputs[0]); // SUBSTITUÍDO PELO BANCO DE DADOS db.WriteToUTXOSQL(genesisTransaction.outputs[0].id, genesisTransaction.outputs[0].reciepient, genesisTransaction.outputs[0].value, genesisTransaction.outputs[0].parentTransactionId); // É importante armazenar a nossa primeira transação na lista de UTXOs // Lê os dados do banco de dados e preenche o UTXOs if (db.GetRowCountSQL("C_UTXOS") > 0) { for (int i = 1; i <= db.GetRowCountSQL("C_UTXOS"); i++) { String[] recipiente = db.ReadFromUTXOSQL(i); TransactionOutput output = new TransactionOutput(recipiente[2], Convert.ToDouble(recipiente[3]), recipiente[4]); UTXOs.Add(recipiente[1], output); } } Debug.WriteLine("\n-------------------------------------------------------------------------------\n"); Debug.WriteLine("#Criando e minerando o Bloco GENESIS..."); Block genesis = new Block("0"); genesis.AddTransaction(genesisTransaction); AddBlock(genesis); // TESTE Block block1 = new Block(genesis.hash); Debug.WriteLine("\nO saldo da carteiraA é: " + walletA.GetBalance()); Debug.WriteLine("\nA carteiraA está tentando enviar fundos (40) para a carteiraB..."); block1.AddTransaction(walletA.SendFunds(walletB.keyParameters, 40)); AddBlock(block1); Debug.WriteLine("\nO saldo da carteiraA é: " + walletA.GetBalance()); Debug.WriteLine("O saldo da carteiraB é: " + walletB.GetBalance()); // TESTE Block block2 = new Block(block1.hash); Debug.WriteLine("\nA carteiraA está tentando enviar mais fundos (1000) do que se tem de saldo..."); block2.AddTransaction(walletA.SendFunds(walletB.keyParameters, 1000)); AddBlock(block2); Debug.WriteLine("\nO saldo da carteiraA é: " + walletA.GetBalance()); Debug.WriteLine("O saldo da carteiraB é: " + walletB.GetBalance()); // TESTE Block block3 = new Block(block2.hash); Debug.WriteLine("\nA carteiraB está tentando enviar fundos (20) para a carteiraA..."); block1.AddTransaction(walletB.SendFunds(walletA.keyParameters, 20)); AddBlock(block3); Debug.WriteLine("\nO saldo da carteiraA é: " + walletA.GetBalance()); Debug.WriteLine("O saldo da carteiraB é: " + walletB.GetBalance()); IsChainValid(); Debug.WriteLine("\n-------------------------------------------------------------------------------\n"); // --- INICIALIZAÇÃO DO WINDOWS FORMS --- Application.EnableVisualStyles(); Application.Run(new AppMainWindow()); // -------------------------------------- }