internal async Task <AuthorizationAPIResult> Pre_PrepareAsync(TransactionBlock block1, Func <TransactionBlock, Task <TransactionBlock> > OnBlockSucceed = null) { bool IsSuccess; AuthState state2 = null; var state1 = await PostToConsensusAsync(block1).ConfigureAwait(false); if (state1 != null && state1.IsConsensusSuccess == true) { IsSuccess = true; if (OnBlockSucceed != null) { var block2 = await OnBlockSucceed(state1.InputMsg.Block).ConfigureAwait(false); state2 = await PostToConsensusAsync(block2).ConfigureAwait(false); } } else { IsSuccess = false; } var result = new AuthorizationAPIResult(); if (IsSuccess) { result.ResultCode = APIResultCodes.Success; } else { result.ResultCode = state1.OutputMsgs.Count > 0 ? state1.OutputMsgs.First().Result : APIResultCodes.UnableToSendToConsensusNetwork; } return(result); }
//private async Task<AuthState> PostToConsensusAsync(TransactionBlock block) //{ // _log.LogInformation($"ApiService: PostToConsensusAsync Called: {block.BlockType}"); // //AuthorizingMsg msg = new AuthorizingMsg // //{ // // IsServiceBlock = false, // // From = NodeService.Dag.PosWallet.AccountId, // // Block = block, // // BlockHash = block.Hash, // // MsgType = ChatMessageType.AuthorizerPrePrepare // //}; // //var state = new AuthState(true); // //state.InputMsg = msg; // NodeService.Dag.Consensus.Tell(state); // await state.WaitForClose(); // var ts1 = state.T1 == null ? "" : ((int)(DateTime.Now - state.T1).TotalMilliseconds).ToString(); // var ts2 = state.T2 == null ? "" : ((int)(DateTime.Now - state.T2).TotalMilliseconds).ToString(); // var ts3 = state.T3 == null ? "" : ((int)(DateTime.Now - state.T3).TotalMilliseconds).ToString(); // var ts4 = state.T4 == null ? "" : ((int)(DateTime.Now - state.T4).TotalMilliseconds).ToString(); // var ts5 = state.T5 == null ? "" : ((int)(DateTime.Now - state.T5).TotalMilliseconds).ToString(); // _log.LogInformation($"ApiService Timing:\n{ts1}\n{ts2}\n{ts3}\n{ts4}\n{ts5}\n"); // var resultMsg = state.OutputMsgs.Count > 0 ? state.OutputMsgs.First().Result.ToString() : "Unable to authorize block"; // _log.LogInformation($"ApiService: PostToConsensusAsync Exited: IsAuthoringSuccess: {state?.CommitConsensus == ConsensusResult.Yea} with {resultMsg}"); // // keep a snapshot of last success consensus. // if ((state?.CommitConsensus ?? ConsensusResult.Uncertain) != ConsensusResult.Uncertain) // LastState = state; // return state; //} internal async Task <AuthorizationAPIResult> Pre_PrepareAsync(TransactionBlock block1, Func <TransactionBlock, Task <TransactionBlock> > OnBlockSucceed = null) { var result = new AuthorizationAPIResult(); var state = await NodeService.Dag.Consensus.Ask <AuthState>(new ConsensusService.AskForConsensusState { ReqBlock = block1 }); NodeService.Dag.Consensus.Tell(state); await state.WaitForCloseAsync(); var consensusResult = state.CommitConsensus; if (consensusResult == ConsensusResult.Yea) { result.ResultCode = APIResultCodes.Success; result.TxHash = block1.Hash; } else if (consensusResult == ConsensusResult.Nay) { result.ResultCode = state.GetMajorErrorCode(); } else if (consensusResult == null || consensusResult == ConsensusResult.Uncertain) { result.ResultCode = APIResultCodes.ConsensusTimeout; } return(result); }
public async Task <AuthorizationAPIResult> CreateTokenAsync(TokenGenesisBlock tokenBlock) { var result = new AuthorizationAPIResult(); //// filter the names -- not needed because authorizer control it //if (tokenBlock.DomainName.ToLower().StartsWith("lyra") // || tokenBlock.Ticker.ToLower().StartsWith("lyra")) //{ // result.ResultCode = APIResultCodes.NameUnavailable; // return result; //} return(await Pre_PrepareAsync(tokenBlock).ConfigureAwait(false)); }
public async Task <AuthorizationAPIResult> CreateToken(TokenGenesisBlock tokenBlock) { var result = new AuthorizationAPIResult(); // filter the names if (tokenBlock.DomainName.ToLower().StartsWith("lyra") || tokenBlock.Ticker.ToLower().StartsWith("lyra")) { result.ResultCode = APIResultCodes.NameUnavailable; return(result); } return(await Pre_PrepareAsync(tokenBlock, async (b) => { var feeResult = await ProcessTokenGenerationFee(b as TokenGenesisBlock); return feeResult.block; }).ConfigureAwait(false)); }
internal async Task <AuthorizationAPIResult> Pre_PrepareAsync(TransactionBlock block1, Func <TransactionBlock, Task <TransactionBlock> > OnBlockSucceed = null) { bool IsSuccess; AuthState state2 = null; var state1 = await PostToConsensusAsync(block1).ConfigureAwait(false); if (state1 != null && state1.CommitConsensus == ConsensusResult.Yay) { IsSuccess = true; //fee is the bottle neck!!! must do lazy fee collection by consolidation if (OnBlockSucceed != null) { var block2 = await OnBlockSucceed(state1.InputMsg.Block as TransactionBlock).ConfigureAwait(false); if (block2 != null) { state2 = await PostToConsensusAsync(block2).ConfigureAwait(false); } } } else { IsSuccess = false; } var result = new AuthorizationAPIResult(); if (IsSuccess) { result.ResultCode = APIResultCodes.Success; } else if (state1 == null) { result.ResultCode = APIResultCodes.BlockFailedToBeAuthorized; } else { result.ResultCode = state1.OutputMsgs.Count > 0 ? state1.OutputMsgs.First().Result : APIResultCodes.BlockFailedToBeAuthorized; } return(result); }