Search in sources :

Example 1 with LockNulsTransaction

use of io.nuls.ledger.entity.tx.LockNulsTransaction in project nuls by nuls-io.

the class UtxoCoinDataProvider method createByTransferData.

@Override
public CoinData createByTransferData(Transaction tx, CoinTransferData coinParam, String password) throws NulsException {
    UtxoData utxoData = new UtxoData();
    List<UtxoInput> inputs = new ArrayList<>();
    List<UtxoOutput> outputs = new ArrayList<>();
    if (coinParam.getTotalNa().equals(Na.ZERO)) {
        utxoData.setInputs(inputs);
        utxoData.setOutputs(outputs);
        return utxoData;
    }
    long inputValue = 0;
    if (!coinParam.getFrom().isEmpty()) {
        // find unSpends to create inputs for this tx
        Na totalFee = Na.ZERO;
        if (tx instanceof UnlockNulsTransaction) {
            totalFee = coinParam.getFee();
        } else {
            totalFee = coinParam.getTotalNa().add(coinParam.getFee());
        }
        List<UtxoOutput> unSpends = coinManager.getAccountsUnSpend(coinParam.getFrom(), totalFee);
        if (unSpends.isEmpty()) {
            throw new NulsException(ErrorCode.BALANCE_NOT_ENOUGH);
        }
        for (int i = 0; i < unSpends.size(); i++) {
            UtxoOutput output = unSpends.get(i);
            UtxoInput input = new UtxoInput();
            input.setFrom(output);
            input.setFromHash(output.getTxHash());
            input.setFromIndex(output.getIndex());
            input.setTxHash(tx.getHash());
            input.setIndex(i);
            inputValue += output.getValue();
            inputs.add(input);
        }
    }
    // get EcKey for output's script
    Account account = null;
    byte[] priKey = null;
    if (coinParam.getPriKey() != null) {
        priKey = coinParam.getPriKey();
    } else if (!coinParam.getFrom().isEmpty()) {
        account = accountService.getAccount(coinParam.getFrom().get(0));
        if (account == null) {
            throw new NulsException(ErrorCode.ACCOUNT_NOT_EXIST);
        }
        if (account.isEncrypted() && account.isLocked()) {
            if (!account.unlock(password)) {
                throw new NulsException(ErrorCode.PASSWORD_IS_WRONG);
            }
            priKey = account.getPriKey();
            account.lock();
        } else {
            priKey = account.getPriKey();
        }
    }
    // create outputs
    int i = 0;
    long outputValue = 0;
    for (Map.Entry<String, List<Coin>> entry : coinParam.getToMap().entrySet()) {
        String address = entry.getKey();
        List<Coin> coinList = entry.getValue();
        for (Coin coin : coinList) {
            UtxoOutput output = new UtxoOutput();
            output.setAddress(address);
            output.setValue(coin.getNa().getValue());
            if (output.getLockTime() > 0) {
                output.setStatus(OutPutStatusEnum.UTXO_UNCONFIRM_TIME_LOCK);
            } else if (tx instanceof LockNulsTransaction) {
                output.setStatus(OutPutStatusEnum.UTXO_UNCONFIRM_CONSENSUS_LOCK);
            } else {
                output.setStatus(OutPutStatusEnum.UTXO_UNCONFIRM_UNSPEND);
            }
            output.setIndex(i);
            P2PKHScript p2PKHScript = new P2PKHScript(new NulsDigestData(NulsDigestData.DIGEST_ALG_SHA160, new Address(address).getHash160()));
            output.setP2PKHScript(p2PKHScript);
            if (coin.getUnlockHeight() > 0) {
                output.setLockTime(coin.getUnlockHeight());
            } else if (coin.getUnlockTime() > 0) {
                output.setLockTime(coin.getUnlockTime());
            } else {
                output.setLockTime(0L);
            }
            output.setTxHash(tx.getHash());
            outputValue += output.getValue();
            outputs.add(output);
            i++;
        }
    }
    // the balance leave to myself
    long balance = inputValue - outputValue - coinParam.getFee().getValue();
    if (balance > 0) {
        UtxoOutput output = new UtxoOutput();
        // todo script
        output.setAddress(inputs.get(0).getFrom().getAddress());
        output.setValue(balance);
        output.setIndex(i);
        output.setTxHash(tx.getHash());
        output.setStatus(OutPutStatusEnum.UTXO_UNCONFIRM_UNSPEND);
        P2PKHScript p2PKHScript = new P2PKHScript(new NulsDigestData(NulsDigestData.DIGEST_ALG_SHA160, account.getHash160()));
        output.setP2PKHScript(p2PKHScript);
        outputs.add(output);
    }
    utxoData.setInputs(inputs);
    utxoData.setOutputs(outputs);
    return utxoData;
}
Also used : P2PKHScript(io.nuls.core.script.P2PKHScript) Account(io.nuls.account.entity.Account) Address(io.nuls.account.entity.Address) Coin(io.nuls.ledger.entity.params.Coin) LockNulsTransaction(io.nuls.ledger.entity.tx.LockNulsTransaction) Na(io.nuls.core.chain.entity.Na) NulsException(io.nuls.core.exception.NulsException) UnlockNulsTransaction(io.nuls.ledger.entity.tx.UnlockNulsTransaction) NulsDigestData(io.nuls.core.chain.entity.NulsDigestData)

Example 2 with LockNulsTransaction

use of io.nuls.ledger.entity.tx.LockNulsTransaction in project nuls by nuls-io.

the class UtxoLedgerServiceImpl method lock.

@Override
public Result lock(String address, String password, Na amount, long unlockTime, String remark) {
    LockNulsTransaction tx = null;
    try {
        CoinTransferData coinData = new CoinTransferData(OperationType.LOCK, amount, address, getTxFee(TransactionConstant.TX_TYPE_LOCK));
        coinData.addTo(address, new Coin(amount, unlockTime));
        tx = UtxoTransactionTool.getInstance().createLockNulsTx(coinData, password, remark);
        tx.verify();
        TransactionEvent event = new TransactionEvent();
        event.setEventBody(tx);
        eventBroadcaster.broadcastAndCacheAysn(event, true);
    } catch (Exception e) {
        Log.error(e);
        try {
            rollbackTx(tx);
        } catch (NulsException e1) {
            Log.error(e1);
        }
        return new Result(false, e.getMessage());
    }
    return new Result(true, "OK", tx.getHash().getDigestHex());
}
Also used : LockNulsTransaction(io.nuls.ledger.entity.tx.LockNulsTransaction) Coin(io.nuls.ledger.entity.params.Coin) TransactionEvent(io.nuls.ledger.event.TransactionEvent) CoinTransferData(io.nuls.ledger.entity.params.CoinTransferData) NulsException(io.nuls.core.exception.NulsException) NulsException(io.nuls.core.exception.NulsException) IOException(java.io.IOException) NulsRuntimeException(io.nuls.core.exception.NulsRuntimeException) ValidateResult(io.nuls.core.validate.ValidateResult)

Example 3 with LockNulsTransaction

use of io.nuls.ledger.entity.tx.LockNulsTransaction in project nuls by nuls-io.

the class UtxoTransactionTool method createLockNulsTx.

public LockNulsTransaction createLockNulsTx(CoinTransferData transferData, String password, String remark) throws Exception {
    LockNulsTransaction tx = new LockNulsTransaction(transferData, password);
    if (StringUtils.isNotBlank(remark)) {
        tx.setRemark(remark.getBytes(NulsContext.DEFAULT_ENCODING));
    }
    tx.setHash(NulsDigestData.calcDigestData(tx.serialize()));
    AccountService accountService = getAccountService();
    if (transferData.getFrom().isEmpty()) {
        throw new NulsRuntimeException(ErrorCode.DATA_ERROR);
    }
    Account account = accountService.getAccount(transferData.getFrom().get(0));
    tx.setScriptSig(accountService.createP2PKHScriptSigFromDigest(tx.getHash(), account, password).serialize());
    return tx;
}
Also used : LockNulsTransaction(io.nuls.ledger.entity.tx.LockNulsTransaction) Account(io.nuls.account.entity.Account) NulsRuntimeException(io.nuls.core.exception.NulsRuntimeException) AccountService(io.nuls.account.service.intf.AccountService)

Aggregations

LockNulsTransaction (io.nuls.ledger.entity.tx.LockNulsTransaction)3 Account (io.nuls.account.entity.Account)2 NulsException (io.nuls.core.exception.NulsException)2 NulsRuntimeException (io.nuls.core.exception.NulsRuntimeException)2 Coin (io.nuls.ledger.entity.params.Coin)2 Address (io.nuls.account.entity.Address)1 AccountService (io.nuls.account.service.intf.AccountService)1 Na (io.nuls.core.chain.entity.Na)1 NulsDigestData (io.nuls.core.chain.entity.NulsDigestData)1 P2PKHScript (io.nuls.core.script.P2PKHScript)1 ValidateResult (io.nuls.core.validate.ValidateResult)1 CoinTransferData (io.nuls.ledger.entity.params.CoinTransferData)1 UnlockNulsTransaction (io.nuls.ledger.entity.tx.UnlockNulsTransaction)1 TransactionEvent (io.nuls.ledger.event.TransactionEvent)1 IOException (java.io.IOException)1