Search in sources :

Example 1 with AliasTransaction

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

the class AliasService method signMultiAliasTransaction.

/**
 * A transfers NULS to B   多签交易
 *
 * @param signAddr 签名地址
 * @param password password of A
 * @param txdata   需要签名的数据
 * @return Result
 */
public Result signMultiAliasTransaction(String signAddr, String password, String txdata) {
    try {
        Result<Account> accountResult = accountService.getAccount(signAddr);
        if (accountResult.isFailed()) {
            return accountResult;
        }
        Account account = accountResult.getData();
        if (account.isEncrypted() && account.isLocked()) {
            AssertUtil.canNotEmpty(password, "the password can not be empty");
            if (!account.validatePassword(password)) {
                return Result.getFailed(AccountErrorCode.PASSWORD_IS_WRONG);
            }
        }
        AliasTransaction tx = new AliasTransaction();
        TransactionSignature transactionSignature = new TransactionSignature();
        byte[] txByte = Hex.decode(txdata);
        tx.parse(new NulsByteBuffer(txByte));
        transactionSignature.parse(new NulsByteBuffer(tx.getTransactionSignature()));
        return accountLedgerService.txMultiProcess(tx, transactionSignature, account, password);
    } catch (NulsException e) {
        Log.error(e);
        return Result.getFailed(e.getErrorCode());
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
    }
}
Also used : Account(io.nuls.account.model.Account) MultiSigAccount(io.nuls.account.model.MultiSigAccount) AliasTransaction(io.nuls.account.tx.AliasTransaction) NulsException(io.nuls.kernel.exception.NulsException) IOException(java.io.IOException) NulsException(io.nuls.kernel.exception.NulsException) NulsByteBuffer(io.nuls.kernel.utils.NulsByteBuffer)

Example 2 with AliasTransaction

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

the class AccountResource method aliasFee.

@GET
@Path("/alias/fee")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("[别名手续费] 获取设置别名手续 ")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = RpcClientResult.class) })
public RpcClientResult aliasFee(@BeanParam() AccountAliasFeeForm form) {
    if (!AddressTool.validAddress(form.getAddress())) {
        return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
    }
    if (StringUtils.isBlank(form.getAlias())) {
        return Result.getFailed(AccountErrorCode.PARAMETER_ERROR).toRpcClientResult();
    }
    Result result = aliasService.getAliasFee(form.getAddress(), form.getAlias());
    Long fee = null;
    Long maxAmount = null;
    Map<String, Long> map = new HashMap<>();
    if (result.isSuccess()) {
        fee = ((Na) result.getData()).getValue();
        // 如果手续费大于理论最大值,则说明交易过大,需要计算最大交易金额
        long feeMax = TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES.multiply(TxMaxSizeValidator.MAX_TX_BYTES).getValue();
        if (fee > feeMax) {
            AliasTransaction tx = new AliasTransaction();
            tx.setTime(TimeService.currentTimeMillis());
            Alias alias = new Alias(AddressTool.getAddress(form.getAddress()), form.getAlias());
            tx.setTxData(alias);
            try {
                CoinDataResult coinDataResult = accountLedgerService.getCoinData(AddressTool.getAddress(form.getAddress()), AccountConstant.ALIAS_NA, tx.size(), TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
                if (!coinDataResult.isEnough()) {
                    return Result.getFailed(AccountErrorCode.INSUFFICIENT_BALANCE).toRpcClientResult();
                }
                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);
            } catch (Exception e) {
                Log.error(e);
                return Result.getFailed(KernelErrorCode.SYS_UNKOWN_EXCEPTION).toRpcClientResult();
            }
            Result rs = accountLedgerService.getMaxAmountOfOnce(AddressTool.getAddress(form.getAddress()), tx, TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
            if (rs.isSuccess()) {
                maxAmount = ((Na) rs.getData()).getValue();
            }
        }
        map.put("fee", fee);
        map.put("maxAmount", maxAmount);
        result.setData(map);
    }
    return result.toRpcClientResult();
}
Also used : AliasTransaction(io.nuls.account.tx.AliasTransaction) NulsException(io.nuls.kernel.exception.NulsException) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult)

Example 3 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 signAddr  Address of account
 * @param password  password of account
 * @param aliasName the alias to set
 * @return Result
 */
public Result<String> setMutilAlias(String addr, String signAddr, String aliasName, String password) {
    // 签名账户
    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 {
        byte[] addressBytes = AddressTool.getAddress(addr);
        Result<MultiSigAccount> sigAccountResult = accountService.getMultiSigAccount(addr);
        MultiSigAccount multiSigAccount = sigAccountResult.getData();
        if (!AddressTool.validSignAddress(multiSigAccount.getPubKeyList(), account.getPubKey())) {
            return Result.getFailed(AccountErrorCode.SIGN_ADDRESS_NOT_MATCH);
        }
        Script redeemScript = accountLedgerService.getRedeemScript(multiSigAccount);
        if (redeemScript == null) {
            return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
        }
        AliasTransaction tx = new AliasTransaction();
        TransactionSignature transactionSignature = new TransactionSignature();
        List<P2PHKSignature> p2PHKSignatures = new ArrayList<>();
        List<Script> scripts = new ArrayList<>();
        tx.setTime(TimeService.currentTimeMillis());
        Alias alias = new Alias(addressBytes, aliasName);
        tx.setTxData(alias);
        // 交易签名的长度为m*单个签名长度+赎回脚本长度
        int scriptSignLenth = redeemScript.getProgram().length + ((int) multiSigAccount.getM()) * 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);
        // 使用签名账户对交易进行签名
        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 : MultiSigAccount(io.nuls.account.model.MultiSigAccount) 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 4 with AliasTransaction

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

the class AccountResource method multiAliasFee.

@GET
@Path("multiAccount/alias/fee")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("[别名手续费] 获取设置别名手续 ")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = RpcClientResult.class) })
public RpcClientResult multiAliasFee(@BeanParam() MultiAliasFeeForm form) throws Exception {
    if (!AddressTool.validAddress(form.getAddress())) {
        return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
    }
    if (StringUtils.isBlank(form.getAlias())) {
        return Result.getFailed(AccountErrorCode.PARAMETER_ERROR).toRpcClientResult();
    }
    Result result = aliasService.getMultiAliasFee(form.getAddress(), form.getAlias());
    AliasTransaction tx = new AliasTransaction();
    tx.setTime(TimeService.currentTimeMillis());
    Result<MultiSigAccount> sigAccountResult = accountService.getMultiSigAccount(form.getAddress());
    MultiSigAccount multiSigAccount = sigAccountResult.getData();
    Script redeemScript = accountLedgerService.getRedeemScript(multiSigAccount);
    if (redeemScript == null) {
        return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST).toRpcClientResult();
    }
    Alias alias = new Alias(AddressTool.getAddress(form.getAddress()), form.getAlias());
    tx.setTxData(alias);
    try {
        CoinDataResult coinDataResult = accountLedgerService.getMutilCoinData(AddressTool.getAddress(form.getAddress()), AccountConstant.ALIAS_NA, tx.size(), TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
        if (!coinDataResult.isEnough()) {
            return Result.getFailed(AccountErrorCode.INSUFFICIENT_BALANCE).toRpcClientResult();
        }
        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);
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed(KernelErrorCode.SYS_UNKOWN_EXCEPTION).toRpcClientResult();
    }
    // 交易签名的长度为m*单个签名长度+赎回脚本长度
    int scriptSignLenth = redeemScript.getProgram().length + ((int) multiSigAccount.getM()) * 72;
    Result rs = accountLedgerService.getMultiMaxAmountOfOnce(AddressTool.getAddress(form.getAddress()), tx, TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES, scriptSignLenth);
    Map<String, Long> map = new HashMap<>();
    Long fee = null;
    Long maxAmount = null;
    if (result.isSuccess()) {
        fee = ((Na) result.getData()).getValue();
    }
    if (rs.isSuccess()) {
        maxAmount = ((Na) rs.getData()).getValue();
    }
    map.put("fee", fee);
    map.put("maxAmount", maxAmount);
    result.setData(map);
    return result.toRpcClientResult();
}
Also used : AliasTransaction(io.nuls.account.tx.AliasTransaction) Script(io.nuls.kernel.script.Script) NulsException(io.nuls.kernel.exception.NulsException) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult)

Example 5 with AliasTransaction

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

the class AliasService method getMultiAliasFee.

/**
 * 获取设置别名交易手续费
 * Gets to set the alias transaction fee
 *
 * @param address
 * @param aliasName
 * @return
 */
public Result<Na> getMultiAliasFee(String address, String aliasName) {
    if (!AddressTool.validAddress(address)) {
        Result.getFailed(AccountErrorCode.ADDRESS_ERROR);
    }
    byte[] addressBytes = AddressTool.getAddress(address);
    try {
        // 创建一笔设置别名的交易
        AliasTransaction tx = new AliasTransaction();
        tx.setTime(TimeService.currentTimeMillis());
        Alias alias = new Alias(addressBytes, aliasName);
        tx.setTxData(alias);
        CoinDataResult coinDataResult = accountLedgerService.getMutilCoinData(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 : 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)

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