Search in sources :

Example 6 with AliasTransaction

use of io.nuls.account.tx.AliasTransaction in project nuls by nuls-io.

the class AliasService method setMutilAlias.

/**
 * 多签账户设置别名
 * Initiate a transaction to set alias.
 *
 * @param addr      Address of account
 * @param password  password of account
 * @param aliasName the alias to set
 * @return txhash
 */
public Result<String> setMutilAlias(String addr, String signAddr, String aliasName, String password, List<String> pubKeys, int m, String txdata) {
    // 签名账户
    Account account = accountService.getAccount(signAddr).getData();
    if (null == account) {
        return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
    }
    if (account.isEncrypted() && account.isLocked()) {
        if (!account.validatePassword(password)) {
            return Result.getFailed(AccountErrorCode.PASSWORD_IS_WRONG);
        }
    }
    try {
        AliasTransaction tx = new AliasTransaction();
        TransactionSignature transactionSignature = new TransactionSignature();
        List<P2PHKSignature> p2PHKSignatures = new ArrayList<>();
        List<Script> scripts = new ArrayList<>();
        byte[] addressBytes = AddressTool.getAddress(addr);
        // 如果txdata为空则表示当前请求为多签发起者调用,需要创建交易
        if (txdata == null || txdata.trim().length() == 0) {
            if (!StringUtils.validAlias(aliasName)) {
                return Result.getFailed(AccountErrorCode.ALIAS_FORMAT_WRONG);
            }
            if (!isAliasUsable(aliasName)) {
                return Result.getFailed(AccountErrorCode.ALIAS_EXIST);
            }
            // 创建一笔设置别名的交易
            tx = new AliasTransaction();
            Script redeemScript = ScriptBuilder.createNulsRedeemScript(m, pubKeys);
            tx.setTime(TimeService.currentTimeMillis());
            Alias alias = new Alias(addressBytes, aliasName);
            tx.setTxData(alias);
            // 交易签名的长度为m*单个签名长度+赎回脚本长度
            int scriptSignLenth = redeemScript.getProgram().length + m * 72;
            CoinDataResult coinDataResult = accountLedgerService.getMutilCoinData(addressBytes, AccountConstant.ALIAS_NA, tx.size() + scriptSignLenth, TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
            if (!coinDataResult.isEnough()) {
                return Result.getFailed(AccountErrorCode.INSUFFICIENT_BALANCE);
            }
            CoinData coinData = new CoinData();
            coinData.setFrom(coinDataResult.getCoinList());
            Coin change = coinDataResult.getChange();
            if (null != change) {
                // 创建toList
                List<Coin> toList = new ArrayList<>();
                toList.add(change);
                coinData.setTo(toList);
            }
            Coin coin = new Coin(NulsConstant.BLACK_HOLE_ADDRESS, Na.parseNuls(1), 0);
            coinData.addTo(coin);
            tx.setCoinData(coinData);
            tx.setHash(NulsDigestData.calcDigestData(tx.serializeForHash()));
            // 将赎回脚本先存储在签名脚本中
            scripts.add(redeemScript);
            transactionSignature.setScripts(scripts);
        } else // 如果txdata不为空表示多签交易已经创建好了,将交易反序列化出来
        {
            byte[] txByte = Hex.decode(txdata);
            tx.parse(new NulsByteBuffer(txByte));
            transactionSignature.parse(new NulsByteBuffer(tx.getTransactionSignature()));
            p2PHKSignatures = transactionSignature.getP2PHKSignatures();
            scripts = transactionSignature.getScripts();
        }
        // 使用签名账户对交易进行签名
        P2PHKSignature p2PHKSignature = new P2PHKSignature();
        ECKey eckey = account.getEcKey(password);
        p2PHKSignature.setPublicKey(eckey.getPubKey());
        // 用当前交易的hash和账户的私钥账户
        p2PHKSignature.setSignData(accountService.signDigest(tx.getHash().getDigestBytes(), eckey));
        p2PHKSignatures.add(p2PHKSignature);
        Result result = txMutilProcessing(tx, p2PHKSignatures, scripts, transactionSignature, addressBytes);
        return result;
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed(KernelErrorCode.SYS_UNKOWN_EXCEPTION);
    }
}
Also used : Account(io.nuls.account.model.Account) MultiSigAccount(io.nuls.account.model.MultiSigAccount) AliasTransaction(io.nuls.account.tx.AliasTransaction) ArrayList(java.util.ArrayList) ECKey(io.nuls.core.tools.crypto.ECKey) IOException(java.io.IOException) NulsException(io.nuls.kernel.exception.NulsException) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) Alias(io.nuls.account.model.Alias) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) NulsByteBuffer(io.nuls.kernel.utils.NulsByteBuffer)

Example 7 with AliasTransaction

use of io.nuls.account.tx.AliasTransaction in project nuls by nuls-io.

the class AliasService method setAlias.

/**
 * 设置别名
 * Initiate a transaction to set alias.
 *
 * @param addr      Address of account
 * @param password  password of account
 * @param aliasName the alias to set
 * @return txhash
 */
public Result<String> setAlias(String addr, String aliasName, String password) {
    if (!AddressTool.validAddress(addr)) {
        return Result.getFailed(AccountErrorCode.ADDRESS_ERROR);
    }
    Account account = accountService.getAccount(addr).getData();
    if (null == account) {
        return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
    }
    if (account.isEncrypted() && account.isLocked()) {
        if (!account.validatePassword(password)) {
            return Result.getFailed(AccountErrorCode.PASSWORD_IS_WRONG);
        }
    }
    if (!account.isOk()) {
        return Result.getFailed(AccountErrorCode.IMPORTING_ACCOUNT);
    }
    if (StringUtils.isNotBlank(account.getAlias())) {
        return Result.getFailed(AccountErrorCode.ACCOUNT_ALREADY_SET_ALIAS);
    }
    if (!StringUtils.validAlias(aliasName)) {
        return Result.getFailed(AccountErrorCode.ALIAS_FORMAT_WRONG);
    }
    if (!isAliasUsable(aliasName)) {
        return Result.getFailed(AccountErrorCode.ALIAS_EXIST);
    }
    byte[] addressBytes = account.getAddress().getAddressBytes();
    try {
        // 创建一笔设置别名的交易
        AliasTransaction tx = new AliasTransaction();
        tx.setTime(TimeService.currentTimeMillis());
        Alias alias = new Alias(addressBytes, aliasName);
        tx.setTxData(alias);
        CoinDataResult coinDataResult = accountLedgerService.getCoinData(addressBytes, AccountConstant.ALIAS_NA, tx.size(), TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
        if (!coinDataResult.isEnough()) {
            return Result.getFailed(AccountErrorCode.INSUFFICIENT_BALANCE);
        }
        CoinData coinData = new CoinData();
        coinData.setFrom(coinDataResult.getCoinList());
        Coin change = coinDataResult.getChange();
        if (null != change) {
            // 创建toList
            List<Coin> toList = new ArrayList<>();
            toList.add(change);
            coinData.setTo(toList);
        }
        Coin coin = new Coin(NulsConstant.BLACK_HOLE_ADDRESS, AccountConstant.ALIAS_NA, 0);
        coinData.addTo(coin);
        tx.setCoinData(coinData);
        tx.setHash(NulsDigestData.calcDigestData(tx.serializeForHash()));
        // 生成签名
        List<ECKey> signEckeys = new ArrayList<>();
        List<ECKey> scriptEckeys = new ArrayList<>();
        ;
        ECKey eckey = account.getEcKey(password);
        // 如果最后一位为1则表示该交易包含普通签名
        if ((coinDataResult.getSignType() & 0x01) == 0x01) {
            signEckeys.add(eckey);
        }
        // 如果倒数第二位位为1则表示该交易包含脚本签名
        if ((coinDataResult.getSignType() & 0x02) == 0x02) {
            scriptEckeys.add(eckey);
        }
        SignatureUtil.createTransactionSignture(tx, scriptEckeys, signEckeys);
        Result saveResult = accountLedgerService.verifyAndSaveUnconfirmedTransaction(tx);
        if (saveResult.isFailed()) {
            if (KernelErrorCode.DATA_SIZE_ERROR.getCode().equals(saveResult.getErrorCode().getCode())) {
                // 重新算一次交易(不超出最大交易数据大小下)的最大金额
                Result rs = accountLedgerService.getMaxAmountOfOnce(account.getAddress().getAddressBytes(), tx, TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
                if (rs.isSuccess()) {
                    Na maxAmount = (Na) rs.getData();
                    rs = Result.getFailed(KernelErrorCode.DATA_SIZE_ERROR_EXTEND);
                    rs.setMsg(rs.getMsg() + maxAmount.toDouble());
                }
                return rs;
            }
            return saveResult;
        }
        this.transactionService.newTx(tx);
        Result sendResult = this.transactionService.broadcastTx(tx);
        if (sendResult.isFailed()) {
            accountLedgerService.deleteTransaction(tx);
            return sendResult;
        }
        String hash = tx.getHash().getDigestHex();
        return Result.getSuccess().setData(hash);
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed(KernelErrorCode.SYS_UNKOWN_EXCEPTION);
    }
}
Also used : Account(io.nuls.account.model.Account) MultiSigAccount(io.nuls.account.model.MultiSigAccount) AliasTransaction(io.nuls.account.tx.AliasTransaction) ArrayList(java.util.ArrayList) ECKey(io.nuls.core.tools.crypto.ECKey) IOException(java.io.IOException) NulsException(io.nuls.kernel.exception.NulsException) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) Alias(io.nuls.account.model.Alias) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult)

Example 8 with AliasTransaction

use of io.nuls.account.tx.AliasTransaction in project nuls by nuls-io.

the class AliasService method getAliasFee.

/**
 * 获取设置别名交易手续费
 * Gets to set the alias transaction fee
 *
 * @param address
 * @param aliasName
 * @return
 */
public Result<Na> getAliasFee(String address, String aliasName) {
    if (!AddressTool.validAddress(address)) {
        Result.getFailed(AccountErrorCode.ADDRESS_ERROR);
    }
    Account account = accountService.getAccount(address).getData();
    if (null == account) {
        return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
    }
    if (!account.isOk()) {
        return Result.getFailed(AccountErrorCode.IMPORTING_ACCOUNT);
    }
    byte[] addressBytes = account.getAddress().getAddressBytes();
    try {
        // 创建一笔设置别名的交易
        AliasTransaction tx = new AliasTransaction();
        tx.setTime(TimeService.currentTimeMillis());
        Alias alias = new Alias(addressBytes, aliasName);
        tx.setTxData(alias);
        CoinDataResult coinDataResult = accountLedgerService.getCoinData(addressBytes, AccountConstant.ALIAS_NA, tx.size(), TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
        if (!coinDataResult.isEnough()) {
            return Result.getFailed(AccountErrorCode.INSUFFICIENT_BALANCE);
        }
        CoinData coinData = new CoinData();
        coinData.setFrom(coinDataResult.getCoinList());
        Coin change = coinDataResult.getChange();
        if (null != change) {
            // 创建toList
            List<Coin> toList = new ArrayList<>();
            toList.add(change);
            coinData.setTo(toList);
        }
        Coin coin = new Coin(NulsConstant.BLACK_HOLE_ADDRESS, Na.parseNuls(1), 0);
        coinData.addTo(coin);
        tx.setCoinData(coinData);
        Na fee = TransactionFeeCalculator.getMaxFee(tx.size());
        return Result.getSuccess().setData(fee);
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed(KernelErrorCode.SYS_UNKOWN_EXCEPTION);
    }
}
Also used : Account(io.nuls.account.model.Account) MultiSigAccount(io.nuls.account.model.MultiSigAccount) AliasTransaction(io.nuls.account.tx.AliasTransaction) Alias(io.nuls.account.model.Alias) ArrayList(java.util.ArrayList) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) IOException(java.io.IOException) NulsException(io.nuls.kernel.exception.NulsException)

Example 9 with AliasTransaction

use of io.nuls.account.tx.AliasTransaction in project nuls by nuls-io.

the class AliasTxProcessor method conflictDetect.

/**
 * 冲突检测
 * 1.检测一个acount只能设置一个别名
 * 2.检查是否多个交易设置了同样的别名
 * conflictDetect
 * 1.Detecting an acount can only set one alias.
 * 2.Check if multiple aliasTransaction have the same alias.
 *
 * @param txList 需要检查的交易列表/A list of transactions to be checked.
 */
@Override
public ValidateResult conflictDetect(List<Transaction> txList) {
    if (null == txList || txList.isEmpty()) {
        return ValidateResult.getSuccessResult();
    }
    Set<String> aliasNames = new HashSet<>();
    Set<String> accountAddress = new HashSet<>();
    List<AliasPo> polist = this.aliasService.getAllAlias();
    for (AliasPo po : polist) {
        aliasNames.add(po.getAlias());
        accountAddress.add(Hex.encode(po.getAddress()));
    }
    for (Transaction transaction : txList) {
        if (transaction.getType() == AccountConstant.TX_TYPE_ACCOUNT_ALIAS) {
            AliasTransaction aliasTransaction = (AliasTransaction) transaction;
            Alias alias = aliasTransaction.getTxData();
            if (!aliasNames.add(alias.getAlias())) {
                return (ValidateResult) ValidateResult.getFailedResult(getClass().getName(), AccountErrorCode.ALIAS_CONFLICT).setData(aliasTransaction);
            }
            if (!accountAddress.add(Hex.encode(alias.getAddress()))) {
                return (ValidateResult) ValidateResult.getFailedResult(getClass().getName(), AccountErrorCode.ACCOUNT_ALREADY_SET_ALIAS).setData(aliasTransaction);
            }
        }
    }
    return ValidateResult.getSuccessResult();
}
Also used : AliasTransaction(io.nuls.account.tx.AliasTransaction) Transaction(io.nuls.kernel.model.Transaction) AliasTransaction(io.nuls.account.tx.AliasTransaction) Alias(io.nuls.account.model.Alias) ValidateResult(io.nuls.kernel.validate.ValidateResult) AliasPo(io.nuls.account.storage.po.AliasPo) HashSet(java.util.HashSet)

Aggregations

AliasTransaction (io.nuls.account.tx.AliasTransaction)9 NulsException (io.nuls.kernel.exception.NulsException)8 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)7 Alias (io.nuls.account.model.Alias)6 IOException (java.io.IOException)6 Account (io.nuls.account.model.Account)5 MultiSigAccount (io.nuls.account.model.MultiSigAccount)5 ArrayList (java.util.ArrayList)5 ECKey (io.nuls.core.tools.crypto.ECKey)3 NulsByteBuffer (io.nuls.kernel.utils.NulsByteBuffer)2 AliasPo (io.nuls.account.storage.po.AliasPo)1 Transaction (io.nuls.kernel.model.Transaction)1 Script (io.nuls.kernel.script.Script)1 ValidateResult (io.nuls.kernel.validate.ValidateResult)1 HashSet (java.util.HashSet)1