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