use of io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction in project nuls by nuls-io.
the class CreateAgentTxProcessor method conflictDetect.
@Override
public ValidateResult conflictDetect(List<Transaction> txList) {
// 冲突检测,检测委托人和打包人是否重复
if (null == txList || txList.isEmpty()) {
return ValidateResult.getSuccessResult();
}
Set<String> addressSet = new HashSet<>();
List<Agent> agentList = PocConsensusContext.getChainManager().getMasterChain().getChain().getAgentList();
for (Agent agent : agentList) {
if (agent.getDelHeight() > 0) {
continue;
}
if (agent.getBlockHeight() == txList.get(0).getBlockHeight()) {
continue;
}
addressSet.add(agent.getAgentAddressStr());
addressSet.add(agent.getPackingAddressStr());
}
for (Transaction transaction : txList) {
if (transaction.getType() == ConsensusConstant.TX_TYPE_REGISTER_AGENT) {
CreateAgentTransaction createAgentTransaction = (CreateAgentTransaction) transaction;
Agent agent = createAgentTransaction.getTxData();
if (!addressSet.add(agent.getPackingAddressStr()) || !addressSet.add(agent.getAgentAddressStr())) {
return (ValidateResult) ValidateResult.getFailedResult(getClass().getName(), PocConsensusErrorCode.AGENT_EXIST).setData(transaction);
}
} else if (transaction.getType() == ConsensusConstant.TX_TYPE_RED_PUNISH) {
RedPunishTransaction redPunishTransaction = (RedPunishTransaction) transaction;
RedPunishData redPunishData = redPunishTransaction.getTxData();
String address = AddressTool.getStringAddressByBytes(redPunishData.getAddress());
if (!addressSet.add(address)) {
return (ValidateResult) ValidateResult.getFailedResult(getClass().getName(), PocConsensusErrorCode.LACK_OF_CREDIT).setData(transaction);
}
}
}
return ValidateResult.getSuccessResult();
}
use of io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction in project nuls by nuls-io.
the class ConsensusTool method getStopAgentCoinData.
public static CoinData getStopAgentCoinData(Agent agent, long lockTime, Long hight) throws IOException {
if (null == agent) {
return null;
}
NulsDigestData createTxHash = agent.getTxHash();
CoinData coinData = new CoinData();
List<Coin> toList = new ArrayList<>();
if (agent.getAgentAddress()[2] == NulsContext.P2SH_ADDRESS_TYPE) {
Script scriptPubkey = SignatureUtil.createOutputScript(agent.getAgentAddress());
toList.add(new Coin(scriptPubkey.getProgram(), agent.getDeposit(), lockTime));
} else {
toList.add(new Coin(agent.getAgentAddress(), agent.getDeposit(), lockTime));
}
coinData.setTo(toList);
CreateAgentTransaction transaction = (CreateAgentTransaction) ledgerService.getTx(createTxHash);
if (null == transaction) {
throw new NulsRuntimeException(TransactionErrorCode.TX_NOT_EXIST);
}
List<Coin> fromList = new ArrayList<>();
for (int index = 0; index < transaction.getCoinData().getTo().size(); index++) {
Coin coin = transaction.getCoinData().getTo().get(index);
if (coin.getNa().equals(agent.getDeposit()) && coin.getLockTime() == -1L) {
coin.setOwner(ArraysTool.concatenate(transaction.getHash().serialize(), new VarInt(index).encode()));
fromList.add(coin);
break;
}
}
if (fromList.isEmpty()) {
throw new NulsRuntimeException(KernelErrorCode.DATA_ERROR);
}
coinData.setFrom(fromList);
List<Deposit> deposits = PocConsensusContext.getChainManager().getMasterChain().getChain().getDepositList();
List<String> addressList = new ArrayList<>();
Map<String, Coin> toMap = new HashMap<>();
long blockHeight = null == hight ? -1 : hight;
for (Deposit deposit : deposits) {
if (deposit.getDelHeight() > 0 && (blockHeight <= 0 || deposit.getDelHeight() < blockHeight)) {
continue;
}
if (!deposit.getAgentHash().equals(agent.getTxHash())) {
continue;
}
DepositTransaction dtx = (DepositTransaction) ledgerService.getTx(deposit.getTxHash());
Coin fromCoin = null;
for (Coin coin : dtx.getCoinData().getTo()) {
if (!coin.getNa().equals(deposit.getDeposit()) || coin.getLockTime() != -1L) {
continue;
}
fromCoin = new Coin(ArraysTool.concatenate(dtx.getHash().serialize(), new VarInt(0).encode()), coin.getNa(), coin.getLockTime());
fromCoin.setLockTime(-1L);
fromList.add(fromCoin);
break;
}
String address = AddressTool.getStringAddressByBytes(deposit.getAddress());
Coin coin = toMap.get(address);
if (null == coin) {
if (deposit.getAddress()[2] == NulsContext.P2SH_ADDRESS_TYPE) {
Script scriptPubkey = SignatureUtil.createOutputScript(deposit.getAddress());
coin = new Coin(scriptPubkey.getProgram(), deposit.getDeposit(), 0);
} else {
coin = new Coin(deposit.getAddress(), deposit.getDeposit(), 0);
}
addressList.add(address);
toMap.put(address, coin);
} else {
coin.setNa(coin.getNa().add(fromCoin.getNa()));
}
}
for (String address : addressList) {
coinData.getTo().add(toMap.get(address));
}
return coinData;
}
use of io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction in project nuls by nuls-io.
the class StopAgentTxProcessor method conflictDetect.
@Override
public ValidateResult conflictDetect(List<Transaction> txList) {
if (txList == null || txList.isEmpty()) {
return ValidateResult.getSuccessResult();
}
Set<NulsDigestData> hashSet = new HashSet<>();
Set<String> addressSet = new HashSet<>();
for (Transaction tx : txList) {
if (tx.getType() == ConsensusConstant.TX_TYPE_RED_PUNISH) {
RedPunishTransaction transaction = (RedPunishTransaction) tx;
addressSet.add(AddressTool.getStringAddressByBytes(transaction.getTxData().getAddress()));
}
}
for (Transaction tx : txList) {
if (tx.getType() == ConsensusConstant.TX_TYPE_STOP_AGENT) {
StopAgentTransaction transaction = (StopAgentTransaction) tx;
if (!hashSet.add(transaction.getTxData().getCreateTxHash())) {
ValidateResult result = ValidateResult.getFailedResult(this.getClass().getName(), TransactionErrorCode.TRANSACTION_REPEATED);
result.setData(transaction);
return result;
}
if (transaction.getTxData().getAddress() == null) {
CreateAgentTransaction agentTransaction = (CreateAgentTransaction) ledgerService.getTx(transaction.getTxData().getCreateTxHash());
if (null == agentTransaction) {
ValidateResult result = ValidateResult.getFailedResult(this.getClass().getName(), PocConsensusErrorCode.AGENT_NOT_EXIST);
result.setData(transaction);
return result;
}
transaction.getTxData().setAddress(agentTransaction.getTxData().getAgentAddress());
}
AgentPo po = agentStorageService.get(transaction.getTxData().getCreateTxHash());
if (null == po || po.getDelHeight() > 0) {
ValidateResult result = ValidateResult.getFailedResult(this.getClass().getName(), PocConsensusErrorCode.AGENT_STOPPED);
result.setData(transaction);
return result;
}
if (addressSet.contains(AddressTool.getStringAddressByBytes(transaction.getTxData().getAddress()))) {
ValidateResult result = ValidateResult.getFailedResult(this.getClass().getName(), PocConsensusErrorCode.AGENT_STOPPED);
result.setData(transaction);
return result;
}
}
}
return ValidateResult.getSuccessResult();
}
use of io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction in project nuls by nuls-io.
the class ChainContainerTest method addTx.
protected void addTx(Block block) {
BlockHeader blockHeader = block.getHeader();
List<Transaction> txs = block.getTxs();
Transaction<Agent> agentTx = new CreateAgentTransaction();
Agent agent = new Agent();
agent.setPackingAddress(AddressTool.getAddress(ecKey.getPubKey()));
agent.setAgentAddress(AddressTool.getAddress(ecKey.getPubKey()));
agent.setTime(System.currentTimeMillis());
agent.setDeposit(Na.NA.multiply(20000));
agent.setCommissionRate(0.3d);
agent.setBlockHeight(blockHeader.getHeight());
agentTx.setTxData(agent);
agentTx.setTime(agent.getTime());
agentTx.setBlockHeight(blockHeader.getHeight());
NulsSignData signData = signDigest(agentTx.getHash().getDigestBytes(), ecKey);
agentTx.setTransactionSignature(signData.getSignBytes());
// add the agent tx into agent list
txs.add(agentTx);
// new a deposit
Deposit deposit = new Deposit();
deposit.setAddress(AddressTool.getAddress(ecKey.getPubKey()));
deposit.setAgentHash(agentTx.getHash());
deposit.setTime(System.currentTimeMillis());
deposit.setDeposit(Na.NA.multiply(200000));
deposit.setBlockHeight(blockHeader.getHeight());
DepositTransaction depositTx = new DepositTransaction();
depositTx.setTime(deposit.getTime());
depositTx.setTxData(deposit);
depositTx.setBlockHeight(blockHeader.getHeight());
txs.add(depositTx);
}
use of io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction in project nuls by nuls-io.
the class CreateAgentTxValidatorTest method test.
@Test
public void test() {
CreateAgentTransaction tx = new CreateAgentTransaction();
CreateAgentTxValidator validator = new CreateAgentTxValidator();
ValidateResult result = validator.validate(tx);
assertFalse(result.isSuccess());
Agent agent = new Agent();
tx.setTxData(agent);
result = validator.validate(tx);
assertFalse(result.isSuccess());
byte[] address = AddressTool.getAddress(ecKey.getPubKey());
byte[] address1 = AddressTool.getAddress(new ECKey().getPubKey());
byte[] address2 = AddressTool.getAddress(new ECKey().getPubKey());
agent.setRewardAddress(address);
agent.setPackingAddress(address1);
agent.setAgentAddress(address2);
result = validator.validate(tx);
assertFalse(result.isSuccess());
agent.setDeposit(PocConsensusProtocolConstant.AGENT_DEPOSIT_LOWER_LIMIT);
tx.setTime(System.currentTimeMillis());
result = validator.validate(tx);
assertTrue(result.isSuccess());
}
Aggregations