public TxTemplate SignTransaction(TxTemplate transaction, List <string> privateKeys) { var signedTx = (TxTemplate)transaction.Clone(); var serializedTransaction = JsonUtility.SerializeTransactionIntoCanonicalString(JsonConvert.SerializeObject(transaction)); var index = 0; foreach (var privKey in privateKeys) { SignatureMetadata signatures = GetSignature(transaction, serializedTransaction, index, privKey); bool verifyFullfill = signatures.Signature.VerifySignature(signatures.TransactionHash, signatures.PubKeyBuffer); if (!verifyFullfill) { continue; } signedTx.Inputs[index].Fulfillment = GenerateFulfillmentUri(signatures.PubKeyBuffer, signatures.Signature); index++; } var serializedSignedTransaction = JsonUtility.SerializeTransactionIntoCanonicalString(JsonConvert.SerializeObject(signedTx)); signedTx.Id = HashingUtils.ComputeSha3Hash(Encoding.UTF8.GetBytes(serializedSignedTransaction)).ToHex(false); return(signedTx); }
private static string GetUniqueFulfillment(TxTemplate transaction, string serializedTransaction, int index) { return(transaction.Inputs[index].Fulfills == null ? serializedTransaction + transaction.Inputs[index].Fulfills?.TransactionId + transaction.Inputs[index].Fulfills?.OutputIndex : serializedTransaction); }
public (byte[], byte[], byte[]) GetSignature(TxTemplate transaction, string serializedTransaction, int index, string privKey) { var pubKeyBuffer = Encoders.Base58.DecodeData(transaction.Outputs[index].PublicKeys[0]); string transactionUniqueFulfillment = GetUniqueFulfillment(transaction, serializedTransaction, index); var transactionHash = HashingUtils.ComputeSha3Hash(Encoding.UTF8.GetBytes(transactionUniqueFulfillment)); var signature = CryptographyUtility.Ed25519Sign(transactionHash, Encoders.Base58.DecodeData(privKey)); return(transactionHash, pubKeyBuffer, signature); }