use of io.nuls.kernel.script.TransactionSignature in project nuls by nuls-io.
the class CancelDepositTxValidator method validate.
@Override
public ValidateResult validate(CancelDepositTransaction data) throws NulsException {
DepositPo depositPo = depositStorageService.get(data.getTxData().getJoinTxHash());
if (null == depositPo || depositPo.getDelHeight() > 0) {
return ValidateResult.getFailedResult(this.getClass().getName(), KernelErrorCode.DATA_NOT_FOUND);
}
TransactionSignature sig = new TransactionSignature();
try {
sig.parse(data.getTransactionSignature(), 0);
} catch (NulsException e) {
Log.error(e);
return ValidateResult.getFailedResult(this.getClass().getName(), e.getErrorCode());
}
if (!SignatureUtil.containsAddress(data, depositPo.getAddress())) {
ValidateResult result = ValidateResult.getFailedResult(this.getClass().getName(), KernelErrorCode.SIGNATURE_ERROR);
result.setLevel(SeverityLevelEnum.FLAGRANT_FOUL);
return result;
}
return ValidateResult.getSuccessResult();
}
use of io.nuls.kernel.script.TransactionSignature in project nuls by nuls-io.
the class DepositTxValidator method validate.
@Override
public ValidateResult validate(DepositTransaction tx) throws NulsException {
if (null == tx || null == tx.getTxData() || null == tx.getTxData().getAgentHash() || null == tx.getTxData().getDeposit() || null == tx.getTxData().getAddress()) {
return ValidateResult.getFailedResult(this.getClass().getName(), TransactionErrorCode.TX_DATA_VALIDATION_ERROR);
}
Deposit deposit = tx.getTxData();
AgentPo agentPo = agentStorageService.get(deposit.getAgentHash());
if (null == agentPo || agentPo.getDelHeight() > 0) {
return ValidateResult.getFailedResult(this.getClass().getName(), PocConsensusErrorCode.AGENT_NOT_EXIST);
}
List<DepositPo> poList = this.getDepositListByAgent(deposit.getAgentHash());
if (null != poList && poList.size() >= PocConsensusProtocolConstant.MAX_ACCEPT_NUM_OF_DEPOSIT) {
return ValidateResult.getFailedResult(this.getClass().getName(), PocConsensusErrorCode.DEPOSIT_OVER_COUNT);
}
Na limit = PocConsensusProtocolConstant.ENTRUSTER_DEPOSIT_LOWER_LIMIT;
Na max = PocConsensusProtocolConstant.SUM_OF_DEPOSIT_OF_AGENT_UPPER_LIMIT;
Na total = Na.ZERO;
for (DepositPo cd : poList) {
total = total.add(cd.getDeposit());
}
if (limit.isGreaterThan(deposit.getDeposit())) {
return ValidateResult.getFailedResult(this.getClass().getName(), PocConsensusErrorCode.DEPOSIT_NOT_ENOUGH);
}
if (max.isLessThan(total.add(deposit.getDeposit()))) {
return ValidateResult.getFailedResult(this.getClass().getName(), PocConsensusErrorCode.DEPOSIT_TOO_MUCH);
}
if (!isDepositOk(deposit.getDeposit(), tx.getCoinData())) {
return ValidateResult.getFailedResult(this.getClass().getName(), SeverityLevelEnum.FLAGRANT_FOUL, PocConsensusErrorCode.DEPOSIT_ERROR);
}
TransactionSignature sig = new TransactionSignature();
try {
sig.parse(tx.getTransactionSignature(), 0);
} catch (NulsException e) {
Log.error(e);
return ValidateResult.getFailedResult(this.getClass().getName(), e.getErrorCode());
}
if (!SignatureUtil.containsAddress(tx, deposit.getAddress())) {
ValidateResult result = ValidateResult.getFailedResult(this.getClass().getName(), KernelErrorCode.SIGNATURE_ERROR);
result.setLevel(SeverityLevelEnum.FLAGRANT_FOUL);
return result;
}
CoinData coinData = tx.getCoinData();
Set<String> addressSet = new HashSet<>();
int lockCount = 0;
for (Coin coin : coinData.getTo()) {
if (coin.getLockTime() == PocConsensusConstant.CONSENSUS_LOCK_TIME) {
lockCount++;
}
// addressSet.add(AddressTool.getStringAddressByBytes(coin.()));
addressSet.add(AddressTool.getStringAddressByBytes(coin.getAddress()));
}
if (lockCount > 1) {
return ValidateResult.getFailedResult(this.getClass().getName(), TransactionErrorCode.TX_DATA_VALIDATION_ERROR);
}
if (addressSet.size() > 1) {
return ValidateResult.getFailedResult(this.getClass().getName(), TransactionErrorCode.TX_DATA_VALIDATION_ERROR);
}
return ValidateResult.getSuccessResult();
}
use of io.nuls.kernel.script.TransactionSignature in project nuls by nuls-io.
the class Test method main.
public static void main(String[] args) {
String str = "2102ac3f8f73d6a0f23d9ecd797fb14f96e82a032bb972f1ee39b4bf443d07a5d55e004630440220668f5538cdbbd90e3dfc1ea1197ddb03cd8628dedfc77afad795140f3867560302202453d0991dc254ae2a5f40f915ef22e0c0e9ba315516d22eaa2e002fc9239147";
TransactionSignature signature = new TransactionSignature();
try {
signature.parse(str.getBytes(), 0);
} catch (NulsException e) {
Log.error(e);
}
signature.getP2PHKSignatures().forEach(p -> {
System.out.println(Arrays.toString(p.getPublicKey()));
});
}
use of io.nuls.kernel.script.TransactionSignature in project nuls by nuls-io.
the class AccountLedgerResource method getUnconfirmedTx.
/**
* 获取未确认的交易
*/
private Result getUnconfirmedTx(String hash) {
Result result = null;
try {
Result<Transaction> txResult = accountLedgerService.getUnconfirmedTransaction(NulsDigestData.fromDigestHex(hash));
if (txResult.isFailed() || null == txResult.getData()) {
result = Result.getFailed(TransactionErrorCode.TX_NOT_EXIST);
} else {
Transaction tx = txResult.getData();
tx.setStatus(TxStatusEnum.UNCONFIRM);
String fromAddress = null;
if (tx.getTransactionSignature() != null) {
TransactionSignature signature = new TransactionSignature();
signature.parse(new NulsByteBuffer(tx.getTransactionSignature()));
if (signature.getP2PHKSignatures() != null && signature.getP2PHKSignatures().size() == 1) {
byte[] addressBytes = AddressTool.getAddress(signature.getP2PHKSignatures().get(0).getPublicKey());
fromAddress = AddressTool.getStringAddressByBytes(addressBytes);
}
}
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) {
if (fromAddress != null) {
from.setFromAddress(fromAddress);
} else {
owner = from.getOwner();
// owner拆分出txHash和index
fromHash = AccountLegerUtils.getTxHashBytes(owner);
fromIndex = AccountLegerUtils.getIndex(owner);
// 查询from UTXO
fromHashObj = new NulsDigestData();
fromHashObj.parse(fromHash, 0);
// 获取上一笔的to,先查未确认,如果没有再查已确认
fromTx = accountLedgerService.getUnconfirmedTransaction(fromHashObj).getData();
if (null == fromTx) {
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) {
String txHash = hash;
OutputDto outputDto = null;
Coin to;
for (int i = 0, length = tos.size(); i < length; i++) {
to = tos.get(i);
outputDto = new OutputDto(to);
outputDto.setTxHash(txHash);
outputDto.setIndex(i);
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.script.TransactionSignature 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();
}
Aggregations