public static bool OnGetTransactionSignWeight(JToken id, string method, JArray parameters, out JToken result) { result = new JObject(); if (parameters == null || parameters.Count != 1) { result = RpcMessage.CreateErrorResult(id, RpcMessage.INVALID_PARAMS, "Invalid parameters"); return(false); } Transaction transaction = Transaction.Parser.ParseFrom(parameters[0].ToObject <byte[]>()); TransactionSignWeight weight = RpcApiService.GetTransactionSignWeight(transaction); result = JToken.FromObject(weight.ToByteArray()); return(true); }
public static TransactionSignWeight GetTransactionSignWeight(Transaction transaction) { TransactionSignWeight weight = new TransactionSignWeight(); TransactionExtention extention = new TransactionExtention(); weight.Result = new TransactionSignWeight.Types.Result(); extention.Result = new Return(); extention.Transaction = transaction; extention.Txid = ByteString.CopyFrom(SHA256Hash.ToHash(transaction.RawData.ToByteArray())); extention.Result.Result = true; extention.Result.Code = Return.Types.response_code.Success; weight.Transaction = extention; try { Contract contract = transaction.RawData.Contract[0]; byte[] owner = TransactionCapsule.GetOwner(contract); AccountCapsule account = Manager.Instance.DBManager.Account.Get(owner); if (account == null) { throw new PermissionException("Account is not exist!"); } int permission_id = contract.PermissionId; Permission permission = account.GetPermissionById(permission_id); if (permission == null) { throw new PermissionException("permission isn't exit"); } if (permission_id != 0) { if (permission.Type != Permission.Types.PermissionType.Active) { throw new PermissionException("Permission type is error"); } if (!CheckPermissionOprations(permission, contract)) { throw new PermissionException("Permission denied"); } } weight.Permission = permission; if (transaction.Signature.Count > 0) { List <ByteString> approves = new List <ByteString>(); weight.ApprovedList.AddRange(approves); weight.CurrentWeight = TransactionCapsule.CheckWeight(permission, new List <ByteString>(transaction.Signature), SHA256Hash.ToHash(transaction.RawData.ToByteArray()), approves); } if (weight.CurrentWeight >= permission.Threshold) { weight.Result.Code = TransactionSignWeight.Types.Result.Types.response_code.EnoughPermission; } else { weight.Result.Code = TransactionSignWeight.Types.Result.Types.response_code.NotEnoughPermission; } } catch (SignatureFormatException e) { weight.Result.Code = TransactionSignWeight.Types.Result.Types.response_code.SignatureFormatError; weight.Result.Message = e.Message; } catch (SignatureException e) { weight.Result.Code = TransactionSignWeight.Types.Result.Types.response_code.ComputeAddressError; weight.Result.Message = e.Message; } catch (PermissionException e) { weight.Result.Code = TransactionSignWeight.Types.Result.Types.response_code.PermissionError; weight.Result.Message = e.Message; } catch (System.Exception e) { weight.Result.Code = TransactionSignWeight.Types.Result.Types.response_code.OtherError; weight.Result.Message = e.Message; } return(weight); }