Search in sources :

Example 1 with NulsRuntimeException

use of io.nuls.kernel.exception.NulsRuntimeException in project nuls by nuls-io.

the class AccountLedgerResource method getConfirmedTx.

/**
 * 获取已确认的交易
 */
private Result getConfirmedTx(String hash) {
    Result result = null;
    try {
        Transaction tx = ledgerService.getTx(NulsDigestData.fromDigestHex(hash));
        if (tx == null) {
            result = Result.getFailed(TransactionErrorCode.TX_NOT_EXIST);
        } else {
            tx.setStatus(TxStatusEnum.CONFIRMED);
            TransactionDto txDto = null;
            CoinData coinData = tx.getCoinData();
            if (coinData != null) {
                // 组装from数据
                List<Coin> froms = coinData.getFrom();
                if (froms != null && froms.size() > 0) {
                    byte[] fromHash, owner;
                    int fromIndex;
                    NulsDigestData fromHashObj;
                    Transaction fromTx;
                    Coin fromUtxo;
                    for (Coin from : froms) {
                        owner = from.getOwner();
                        // owner拆分出txHash和index
                        fromHash = AccountLegerUtils.getTxHashBytes(owner);
                        fromIndex = AccountLegerUtils.getIndex(owner);
                        // 查询from UTXO
                        fromHashObj = new NulsDigestData();
                        fromHashObj.parse(fromHash, 0);
                        fromTx = ledgerService.getTx(fromHashObj);
                        fromUtxo = fromTx.getCoinData().getTo().get(fromIndex);
                        from.setFrom(fromUtxo);
                    }
                }
                txDto = new TransactionDto(tx);
                List<OutputDto> outputDtoList = new ArrayList<>();
                // 组装to数据
                List<Coin> tos = coinData.getTo();
                if (tos != null && tos.size() > 0) {
                    byte[] txHashBytes = tx.getHash().serialize();
                    String txHash = hash;
                    OutputDto outputDto = null;
                    Coin to, temp;
                    long bestHeight = NulsContext.getInstance().getBestHeight();
                    long currentTime = TimeService.currentTimeMillis();
                    long lockTime;
                    for (int i = 0, length = tos.size(); i < length; i++) {
                        to = tos.get(i);
                        outputDto = new OutputDto(to);
                        outputDto.setTxHash(txHash);
                        outputDto.setIndex(i);
                        temp = ledgerService.getUtxo(Arrays.concatenate(txHashBytes, new VarInt(i).encode()));
                        if (temp == null) {
                            // 已花费
                            outputDto.setStatus(3);
                        } else {
                            lockTime = temp.getLockTime();
                            if (lockTime < 0) {
                                // 共识锁定
                                outputDto.setStatus(2);
                            } else if (lockTime == 0) {
                                // 正常未花费
                                outputDto.setStatus(0);
                            } else if (lockTime > NulsConstant.BlOCKHEIGHT_TIME_DIVIDE) {
                                // 判定是否时间高度锁定
                                if (lockTime > currentTime) {
                                    // 时间高度锁定
                                    outputDto.setStatus(1);
                                } else {
                                    // 正常未花费
                                    outputDto.setStatus(0);
                                }
                            } else {
                                // 判定是否区块高度锁定
                                if (lockTime > bestHeight) {
                                    // 区块高度锁定
                                    outputDto.setStatus(1);
                                } else {
                                    // 正常未花费
                                    outputDto.setStatus(0);
                                }
                            }
                        }
                        outputDtoList.add(outputDto);
                    }
                }
                txDto.setOutputs(outputDtoList);
                // 计算交易实际发生的金额
                calTransactionValue(txDto);
            }
            result = Result.getSuccess();
            result.setData(txDto);
        }
    } catch (NulsRuntimeException re) {
        Log.error(re);
        result = Result.getFailed(re.getErrorCode());
    } catch (Exception e) {
        Log.error(e);
        result = Result.getFailed(LedgerErrorCode.SYS_UNKOWN_EXCEPTION);
    }
    return result;
}
Also used : NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) CryptoException(io.nuls.core.tools.crypto.Exception.CryptoException) NulsException(io.nuls.kernel.exception.NulsException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException) ValidateResult(io.nuls.kernel.validate.ValidateResult) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) TransferTransaction(io.nuls.protocol.model.tx.TransferTransaction)

Example 2 with NulsRuntimeException

use of io.nuls.kernel.exception.NulsRuntimeException in project nuls by nuls-io.

the class CoinDataTool method getCoinData.

public static CoinDataResult getCoinData(byte[] address, Na amount, int size, Na price, List<Coin> coinList) {
    if (null == price) {
        throw new NulsRuntimeException(KernelErrorCode.PARAMETER_ERROR);
    }
    CoinDataResult coinDataResult = new CoinDataResult();
    coinDataResult.setEnough(false);
    if (coinList.isEmpty()) {
        return coinDataResult;
    }
    List<Coin> coins = new ArrayList<>();
    Na values = Na.ZERO;
    // 累加到足够支付转出额与手续费
    for (int i = 0; i < coinList.size(); i++) {
        Coin coin = coinList.get(i);
        coins.add(coin);
        size += coin.size();
        if (i == 127) {
            size += 1;
        }
        // 每次累加一条未花费余额时,需要重新计算手续费
        Na fee = TransactionFeeCalculator.getFee(size, price);
        values = values.add(coin.getNa());
        /**
         * 判断是否是脚本验证UTXO
         */
        int signType = coinDataResult.getSignType();
        if (signType != 3) {
            if ((signType & 0x01) == 0 && coin.getTempOwner().length == 23) {
                coinDataResult.setSignType((byte) (signType | 0x01));
                size += P2PHKSignature.SERIALIZE_LENGTH;
            } else if ((signType & 0x02) == 0 && coin.getTempOwner().length != 23) {
                coinDataResult.setSignType((byte) (signType | 0x02));
                size += P2PHKSignature.SERIALIZE_LENGTH;
            }
        }
        // 需要判断是否找零,如果有找零,则需要重新计算手续费
        if (values.isGreaterThan(amount.add(fee))) {
            Na change = values.subtract(amount.add(fee));
            Coin changeCoin = new Coin();
            if (address[2] == NulsContext.P2SH_ADDRESS_TYPE) {
                changeCoin.setOwner(SignatureUtil.createOutputScript(address).getProgram());
            } else {
                changeCoin.setOwner(address);
            }
            changeCoin.setNa(change);
            fee = TransactionFeeCalculator.getFee(size + changeCoin.size(), price);
            if (values.isLessThan(amount.add(fee))) {
                continue;
            }
            changeCoin.setNa(values.subtract(amount.add(fee)));
            if (!changeCoin.getNa().equals(Na.ZERO)) {
                coinDataResult.setChange(changeCoin);
            }
        }
        coinDataResult.setFee(fee);
        if (values.isGreaterOrEquals(amount.add(fee))) {
            coinDataResult.setEnough(true);
            coinDataResult.setCoinList(coins);
            break;
        }
    }
    return coinDataResult;
}
Also used : Coin(io.nuls.kernel.model.Coin) Na(io.nuls.kernel.model.Na) ArrayList(java.util.ArrayList) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult)

Example 3 with NulsRuntimeException

use of io.nuls.kernel.exception.NulsRuntimeException in project nuls by nuls-io.

the class ContractResource method getContractTx.

@GET
@Path("/tx/{hash}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "获取智能合约交易详情")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = ContractTransactionDto.class) })
public RpcClientResult getContractTx(@ApiParam(name = "hash", value = "交易hash", required = true) @PathParam("hash") String hash) {
    if (StringUtils.isBlank(hash)) {
        return Result.getFailed(LedgerErrorCode.NULL_PARAMETER).toRpcClientResult();
    }
    if (!NulsDigestData.validHash(hash)) {
        return Result.getFailed(LedgerErrorCode.PARAMETER_ERROR).toRpcClientResult();
    }
    Result result;
    try {
        NulsDigestData txHashObj = NulsDigestData.fromDigestHex(hash);
        Transaction tx = ledgerService.getTx(txHashObj);
        if (tx == null) {
            result = Result.getFailed(TransactionErrorCode.TX_NOT_EXIST);
        } else {
            if (!ContractUtil.isContractTransaction(tx) && tx.getType() != NulsConstant.TX_TYPE_COINBASE) {
                return Result.getFailed(ContractErrorCode.NON_CONTRACTUAL_TRANSACTION).toRpcClientResult();
            }
            tx.setStatus(TxStatusEnum.CONFIRMED);
            ContractTransactionDto txDto = null;
            CoinData coinData = tx.getCoinData();
            byte[] txHashBytes = tx.getHash().serialize();
            if (coinData != null) {
                // 组装from数据
                List<Coin> froms = coinData.getFrom();
                if (froms != null && froms.size() > 0) {
                    byte[] fromHash, owner;
                    int fromIndex;
                    NulsDigestData fromHashObj;
                    Transaction fromTx;
                    Coin fromUtxo;
                    for (Coin from : froms) {
                        owner = from.getOwner();
                        // owner拆分出txHash和index
                        fromHash = LedgerUtil.getTxHashBytes(owner);
                        fromIndex = LedgerUtil.getIndex(owner);
                        // 查询from UTXO
                        fromHashObj = new NulsDigestData();
                        fromHashObj.parse(fromHash, 0);
                        fromTx = ledgerService.getTx(fromHashObj);
                        fromUtxo = fromTx.getCoinData().getTo().get(fromIndex);
                        from.setFrom(fromUtxo);
                    }
                }
                txDto = new ContractTransactionDto(tx);
                List<OutputDto> outputDtoList = new ArrayList<>();
                // 组装to数据
                List<Coin> tos = coinData.getTo();
                if (tos != null && tos.size() > 0) {
                    String txHash = hash;
                    OutputDto outputDto;
                    Coin to, temp;
                    long bestHeight = NulsContext.getInstance().getBestHeight();
                    long currentTime = TimeService.currentTimeMillis();
                    long lockTime;
                    for (int i = 0, length = tos.size(); i < length; i++) {
                        to = tos.get(i);
                        outputDto = new OutputDto(to);
                        outputDto.setTxHash(txHash);
                        outputDto.setIndex(i);
                        temp = ledgerService.getUtxo(org.spongycastle.util.Arrays.concatenate(txHashBytes, new VarInt(i).encode()));
                        if (temp == null) {
                            // 已花费
                            outputDto.setStatus(3);
                        } else {
                            lockTime = temp.getLockTime();
                            if (lockTime < 0) {
                                // 共识锁定
                                outputDto.setStatus(2);
                            } else if (lockTime == 0) {
                                // 正常未花费
                                outputDto.setStatus(0);
                            } else if (lockTime > NulsConstant.BlOCKHEIGHT_TIME_DIVIDE) {
                                // 判定是否时间高度锁定
                                if (lockTime > currentTime) {
                                    // 时间高度锁定
                                    outputDto.setStatus(1);
                                } else {
                                    // 正常未花费
                                    outputDto.setStatus(0);
                                }
                            } else {
                                // 判定是否区块高度锁定
                                if (lockTime > bestHeight) {
                                    // 区块高度锁定
                                    outputDto.setStatus(1);
                                } else {
                                    // 正常未花费
                                    outputDto.setStatus(0);
                                }
                            }
                        }
                        outputDtoList.add(outputDto);
                    }
                }
                txDto.setOutputs(outputDtoList);
                // 计算交易实际发生的金额
                calTransactionValue(txDto);
            }
            // 获取合约执行结果
            if (tx.getType() != ContractConstant.TX_TYPE_CONTRACT_TRANSFER) {
                ContractResult contractExecuteResult = contractService.getContractExecuteResult(txHashObj);
                if (contractExecuteResult != null) {
                    Result<ContractAddressInfoPo> contractAddressInfoResult = contractAddressStorageService.getContractAddressInfo(contractExecuteResult.getContractAddress());
                    ContractAddressInfoPo po = contractAddressInfoResult.getData();
                    if (po != null && po.isNrc20()) {
                        contractExecuteResult.setNrc20(true);
                        if (contractExecuteResult.isSuccess()) {
                            txDto.setContractResult(new ContractResultDto(contractExecuteResult, tx, po));
                        } else {
                            ContractData contractData = (ContractData) tx.getTxData();
                            byte[] sender = contractData.getSender();
                            byte[] infoKey = ArraysTool.concatenate(sender, txHashBytes, new VarInt(0).encode());
                            Result<ContractTokenTransferInfoPo> tokenTransferResult = contractTokenTransferStorageService.getTokenTransferInfo(infoKey);
                            ContractTokenTransferInfoPo transferInfoPo = tokenTransferResult.getData();
                            txDto.setContractResult(new ContractResultDto(contractExecuteResult, tx, po, transferInfoPo));
                        }
                    } else {
                        txDto.setContractResult(new ContractResultDto(contractExecuteResult, tx));
                    }
                    ContractResultDto contractResultDto = txDto.getContractResult();
                    List<ContractTokenTransferDto> tokenTransfers = contractResultDto.getTokenTransfers();
                    List<ContractTokenTransferDto> realTokenTransfers = this.filterRealTokenTransfers(tokenTransfers);
                    contractResultDto.setTokenTransfers(realTokenTransfers);
                }
            }
            result = Result.getSuccess();
            result.setData(txDto);
        }
    } catch (NulsRuntimeException e) {
        Log.error(e);
        result = Result.getFailed(e.getErrorCode());
    } catch (Exception e) {
        Log.error(e);
        result = Result.getFailed(LedgerErrorCode.SYS_UNKOWN_EXCEPTION);
    }
    return result.toRpcClientResult();
}
Also used : NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) ContractResult(io.nuls.contract.dto.ContractResult) ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo) CreateContractData(io.nuls.contract.entity.txdata.CreateContractData) ContractData(io.nuls.contract.entity.txdata.ContractData) ContractTokenTransferInfoPo(io.nuls.contract.dto.ContractTokenTransferInfoPo) ContractResult(io.nuls.contract.dto.ContractResult) VarInt(io.nuls.kernel.utils.VarInt) NulsException(io.nuls.kernel.exception.NulsException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException) CreateContractTransaction(io.nuls.contract.entity.tx.CreateContractTransaction)

Example 4 with NulsRuntimeException

use of io.nuls.kernel.exception.NulsRuntimeException in project nuls by nuls-io.

the class DownloadProcessor method getNetworkNewestBlock.

public NetworkNewestBlockInfos getNetworkNewestBlock() {
    Collection<Node> nodeList = networkService.getAvailableNodes();
    Map<NulsDigestData, Integer> statisticsMaps = new HashMap<>();
    Map<NulsDigestData, List<Node>> nodeMaps = new HashMap<>();
    // System.out.println("--------------start download-------------------");
    for (Node node : nodeList) {
        // System.out.println(node.getId() + " : " + node.getBestBlockHeight() + " : " + node.getBestBlockHash());
        NulsDigestData hash = node.getBestBlockHash();
        Integer statistics = statisticsMaps.get(hash);
        if (statistics == null) {
            statisticsMaps.put(hash, 0);
        }
        statisticsMaps.put(hash, statisticsMaps.get(hash) + 1);
        List<Node> nodes = nodeMaps.get(hash);
        if (nodes == null) {
            nodes = new ArrayList<>();
            nodeMaps.put(hash, nodes);
        }
        nodes.add(node);
    }
    // max number
    int max = 0;
    long bestHeight = 0;
    NulsDigestData bestHash = null;
    List<Node> nodes = null;
    for (Map.Entry<NulsDigestData, Integer> entry : statisticsMaps.entrySet()) {
        int count = entry.getValue();
        NulsDigestData hash = entry.getKey();
        List<Node> tempNodes = nodeMaps.get(hash);
        long height = tempNodes.get(0).getBestBlockHeight();
        if (count > max || (count == max && bestHeight < height)) {
            max = count;
            bestHash = hash;
            bestHeight = height;
            nodes = tempNodes;
        }
    }
    if (nodes == null || nodes.size() == 0) {
        throw new NulsRuntimeException(NetworkErrorCode.NET_NODE_NOT_FOUND);
    }
    return new NetworkNewestBlockInfos(bestHeight, bestHash, nodes);
}
Also used : Node(io.nuls.network.model.Node) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) NetworkNewestBlockInfos(io.nuls.protocol.base.download.entity.NetworkNewestBlockInfos) NulsDigestData(io.nuls.kernel.model.NulsDigestData)

Example 5 with NulsRuntimeException

use of io.nuls.kernel.exception.NulsRuntimeException in project nuls by nuls-io.

the class VersionManagerStorageServiceImpl method afterPropertiesSet.

/**
 * 创建存储表,创建失败时如果是因为已存在则正常,否则抛出异常
 * Create a storage table, or throw an exception if it is normal if it is already existing.
 */
@Override
public void afterPropertiesSet() {
    Result result = dbService.createArea(ProtocolStorageConstant.NULS_VERSION_AREA);
    if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
        throw new NulsRuntimeException(result.getErrorCode());
    }
    // 
    // result = this.dbService.createArea(ProtocolStorageConstant.NULS_PROTOCOL_AREA);
    // if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
    // throw new NulsRuntimeException(result.getErrorCode());
    // }
    // 
    result = dbService.createArea(ProtocolStorageConstant.PROTOCOL_TEMP_AREA);
    if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
        throw new NulsRuntimeException(result.getErrorCode());
    }
    // 
    // result = this.dbService.createArea(ProtocolStorageConstant.BLOCK_PROTOCOL_INDEX);
    // if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
    // throw new NulsRuntimeException(result.getErrorCode());
    // }
    // 
    // result = this.dbService.createArea(ProtocolStorageConstant.BLOCK_PROTOCOL_AREA);
    // if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
    // throw new NulsRuntimeException(result.getErrorCode());
    // }
    // 
    // result = this.dbService.createArea(ProtocolStorageConstant.BLOCK_TEMP_PROTOCOL_INDEX);
    // if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
    // throw new NulsRuntimeException(result.getErrorCode());
    // }
    // 
    // result = this.dbService.createArea(ProtocolStorageConstant.BLOCK_TEMP_PROTOCOL_AREA);
    // if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
    // throw new NulsRuntimeException(result.getErrorCode());
    // }
    // 
    // result = this.dbService.createArea(ProtocolStorageConstant.CONSENSUS_VERSION_AREA);
    // if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
    // throw new NulsRuntimeException(result.getErrorCode());
    // }
    // 
    result = this.dbService.createArea(ProtocolStorageConstant.BLOCK_PROTOCOL_HEIGHT);
    if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
        throw new NulsRuntimeException(result.getErrorCode());
    }
    result = this.dbService.createArea(ProtocolStorageConstant.NULS_PROTOCOL_INFO_AREA);
    if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
        throw new NulsRuntimeException(result.getErrorCode());
    }
    result = this.dbService.createArea(ProtocolStorageConstant.NULS_PROTOCOL_TEMP_INFO_AREA);
    if (result.isFailed() && !DBErrorCode.DB_AREA_EXIST.equals(result.getErrorCode())) {
        throw new NulsRuntimeException(result.getErrorCode());
    }
}
Also used : NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) Result(io.nuls.kernel.model.Result)

Aggregations

NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)68 IOException (java.io.IOException)35 NulsException (io.nuls.kernel.exception.NulsException)26 ArrayList (java.util.ArrayList)21 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)10 Result (io.nuls.kernel.model.Result)9 Account (io.nuls.account.model.Account)8 MultiSigAccount (io.nuls.account.model.MultiSigAccount)8 Entry (io.nuls.db.model.Entry)8 Agent (io.nuls.consensus.poc.protocol.entity.Agent)7 VarInt (io.nuls.kernel.utils.VarInt)7 CreateAgentTransaction (io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction)6 ValidateResult (io.nuls.kernel.validate.ValidateResult)6 UnsupportedEncodingException (java.io.UnsupportedEncodingException)6 Deposit (io.nuls.consensus.poc.protocol.entity.Deposit)5 DepositTransaction (io.nuls.consensus.poc.protocol.tx.DepositTransaction)5 DepositPo (io.nuls.consensus.poc.storage.po.DepositPo)5 PunishLogPo (io.nuls.consensus.poc.storage.po.PunishLogPo)5 TransferTransaction (io.nuls.protocol.model.tx.TransferTransaction)5 StopAgent (io.nuls.consensus.poc.protocol.entity.StopAgent)4