/// <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)); }
/// <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)); }
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); }
/// <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); }
/// <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)); }