use of io.nuls.kernel.model.Coin in project nuls by nuls-io.
the class TxProcessTask method processTx.
private boolean processTx(Transaction tx, boolean isOrphanTx) {
try {
Result result = tx.verify();
if (result.isFailed()) {
return false;
}
Transaction tempTx = ledgerService.getTx(tx.getHash());
if (tempTx != null) {
return isOrphanTx;
}
ValidateResult validateResult = ledgerService.verifyCoinData(tx, temporaryToMap, temporaryFromSet);
if (validateResult.isSuccess()) {
pool.add(tx, false);
List<Coin> fromCoins = tx.getCoinData().getFrom();
for (Coin coin : fromCoins) {
String key = LedgerUtil.asString(coin.getOwner());
temporaryFromSet.remove(key);
temporaryToMap.remove(key);
}
// count++;
transactionCacheStorageService.putTx(tx);
transactionService.forwardTx(tx, null);
return true;
} else if (validateResult.getErrorCode().equals(TransactionErrorCode.ORPHAN_TX) && !isOrphanTx) {
processOrphanTx(tx);
} else if (isOrphanTx) {
return tx.getTime() < (TimeService.currentTimeMillis() - 3600000L);
}
} catch (Exception e) {
Log.error(e);
}
return false;
}
use of io.nuls.kernel.model.Coin in project nuls by nuls-io.
the class PocRewardCacheService method calcRewardHistory.
private void calcRewardHistory(String address, List<TransactionInfo> list, long startHeight) {
byte[] addressByte = AddressTool.getAddress(address);
for (TransactionInfo info : list) {
if (info.getTxType() != ProtocolConstant.TX_TYPE_COINBASE) {
continue;
}
CoinBaseTransaction tx = (CoinBaseTransaction) ledgerService.getTx(info.getTxHash());
if (null == tx) {
continue;
}
if (info.getBlockHeight() >= startHeight) {
continue;
}
if (null == tx.getCoinData().getTo() || tx.getCoinData().getTo().isEmpty()) {
continue;
}
for (Coin coin : tx.getCoinData().getTo()) {
// if (!Arrays.equals(addressByte, coin.()))
if (!Arrays.equals(addressByte, coin.getAddress())) {
continue;
}
Na na = totalMap.get(address);
if (na == null) {
na = Na.ZERO;
}
na = na.add(coin.getNa());
totalMap.put(address, na);
}
}
}
use of io.nuls.kernel.model.Coin in project nuls by nuls-io.
the class AliasTransactionValidator method validate.
@Override
public ValidateResult validate(AliasTransaction tx) {
Alias alias = tx.getTxData();
if (tx.isSystemTx()) {
return ValidateResult.getFailedResult(this.getClass().getName(), TransactionErrorCode.TX_TYPE_ERROR);
}
if (NulsContext.CONTRACT_ADDRESS_TYPE == alias.getAddress()[2]) {
return ValidateResult.getFailedResult(this.getClass().getName(), AccountErrorCode.ADDRESS_ERROR);
}
if (!StringUtils.validAlias(alias.getAlias())) {
return ValidateResult.getFailedResult(this.getClass().getName(), AccountErrorCode.ALIAS_FORMAT_WRONG);
}
if (!aliasService.isAliasUsable(alias.getAlias())) {
return ValidateResult.getFailedResult(this.getClass().getName(), AccountErrorCode.ALIAS_EXIST);
}
List<AliasPo> list = aliasStorageService.getAliasList().getData();
for (AliasPo aliasPo : list) {
if (Arrays.equals(aliasPo.getAddress(), alias.getAddress())) {
return ValidateResult.getFailedResult(this.getClass().getName(), AccountErrorCode.ACCOUNT_ALREADY_SET_ALIAS);
}
}
CoinData coinData = tx.getCoinData();
if (null == coinData || null == coinData.getTo() || coinData.getTo().isEmpty()) {
return ValidateResult.getFailedResult(this.getClass().getName(), TransactionErrorCode.COINDATA_NOT_FOUND);
}
boolean burned = false;
for (Coin coin : coinData.getTo()) {
if (ArraysTool.arrayEquals(coin.getOwner(), NulsConstant.BLACK_HOLE_ADDRESS) && coin.getNa().equals(Na.NA)) {
burned = true;
break;
}
if (!burned && !ArraysTool.arrayEquals(coin.getOwner(), NulsConstant.BLACK_HOLE_ADDRESS_TEST_NET) && coin.getNa().equals(Na.NA)) {
burned = true;
break;
}
}
if (!burned) {
return ValidateResult.getFailedResult(this.getClass().getName(), AccountErrorCode.MUST_BURN_A_NULS);
}
TransactionSignature sig = new TransactionSignature();
try {
sig.parse(tx.getTransactionSignature(), 0);
} catch (NulsException e) {
Log.error(e);
return ValidateResult.getFailedResult(this.getClass().getName(), e.getErrorCode());
}
boolean sign;
try {
sign = SignatureUtil.containsAddress(tx, tx.getTxData().getAddress());
} catch (NulsException e) {
sign = false;
}
if (!sign) {
ValidateResult result = ValidateResult.getFailedResult(this.getClass().getName(), AccountErrorCode.ADDRESS_ERROR);
result.setLevel(SeverityLevelEnum.FLAGRANT_FOUL);
return result;
}
return ValidateResult.getSuccessResult();
}
use of io.nuls.kernel.model.Coin in project nuls by nuls-io.
the class ContractBalanceManager method refreshBalance.
/**
* 刷新余额
*/
public void refreshBalance(List<Coin> addUtxoList, List<Coin> deleteUtxoList) {
lock.lock();
try {
ContractBalance balance;
String strAddress;
if (addUtxoList != null) {
for (Coin coin : addUtxoList) {
strAddress = asString(coin.getTempOwner());
balance = balanceMap.get(strAddress);
if (balance == null) {
balance = new ContractBalance();
balanceMap.put(strAddress, balance);
}
// 共识奖励的utxo
if (coin.getLockTime() != 0) {
balance.getConsensusRewardCoins().put(coin.getKey(), coin);
} else {
balance.addUsable(coin.getNa());
}
}
}
if (deleteUtxoList != null) {
for (Coin coin : deleteUtxoList) {
strAddress = asString(coin.getTempOwner());
balance = balanceMap.get(strAddress);
if (balance == null) {
balance = new ContractBalance();
balanceMap.put(strAddress, balance);
}
// 共识奖励的utxo
if (coin.getLockTime() != 0) {
balance.getConsensusRewardCoins().remove(coin.getKey());
} else {
balance.minusUsable(coin.getNa());
}
}
}
} finally {
lock.unlock();
}
}
use of io.nuls.kernel.model.Coin in project nuls by nuls-io.
the class ContractBalanceManager method depthClone.
private ContractBalance depthClone(ContractBalance contractBalance) {
if (contractBalance == null) {
return null;
}
LinkedHashMap<String, Coin> lockedCoins = contractBalance.getConsensusRewardCoins();
LinkedHashMap<String, Coin> lockedCoinsClone = MapUtil.createLinkedHashMap(lockedCoins.size());
Collection<Coin> values = lockedCoins.values();
for (Coin coin : values) {
lockedCoinsClone.put(coin.getKey(), coin);
}
ContractBalance result = new ContractBalance(Na.valueOf(contractBalance.getUsable().getValue()), Na.valueOf(contractBalance.getLocked().getValue()), Na.valueOf(contractBalance.getUsableConsensusReward().getValue()), lockedCoinsClone);
return result;
}
Aggregations