public override async Task <OperationResult <object> > GetVerifyTransaction(AuthorizedModel model, CancellationToken ct) { if (!TryReconnectChain(ct)) { return(new OperationResult <object>(new AppError(LocalizationKeys.EnableConnectToBlockchain))); } var keys = ToKeyArr(model.PostingKey); if (keys == null) { return(new OperationResult <object>(new AppError(LocalizationKeys.WrongPrivatePostingKey))); } return(await Task.Run(() => { var op = new FollowOperation(model.Login, "steepshot", DitchFollowType.Blog, model.Login); var properties = new DynamicGlobalPropertyApiObj { HeadBlockId = Hex.ToString(_operationManager.ChainId), Time = DateTime.Now, HeadBlockNumber = 0 }; var tr = _operationManager.CreateTransaction(properties, keys, ct, op); return new OperationResult <object>() { Result = tr }; }, ct)); }
public Transaction CreateTransaction(DynamicGlobalPropertyApiObj propertyApiObj, IEnumerable <byte[]> userPrivateKeys, params BaseOperation[] operations) { var transaction = new Transaction { ChainId = _chainId, RefBlockNum = (ushort)(propertyApiObj.HeadBlockNumber & 0xffff), RefBlockPrefix = (uint)BitConverter.ToInt32(Hex.HexToBytes(propertyApiObj.HeadBlockId), 4), Expiration = propertyApiObj.Time.AddSeconds(30), BaseOperations = operations }; var msg = SerializeHelper.TransactionToMessage(transaction); var data = Secp256k1Manager.GetMessageHash(msg); foreach (var userPrivateKey in userPrivateKeys) { var sig = Secp256k1Manager.SignCompressedCompact(data, userPrivateKey); transaction.Signatures.Add(sig); } return(transaction); }
/// <summary> /// /// </summary> /// <param name="propertyApiObj"></param> /// <param name="userPrivateKeys"></param> /// <param name="operations"></param> /// <returns></returns> public Transaction CreateTransaction(DynamicGlobalPropertyApiObj propertyApiObj, IEnumerable <byte[]> userPrivateKeys, params BaseOperation[] operations) { return(CreateTransaction(propertyApiObj, userPrivateKeys, CancellationToken.None, operations)); }