public ActionResult StartChangeKey([FromBody] ChangeKeyRequest changeKey) { try { var transaction = ChangeKeyRequestToTransaction(changeKey); changeKey.Hash = (Hash)transaction.GetHash(); return(Ok(changeKey)); } catch (MicroCoinRPCException e) { return(this.HandlerError(e)); } }
public ActionResult CommitChangeKey([FromBody] ChangeKeyRequest changeKey) { MicroCoin.Transactions.ChangeKeyTransaction transaction = null; try { transaction = ChangeKeyRequestToTransaction(changeKey); } catch (MicroCoinRPCException e) { return(this.HandlerError(e)); } if (changeKey.Signature == null) { return(BadRequest(new MicroCoinError(ErrorCode.InvalidOperation, "Missing signature", "You must sign the hash and set the signature"))); } transaction.Signature = new ECSignature { R = (Hash)changeKey.Signature.R.PadLeft(64, '0'), S = (Hash)changeKey.Signature.S.PadLeft(64, '0') }; if (Utils.ValidateSignature(transaction.GetHash(), transaction.Signature, transaction.AccountKey)) { using (var ms = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(ms, System.Text.Encoding.Default, true)) { bw.Write(1); bw.Write(7); } transaction.SaveToStream(ms); ms.Position = 0; Hash h = ms.ToArray(); try { var resp = client.ExecuteOperations(h); var r = resp.First(); var tr = new ChangeKey { AccountNumber = (uint)r.Account, Balance = r.Balance, OpHash = r.Ophash, Signer = (uint)r.SignerAccount, SubType = r.SubType.ToString(), Type = r.Type.ToString(), Confirmations = r.Maturation, NewOwnerPublicKey = changeKey.NewOwnerPublicKey, Signature = changeKey.Signature }; return(Ok(tr)); } catch (MicroCoinRPCException e) { return(this.HandlerError(e)); } } } else { return(StatusCode(403, new MicroCoinError(ErrorCode.InvalidData, "Invalid signature", "Your signature is invalid"))); } }
private MicroCoin.Transactions.ChangeKeyTransaction ChangeKeyRequestToTransaction(ChangeKeyRequest changeKey) { var account = client.GetAccount(changeKey.AccountNumber); string pubkey = account.EncPubKey; var key = client.DecodePubKey(pubkey, null); return(new MicroCoin.Transactions.ChangeKeyTransaction { NewAccountKey = new ECKeyPair { CurveType = Enum.Parse <CurveType>(changeKey.NewOwnerPublicKey.CurveType, true), PublicKey = new ECPoint { X = (Hash)changeKey.NewOwnerPublicKey.X.PadLeft(64, '0'), Y = (Hash)changeKey.NewOwnerPublicKey.Y.PadLeft(64, '0') } }, TargetAccount = changeKey.AccountNumber, SignerAccount = changeKey.AccountNumber, TransactionType = MicroCoin.Transactions.TransactionType.ChangeKeySigned, NumberOfOperations = account.NumOperations + 1, Fee = (ulong)(changeKey.Fee * 10000M), AccountKey = new ECKeyPair { CurveType = (CurveType)key.KeyType, PublicKey = new ECPoint { X = (Hash)key.X, Y = (Hash)key.Y } } }); }