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;
}
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;
}
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();
}
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);
}
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());
}
}
Aggregations