Beispiel #1
0
        //TODO
        public bool ProposeTransaction(byte[] to, int value)
        {
            if (ServerList.Count == 0)
            {
                return(false);
            }
            int oldBalance = Task.Run(async() => await BalanceFromAccountTable()).Result;
            int newBalance = oldBalance - value;

            List <TxIn> ins  = new List <TxIn>();
            String      addr = Base64.ToBase64String(Account.address);

            Console.WriteLine(addr);
            foreach (UtxoReturn utxoReturn in userTxService.userUtxo.UtxoReturns)
            {
                ins.Add(new TxIn(HexHelper.StringToByteArray(utxoReturn.hash), utxoReturn.index, Account.address));
            }

            TxIn[] insArray = ins.ToArray();

            foreach (TxIn txIn in insArray)
            {
                Console.WriteLine("In: " + HexHelper.ByteArrayToString(txIn.hash) + " " + txIn.index + " " +
                                  Convert.ToBase64String(txIn.script));
            }

            signedTransaction = userTxService.MakeSignedTransaction(insArray, to, this.Account, value);
            if (signedTransaction == null)
            {
                return(false);
            }

            payment = false;
            int           bizantine = ServerList.Count / 3;
            List <Thread> threads   = new List <Thread>();

            for (int i = 0; i < bizantine + 1; i++)
            {
                Thread t = new Thread(paymentThread);
                t.Start(i);
                threads.Add(t);
            }
            foreach (Thread t in threads)
            {
                t.Join();
            }

            return(payment);
        }
        //Generate signed transaction
        public byte[] MakeSignedTransaction(TxIn[] ins, byte[] to, Account from, int value)
        {
            List <TxOut> outs  = new List <TxOut>();
            int          total = 0;

            //Get aggregate balance of user
            foreach (TxIn txIn in ins)
            {
                UtxoOutput utxoOut = UtxoTable.LookUpEntry(HexHelper.ByteArrayToString(txIn.hash), txIn.index, from.address);
                Console.WriteLine("UtxoOut: " + utxoOut);
                if (utxoOut != null && !utxoOut.spent)
                {
                    total += utxoOut.value;
                }
            }

            //If the value of proposed transaction is bigger than total balance
            //Return null
            if (total < value)
            {
                Console.WriteLine("Insufficient balance");
                return(null);
            }

            int change = total - value;

            //Add TxOuts to Transaction
            outs.Add(new TxOut(value, from.publicKey, Convert.ToBase64String(to)));
            outs.Add(new TxOut(change, from.publicKey, Convert.ToBase64String(from.address)));

            Tx tx = new Tx();

            tx.TxIns.AddRange(ins);
            tx.TxOuts.AddRange(outs);

            //Get the hash of Transaction
            tx.getHash();

            return(tx.SignTx(from.key));
        }