Search in sources :

Example 1 with TransactionInfoPo

use of io.nuls.contract.storage.po.TransactionInfoPo in project nuls by nuls-io.

the class ContractTransactionInfoStorageServiceImpl method getTransactionInfoListByAddress.

@Override
public List<TransactionInfoPo> getTransactionInfoListByAddress(byte[] address) throws NulsException {
    List<TransactionInfoPo> infoPoList = new ArrayList<>();
    List<byte[]> keyList = dbService.keyList(ContractStorageConstant.DB_NAME_CONTRACT_LEDGER_TX_INDEX);
    if (keyList == null || keyList.isEmpty()) {
        return infoPoList;
    }
    byte[] addressKey = new byte[Address.ADDRESS_LENGTH];
    TransactionInfoPo transactionInfoPo;
    byte[] values;
    for (byte[] key : keyList) {
        System.arraycopy(key, 0, addressKey, 0, Address.ADDRESS_LENGTH);
        if (Arrays.equals(addressKey, address)) {
            values = dbService.get(ContractStorageConstant.DB_NAME_CONTRACT_LEDGER_TX_INDEX, key);
            transactionInfoPo = new TransactionInfoPo();
            transactionInfoPo.parse(values, 0);
            infoPoList.add(transactionInfoPo);
        }
    }
    return infoPoList;
}
Also used : ArrayList(java.util.ArrayList) TransactionInfoPo(io.nuls.contract.storage.po.TransactionInfoPo)

Example 2 with TransactionInfoPo

use of io.nuls.contract.storage.po.TransactionInfoPo in project nuls by nuls-io.

the class ContractServiceImpl method rollbackTransaction.

private Result<Integer> rollbackTransaction(Transaction tx) {
    // 获取tx中是智能合约地址的地址列表
    List<byte[]> addresses = ContractLedgerUtil.getRelatedAddresses(tx);
    if (addresses == null || addresses.size() == 0) {
        return Result.getSuccess().setData(0);
    }
    TransactionInfoPo txInfoPo = new TransactionInfoPo(tx);
    // 删除合约地址相关交易 - TransactionInfo
    Result result = contractTransactionInfoService.deleteTransactionInfo(txInfoPo, addresses);
    if (result.isFailed()) {
        return result;
    }
    // 删除非合约交易转入合约地址的utxo
    if (tx.getType() != TX_TYPE_CALL_CONTRACT) {
        result = contractUtxoService.deleteUtxoOfTransaction(tx);
        if (result.isFailed()) {
            Log.error("rollback non-call-contract transfer utxo error, reason is {}.", result.getMsg());
            return result;
        }
    }
    return result;
}
Also used : TransactionInfoPo(io.nuls.contract.storage.po.TransactionInfoPo) ContractResult(io.nuls.contract.dto.ContractResult) ValidateResult(io.nuls.kernel.validate.ValidateResult) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult)

Example 3 with TransactionInfoPo

use of io.nuls.contract.storage.po.TransactionInfoPo in project nuls by nuls-io.

the class ContractResource method getTxList.

@GET
@Path("/tx/list/{contractAddress}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "获取智能合约的交易列表")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = ContractTransactionInfoDto.class) })
public RpcClientResult getTxList(@ApiParam(name = "contractAddress", value = "智能合约地址", required = true) @PathParam("contractAddress") String contractAddress, @ApiParam(name = "pageNumber", value = "页码", required = true) @QueryParam("pageNumber") Integer pageNumber, @ApiParam(name = "pageSize", value = "每页条数", required = false) @QueryParam("pageSize") Integer pageSize, @ApiParam(name = "accountAddress", value = "钱包账户地址") @QueryParam("accountAddress") String accountAddress) {
    try {
        if (null == pageNumber || pageNumber == 0) {
            pageNumber = 1;
        }
        if (null == pageSize || pageSize == 0) {
            pageSize = 10;
        }
        if (pageNumber < 0 || pageSize < 0 || pageSize > 100) {
            return Result.getFailed(KernelErrorCode.PARAMETER_ERROR).toRpcClientResult();
        }
        if (StringUtils.isBlank(contractAddress)) {
            return Result.getFailed(LedgerErrorCode.NULL_PARAMETER).toRpcClientResult();
        }
        boolean isFilterAccountAddress = false;
        if (StringUtils.isNotBlank(accountAddress)) {
            Result<Account> accountResult = accountService.getAccount(accountAddress);
            if (accountResult.isFailed()) {
                return accountResult.toRpcClientResult();
            }
            isFilterAccountAddress = true;
        }
        if (!AddressTool.validAddress(contractAddress)) {
            return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
        }
        byte[] contractAddressBytes = AddressTool.getAddress(contractAddress);
        if (!ContractLedgerUtil.isExistContractAddress(contractAddressBytes)) {
            return Result.getFailed(ContractErrorCode.CONTRACT_ADDRESS_NOT_EXIST).toRpcClientResult();
        }
        Result<List<TransactionInfoPo>> txInfoPoListResult = contractTransactionInfoService.getTxInfoList(contractAddressBytes);
        List<TransactionInfoPo> orginTxInfoPoList = txInfoPoListResult.getData();
        List<TransactionInfoPo> txInfoPoList = new ArrayList<>();
        do {
            if (orginTxInfoPoList == null || orginTxInfoPoList.size() == 0) {
                break;
            }
            Stream<TransactionInfoPo> transactionInfoPoStream = orginTxInfoPoList.stream().filter(po -> po.getTxType() != ContractConstant.TX_TYPE_CONTRACT_TRANSFER);
            // 筛选出和账户相关的合约交易
            if (isFilterAccountAddress) {
                byte[] accountAddressBytes = AddressTool.getAddress(accountAddress);
                txInfoPoList = transactionInfoPoStream.filter(po -> checkEquals(po.getAddresses(), accountAddressBytes, 0)).collect(Collectors.toList());
            } else {
                txInfoPoList = transactionInfoPoStream.collect(Collectors.toList());
                ;
            }
        } while (false);
        Result result = Result.getSuccess();
        List<ContractTransactionDto> infoDtoList = new ArrayList<>();
        Page<ContractTransactionDto> page = new Page<>(pageNumber, pageSize, txInfoPoList.size());
        int start = pageNumber * pageSize - pageSize;
        if (start >= page.getTotal()) {
            result.setData(page);
            return result.toRpcClientResult();
        }
        int end = start + pageSize;
        if (end > page.getTotal()) {
            end = (int) page.getTotal();
        }
        // List<ContractTransactionInfoDto> resultList = new ArrayList<>();
        if (txInfoPoList.size() > 0) {
            txInfoPoList.sort(new Comparator<TransactionInfoPo>() {

                @Override
                public int compare(TransactionInfoPo o1, TransactionInfoPo o2) {
                    return o1.compareTo(o2.getTime());
                }
            });
            for (int i = start; i < end; i++) {
                TransactionInfoPo info = txInfoPoList.get(i);
                RpcClientResult txResult = this.getContractTx(info.getTxHash().getDigestHex());
                if (txResult.isFailed()) {
                    continue;
                }
                infoDtoList.add((ContractTransactionDto) txResult.getData());
            }
        }
        page.setList(infoDtoList);
        result.setSuccess(true);
        result.setData(page);
        return result.toRpcClientResult();
    } catch (Exception e) {
        Log.error(e);
        Result result = Result.getFailed(LedgerErrorCode.SYS_UNKOWN_EXCEPTION);
        return result.toRpcClientResult();
    }
}
Also used : Account(io.nuls.account.model.Account) Page(io.nuls.core.tools.page.Page) NulsException(io.nuls.kernel.exception.NulsException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException) ContractResult(io.nuls.contract.dto.ContractResult) TransactionInfoPo(io.nuls.contract.storage.po.TransactionInfoPo)

Example 4 with TransactionInfoPo

use of io.nuls.contract.storage.po.TransactionInfoPo in project nuls by nuls-io.

the class ContractServiceImpl method saveConfirmedTransaction.

private Result<Integer> saveConfirmedTransaction(Transaction tx) {
    if (tx == null) {
        Log.error("save confirmed contract tx error, tx is null.");
        return Result.getFailed(ContractErrorCode.NULL_PARAMETER);
    }
    // 获取tx中是智能合约地址列表
    List<byte[]> addresses = ContractLedgerUtil.getRelatedAddresses(tx);
    // 合约账本不处理非合约相关交易
    if (addresses == null || addresses.size() == 0) {
        return Result.getSuccess().setData(0);
    }
    TransactionInfoPo txInfoPo = new TransactionInfoPo(tx);
    txInfoPo.setStatus(TransactionInfo.CONFIRMED);
    Result result = contractTransactionInfoService.saveTransactionInfo(txInfoPo, addresses);
    if (result.isFailed()) {
        Log.error("save confirmed contract transactionInfo error, reason is {}.", result.getMsg());
        return result;
    }
    // 保存非合约交易转入合约地址的utxo
    if (tx.getType() != TX_TYPE_CALL_CONTRACT) {
        result = contractUtxoService.saveUtxoForContractAddress(tx);
        if (result.isFailed()) {
            Log.error("save confirmed non-call-contract transfer utxo error, reason is {}.", result.getMsg());
            return result;
        }
    }
    result.setData(new Integer(1));
    return result;
}
Also used : BigInteger(java.math.BigInteger) TransactionInfoPo(io.nuls.contract.storage.po.TransactionInfoPo) ContractResult(io.nuls.contract.dto.ContractResult) ValidateResult(io.nuls.kernel.validate.ValidateResult) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult)

Aggregations

TransactionInfoPo (io.nuls.contract.storage.po.TransactionInfoPo)4 ContractResult (io.nuls.contract.dto.ContractResult)3 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)2 ValidateResult (io.nuls.kernel.validate.ValidateResult)2 Account (io.nuls.account.model.Account)1 Page (io.nuls.core.tools.page.Page)1 NulsException (io.nuls.kernel.exception.NulsException)1 NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)1 IOException (java.io.IOException)1 BigInteger (java.math.BigInteger)1 ArrayList (java.util.ArrayList)1