コード例 #1
0
        /// <summary>
        /// a convenience method for directly appending our signature to a raw tx file
        /// </summary>
        /// <param name="from">the public identity we are signing as</param>
        /// <param name="txBytes">the multisig transaction to append signature to</param>
        /// <returns>merged multisignature transaction inclukding our signature</returns>
        public byte[] AppendMultisigTransactionBytes(MultisigAddress from, byte[] txBytes)
        {
            SignedTransaction inTx     = Encoder.DecodeFromMsgPack <SignedTransaction>(txBytes);
            SignedTransaction appended = this.AppendMultisigTransaction(from, inTx);

            return(Encoder.EncodeToMsgPack(appended));
        }
コード例 #2
0
        /// <summary>
        /// SignMultisigTransaction creates a multisig transaction from the input and the multisig account.
        /// </summary>
        /// <param name="from">sign as this multisignature account</param>
        /// <param name="tx">the transaction to sign</param>
        /// <returns>SignedTransaction a partially signed multisig transaction</returns>
        public SignedTransaction SignMultisigTransaction(MultisigAddress from, Transaction tx) //throws NoSuchAlgorithmException
        {
            // check that from addr of tx matches multisig preimage
            if (!tx.sender.ToString().Equals(from.ToString()))
            {
                throw new ArgumentException("Transaction sender does not match multisig account");
            }
            // check that account secret key is in multisig pk list
            var myPK = this.GetEd25519PublicKey();

            byte[] myEncoded = myPK.GetEncoded();
            int    myI       = -1;

            for (int i = 0; i < from.publicKeys.Count; i++)
            {
                if (Enumerable.SequenceEqual(myEncoded, from.publicKeys[i].GetEncoded()))
                {
                    myI = i;
                    break;
                }
            }

            if (myI == -1)
            {
                throw new ArgumentException("Multisig account does not contain this secret key");
            }
            // now, create the multisignature
            SignedTransaction txSig = this.SignTransaction(tx);
            MultisigSignature mSig  = new MultisigSignature(from.version, from.threshold);

            for (int i = 0; i < from.publicKeys.Count; i++)
            {
                if (i == myI)
                {
                    mSig.subsigs.Add(new MultisigSubsig(myPK, txSig.sig));
                }
                else
                {
                    mSig.subsigs.Add(new MultisigSubsig(from.publicKeys[i]));
                }
            }
            return(new SignedTransaction(tx, mSig, txSig.transactionID));
        }
コード例 #3
0
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            MultisigAddress mAddress = (MultisigAddress)value;

            writer.WriteStartObject();
            writer.WritePropertyName("version");
            writer.WriteValue(mAddress.version);
            writer.WritePropertyName("threshold");
            writer.WriteValue(mAddress.threshold);
            writer.WritePropertyName("publicKeys");
            writer.WriteStartArray();
            foreach (var item in mAddress.publicKeys)
            {
                writer.WriteValue(item.GetEncoded());
            }
            writer.WriteEnd();
            writer.WriteEndObject();
            //writer.WriteValue(mAddress.publicKeys);
            //base.WriteJson(writer, value, serializer);
            //writer.WriteValue(Convert.ToBase64String(bytes));
            //writer.WriteValue(bytes);
        }
コード例 #4
0
        /// <summary>
        /// Sign LogicSig as multisig
        /// </summary>
        /// <param name="lsig">LogicsigSignature to sign</param>
        /// <param name="ma">MultisigAddress to format multi signature from</param>
        /// <returns>LogicsigSignature</returns>
        public LogicsigSignature SignLogicsig(LogicsigSignature lsig, MultisigAddress ma)
        {
            var pk      = this.GetEd25519PublicKey();
            int pkIndex = -1;

            for (int i = 0; i < ma.publicKeys.Count; i++)
            {
                if (Enumerable.SequenceEqual(pk.GetEncoded(), ma.publicKeys[i].GetEncoded()))
                {
                    pkIndex = i;
                    break;
                }
            }

            if (pkIndex == -1)
            {
                throw new ArgumentException("Multisig account does not contain this secret key");
            }
            // now, create the multisignature
            byte[]            bytesToSign = lsig.BytesToSign();
            Signature         sig         = this.RawSignBytes(bytesToSign);
            MultisigSignature mSig        = new MultisigSignature(ma.version, ma.threshold);

            for (int i = 0; i < ma.publicKeys.Count; i++)
            {
                if (i == pkIndex)
                {
                    mSig.subsigs.Add(new MultisigSubsig(pk, sig));
                }
                else
                {
                    mSig.subsigs.Add(new MultisigSubsig(ma.publicKeys[i]));
                }
            }
            lsig.msig = mSig;
            return(lsig);
        }
コード例 #5
0
        /// <summary>
        /// AppendMultisigTransaction appends our signature to the given multisig transaction.
        /// </summary>
        /// <param name="from">the multisig public identity we are signing for</param>
        /// <param name="signedTx">the partially signed msig tx to which to append signature</param>
        /// <returns>merged multisig transaction</returns>
        public SignedTransaction AppendMultisigTransaction(MultisigAddress from, SignedTransaction signedTx)
        {
            SignedTransaction sTx = this.SignMultisigTransaction(from, signedTx.tx);

            return(MergeMultisigTransactions(sTx, signedTx));
        }