Search in sources :

Example 1 with CreateAgentTransaction

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();
}
Also used : Agent(io.nuls.consensus.poc.protocol.entity.Agent) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction) RedPunishTransaction(io.nuls.consensus.poc.protocol.tx.RedPunishTransaction) Transaction(io.nuls.kernel.model.Transaction) RedPunishTransaction(io.nuls.consensus.poc.protocol.tx.RedPunishTransaction) RedPunishData(io.nuls.consensus.poc.protocol.entity.RedPunishData) ValidateResult(io.nuls.kernel.validate.ValidateResult) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction) HashSet(java.util.HashSet)

Example 2 with CreateAgentTransaction

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;
}
Also used : Script(io.nuls.kernel.script.Script) Deposit(io.nuls.consensus.poc.protocol.entity.Deposit) DepositTransaction(io.nuls.consensus.poc.protocol.tx.DepositTransaction) VarInt(io.nuls.kernel.utils.VarInt) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction)

Example 3 with CreateAgentTransaction

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();
}
Also used : StopAgentTransaction(io.nuls.consensus.poc.protocol.tx.StopAgentTransaction) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction) RedPunishTransaction(io.nuls.consensus.poc.protocol.tx.RedPunishTransaction) Transaction(io.nuls.kernel.model.Transaction) RedPunishTransaction(io.nuls.consensus.poc.protocol.tx.RedPunishTransaction) ValidateResult(io.nuls.kernel.validate.ValidateResult) NulsDigestData(io.nuls.kernel.model.NulsDigestData) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction) StopAgentTransaction(io.nuls.consensus.poc.protocol.tx.StopAgentTransaction) HashSet(java.util.HashSet) AgentPo(io.nuls.consensus.poc.storage.po.AgentPo)

Example 4 with CreateAgentTransaction

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);
}
Also used : Agent(io.nuls.consensus.poc.protocol.entity.Agent) Deposit(io.nuls.consensus.poc.protocol.entity.Deposit) DepositTransaction(io.nuls.consensus.poc.protocol.tx.DepositTransaction) DepositTransaction(io.nuls.consensus.poc.protocol.tx.DepositTransaction) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction)

Example 5 with CreateAgentTransaction

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());
}
Also used : Agent(io.nuls.consensus.poc.protocol.entity.Agent) CreateAgentTxValidator(io.nuls.consensus.poc.tx.validator.CreateAgentTxValidator) ValidateResult(io.nuls.kernel.validate.ValidateResult) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction) ECKey(io.nuls.core.tools.crypto.ECKey) Test(org.junit.Test) BaseTest(io.nuls.consensus.poc.BaseTest)

Aggregations

CreateAgentTransaction (io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction)11 Agent (io.nuls.consensus.poc.protocol.entity.Agent)9 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)4 MultiSigAccount (io.nuls.account.model.MultiSigAccount)4 StopAgent (io.nuls.consensus.poc.protocol.entity.StopAgent)4 NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)4 Account (io.nuls.account.model.Account)3 Deposit (io.nuls.consensus.poc.protocol.entity.Deposit)3 DepositTransaction (io.nuls.consensus.poc.protocol.tx.DepositTransaction)3 ECKey (io.nuls.core.tools.crypto.ECKey)3 ValidateResult (io.nuls.kernel.validate.ValidateResult)3 RedPunishTransaction (io.nuls.consensus.poc.protocol.tx.RedPunishTransaction)2 Transaction (io.nuls.kernel.model.Transaction)2 HashSet (java.util.HashSet)2 BaseTest (io.nuls.consensus.poc.BaseTest)1 ChainContainer (io.nuls.consensus.poc.container.ChainContainer)1 RedPunishData (io.nuls.consensus.poc.protocol.entity.RedPunishData)1 StopAgentTransaction (io.nuls.consensus.poc.protocol.tx.StopAgentTransaction)1 AgentPo (io.nuls.consensus.poc.storage.po.AgentPo)1 CreateAgentTxValidator (io.nuls.consensus.poc.tx.validator.CreateAgentTxValidator)1