use of io.nuls.consensus.poc.protocol.entity.Deposit in project nuls by nuls-io.
the class PocConsensusResource method createMutilDeposit.
@POST
@Path("/multiAccount/createMultiDeposit")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "deposit nuls to a bank! 多签账户申请参与共识 ", notes = "返回申请成功交易hash")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = String.class) })
public RpcClientResult createMutilDeposit(@ApiParam(name = "form", value = "多签账户申请参与共识表单数据", required = true) CreateMultiDepositForm form) throws Exception {
if (NulsContext.MAIN_NET_VERSION <= 1) {
return Result.getFailed(KernelErrorCode.VERSION_TOO_LOW).toRpcClientResult();
}
AssertUtil.canNotEmpty(form);
AssertUtil.canNotEmpty(form.getDeposit());
AssertUtil.canNotEmpty(form.getAgentHash());
AssertUtil.canNotEmpty(form.getAddress());
AssertUtil.canNotEmpty(form.getSignAddress());
if (form == null) {
return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
}
if (!NulsDigestData.validHash(form.getAgentHash())) {
return Result.getFailed(PocConsensusErrorCode.AGENT_NOT_EXIST).toRpcClientResult();
}
if (!AddressTool.validAddress(form.getSignAddress()) || !AddressTool.validAddress(form.getAddress())) {
return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
}
Account account = accountService.getAccount(form.getSignAddress()).getData();
if (null == account) {
return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST).toRpcClientResult();
}
if (account.isEncrypted() && account.isLocked()) {
AssertUtil.canNotEmpty(form.getPassword(), "password is wrong");
if (!account.validatePassword(form.getPassword())) {
return Result.getFailed(AccountErrorCode.PASSWORD_IS_WRONG).toRpcClientResult();
}
}
Result<MultiSigAccount> sigAccountResult = accountService.getMultiSigAccount(form.getAddress());
MultiSigAccount multiSigAccount = sigAccountResult.getData();
// 验证签名账户是否属于多签账户,如果不是多签账户下的地址则提示错误
if (!AddressTool.validSignAddress(multiSigAccount.getPubKeyList(), account.getPubKey())) {
return Result.getFailed(AccountErrorCode.SIGN_ADDRESS_NOT_MATCH).toRpcClientResult();
}
Script redeemScript = accountLedgerService.getRedeemScript(multiSigAccount);
if (redeemScript == null) {
return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST).toRpcClientResult();
}
DepositTransaction tx = new DepositTransaction();
TransactionSignature transactionSignature = new TransactionSignature();
List<Script> scripts = new ArrayList<>();
Deposit deposit = new Deposit();
deposit.setAddress(AddressTool.getAddress(form.getAddress()));
deposit.setAgentHash(NulsDigestData.fromDigestHex(form.getAgentHash()));
deposit.setDeposit(Na.valueOf(form.getDeposit()));
tx.setTxData(deposit);
CoinData coinData = new CoinData();
List<Coin> toList = new ArrayList<>();
// AddressTool.getAddress(addr)
if (deposit.getAddress()[2] == NulsContext.P2SH_ADDRESS_TYPE) {
Script scriptPubkey = SignatureUtil.createOutputScript(deposit.getAddress());
toList.add(new Coin(scriptPubkey.getProgram(), deposit.getDeposit(), PocConsensusConstant.CONSENSUS_LOCK_TIME));
} else {
toList.add(new Coin(deposit.getAddress(), deposit.getDeposit(), PocConsensusConstant.CONSENSUS_LOCK_TIME));
}
coinData.setTo(toList);
tx.setCoinData(coinData);
// 交易签名的长度为m*单个签名长度+赎回脚本长度
int scriptSignLenth = redeemScript.getProgram().length + ((int) multiSigAccount.getM()) * 72;
CoinDataResult result = accountLedgerService.getMutilCoinData(deposit.getAddress(), deposit.getDeposit(), tx.size() + scriptSignLenth, TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
if (null != result) {
if (result.isEnough()) {
tx.getCoinData().setFrom(result.getCoinList());
if (null != result.getChange()) {
tx.getCoinData().getTo().add(result.getChange());
}
} else {
return Result.getFailed(TransactionErrorCode.INSUFFICIENT_BALANCE).toRpcClientResult();
}
}
tx.setHash(NulsDigestData.calcDigestData(tx.serializeForHash()));
// 将赎回脚本先存储在签名脚本中
scripts.add(redeemScript);
transactionSignature.setScripts(scripts);
Result resultData = accountLedgerService.txMultiProcess(tx, transactionSignature, account, form.getPassword());
if (resultData.isSuccess()) {
Map<String, String> valueMap = new HashMap<>();
valueMap.put("txData", (String) resultData.getData());
return Result.getSuccess().setData(valueMap).toRpcClientResult();
}
return resultData.toRpcClientResult();
}
use of io.nuls.consensus.poc.protocol.entity.Deposit in project nuls by nuls-io.
the class PocConsensusResource method getWholeInfo.
@GET
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Get the whole network consensus infomation! 查询全网共识总体信息 [3.6.1]")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = WholeNetConsensusInfoDTO.class) })
public RpcClientResult getWholeInfo() {
Result result = Result.getSuccess();
WholeNetConsensusInfoDTO dto = new WholeNetConsensusInfoDTO();
if (null == PocConsensusContext.getChainManager() || null == PocConsensusContext.getChainManager().getMasterChain()) {
return Result.getFailed(KernelErrorCode.DATA_NOT_FOUND).toRpcClientResult();
}
List<Agent> allAgentList = PocConsensusContext.getChainManager().getMasterChain().getChain().getAgentList();
long startBlockHeight = NulsContext.getInstance().getBestHeight();
List<Agent> agentList = new ArrayList<>();
long totalDeposit = 0;
for (int i = allAgentList.size() - 1; i >= 0; i--) {
Agent agent = allAgentList.get(i);
if (agent.getDelHeight() != -1L && agent.getDelHeight() <= startBlockHeight) {
continue;
} else if (agent.getBlockHeight() > startBlockHeight || agent.getBlockHeight() < 0L) {
continue;
}
totalDeposit += agent.getDeposit().getValue();
agentList.add(agent);
}
List<Deposit> deposits = PocConsensusContext.getChainManager().getMasterChain().getChain().getDepositList();
for (Deposit deposit : deposits) {
if (deposit.getDelHeight() > 0 && deposit.getDelHeight() <= startBlockHeight) {
continue;
} else if (deposit.getBlockHeight() > startBlockHeight || deposit.getBlockHeight() < 0L) {
continue;
}
totalDeposit += deposit.getDeposit().getValue();
}
MeetingRound round = PocConsensusContext.getChainManager().getMasterChain().getCurrentRound();
int packingAgentCount = 0;
if (null != round) {
for (MeetingMember member : round.getMemberList()) {
if (member.getAgent() != null) {
packingAgentCount++;
}
}
}
dto.setAgentCount(agentList.size());
dto.setTotalDeposit(totalDeposit);
dto.setConsensusAccountNumber(agentList.size());
dto.setPackingAgentCount(packingAgentCount);
result.setData(dto);
return result.toRpcClientResult();
}
use of io.nuls.consensus.poc.protocol.entity.Deposit in project nuls by nuls-io.
the class PocConsensusResource method fillAgent.
private void fillAgent(Agent agent, MeetingRound round, List<Deposit> depositList) {
if (null == depositList || depositList.isEmpty()) {
depositList = PocConsensusContext.getChainManager().getMasterChain().getChain().getDepositList();
}
Set<String> memberSet = new HashSet<>();
Na total = Na.ZERO;
for (int i = 0; i < depositList.size(); i++) {
Deposit deposit = depositList.get(i);
if (!agent.getTxHash().equals(deposit.getAgentHash())) {
continue;
}
if (deposit.getDelHeight() >= 0) {
continue;
}
total = total.add(deposit.getDeposit());
memberSet.add(AddressTool.getStringAddressByBytes(deposit.getAddress()));
}
agent.setMemberCount(memberSet.size());
agent.setTotalDeposit(total.getValue());
if (round == null) {
return;
}
MeetingMember member = round.getMember(agent.getPackingAddress());
if (null == member) {
agent.setStatus(0);
agent.setCreditVal(0);
return;
}
agent.setStatus(1);
agent.setCreditVal(member.getCreditVal());
}
use of io.nuls.consensus.poc.protocol.entity.Deposit in project nuls by nuls-io.
the class DepositTransaction method clone.
@Override
public DepositTransaction clone() {
DepositTransaction tx = new DepositTransaction();
try {
tx.parse(serialize(), 0);
} catch (Exception e) {
throw new NulsRuntimeException(e);
}
tx.setBlockHeight(blockHeight);
tx.setStatus(status);
tx.setHash(hash);
tx.setSize(size);
Deposit deposit = tx.getTxData();
deposit.setBlockHeight(txData.getBlockHeight());
deposit.setDelHeight(txData.getDelHeight());
deposit.setTime(txData.getTime());
deposit.setTxHash(txData.getTxHash());
deposit.setStatus(txData.getStatus());
return tx;
}
use of io.nuls.consensus.poc.protocol.entity.Deposit in project nuls by nuls-io.
the class PoConvertUtil method poToDeposit.
public static Deposit poToDeposit(DepositPo po) {
Deposit deposit = new Deposit();
deposit.setDeposit(po.getDeposit());
deposit.setAgentHash(po.getAgentHash());
deposit.setTime(po.getTime());
deposit.setDelHeight(po.getDelHeight());
deposit.setBlockHeight(po.getBlockHeight());
deposit.setAddress(po.getAddress());
deposit.setTxHash(po.getTxHash());
return deposit;
}
Aggregations