コード例 #1
0
        public byte[] ToBytes()
        {
            MemoryStream ms = new MemoryStream();
            var          bs = new BitcoinStream(ms, true);

            bs.ConsensusFactory = tx.GetConsensusFactory();
            this.Serialize(bs);
            return(ms.ToArrayEfficient());
        }
コード例 #2
0
        internal TransactionBuilder CreateTransactionBuilder()
        {
            var transactionBuilder = tx.GetConsensusFactory().CreateTransactionBuilder();

            if (Settings.CustomBuilderExtensions != null)
            {
                transactionBuilder.Extensions.Clear();
                transactionBuilder.Extensions.AddRange(Settings.CustomBuilderExtensions);
            }
            transactionBuilder.UseLowR = Settings.UseLowR;
            return(transactionBuilder);
        }
コード例 #3
0
        internal TransactionBuilder CreateTransactionBuilder()
        {
#pragma warning disable CS0618 // Type or member is obsolete
            var transactionBuilder = this.Network == null?tx.GetConsensusFactory().CreateTransactionBuilder() : Network.CreateTransactionBuilder();

#pragma warning restore CS0618 // Type or member is obsolete
            if (Settings.CustomBuilderExtensions != null)
            {
                transactionBuilder.Extensions.Clear();
                transactionBuilder.Extensions.AddRange(Settings.CustomBuilderExtensions);
            }
            transactionBuilder.UseLowR = Settings.UseLowR;
            return(transactionBuilder);
        }
コード例 #4
0
ファイル: PSBTInput.cs プロジェクト: tanbirhossain/NBitcoin
        public bool TryFinalizeInput(out IList <PSBTError> errors)
        {
            errors = null;
            if (IsFinalized())
            {
                return(true);
            }
            var isSane = this.CheckSanity();

            if (isSane.Count != 0)
            {
                errors = isSane;
                return(false);
            }
            if (witness_utxo == null && non_witness_utxo == null)
            {
                errors = new List <PSBTError>()
                {
                    new PSBTError(Index, "Neither witness_utxo nor non_witness_output is set")
                };
                return(false);
            }
            var transactionBuilder = Transaction.GetConsensusFactory().CreateTransactionBuilder();

            if (Parent.Settings.CustomBuilderExtensions != null)
            {
                transactionBuilder.Extensions.Clear();
                transactionBuilder.Extensions.AddRange(Parent.Settings.CustomBuilderExtensions);
            }
            var txout = GetTxOut();

            if (txout == null)
            {
                errors = new List <PSBTError>()
                {
                    new PSBTError(Index, "Can not finalize PSBTInput without utxo")
                };
                return(false);
            }
            var coin = this.GetSignableCoin(out var getSignableCoinError) ?? new Coin(TxIn.PrevOut, txout);

            transactionBuilder.AddCoins(coin);
            foreach (var sig in PartialSigs)
            {
                transactionBuilder.AddKnownSignature(sig.Key, sig.Value);
            }
            Transaction signed = null;

            try
            {
                var signedTx = Parent.Settings.IsSmart ? Parent.GetOriginalTransaction() : Transaction.Clone();
                signed = transactionBuilder.SignTransaction(signedTx, SigHash.All);
            }
            catch (Exception ex)
            {
                errors = new List <PSBTError>()
                {
                    new PSBTError(Index, $"Error while finalizing the input \"{getSignableCoinError ?? ex.Message}\"")
                };
                return(false);
            }
            var indexedInput = signed.Inputs.FindIndexedInput(coin.Outpoint);

            if (!indexedInput.VerifyScript(coin, out var error))
            {
                errors = new List <PSBTError>()
                {
                    new PSBTError(Index, $"The finalized input script does not properly validate \"{error}\"")
                };
                return(false);
            }

            FinalScriptSig     = indexedInput.ScriptSig is Script oo && oo != Script.Empty ? oo : null;
            FinalScriptWitness = indexedInput.WitScript is WitScript o && o != WitScript.Empty ? o : null;
            if (transactionBuilder.FindSignableCoin(indexedInput) is ScriptCoin scriptCoin)
            {
                if (scriptCoin.IsP2SH)
                {
                    RedeemScript = scriptCoin.GetP2SHRedeem();
                }
                if (scriptCoin.RedeemType == RedeemType.WitnessV0)
                {
                    WitnessScript = scriptCoin.Redeem;
                }
            }
            ClearForFinalize();
            errors = null;
            return(true);
        }