Search in sources :

Example 16 with NulsByteBuffer

use of io.nuls.kernel.utils.NulsByteBuffer 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 17 with NulsByteBuffer

use of io.nuls.kernel.utils.NulsByteBuffer in project nuls by nuls-io.

the class MessageProcessor method analysisMessage.

private List<BaseMessage> analysisMessage(ByteBuf buffer) throws NulsException {
    List<BaseMessage> messageList;
    try {
        messageList = new ArrayList<>();
        byte[] bytes = new byte[buffer.readableBytes()];
        buffer.readBytes(bytes);
        NulsByteBuffer byteBuffer = new NulsByteBuffer(bytes);
        while (!byteBuffer.isFinished()) {
            MessageHeader header = byteBuffer.readNulsData(new MessageHeader());
            byteBuffer.setCursor(byteBuffer.getCursor() - header.size());
            BaseMessage message = getMessageBusService().getMessageInstance(header.getModuleId(), header.getMsgType()).getData();
            message = byteBuffer.readNulsData(message);
            messageList.add(message);
        }
    } catch (Exception e) {
        throw new NulsException(KernelErrorCode.DATA_ERROR, e);
    } finally {
        buffer.clear();
    }
    return messageList;
}
Also used : BaseMessage(io.nuls.protocol.message.base.BaseMessage) NulsException(io.nuls.kernel.exception.NulsException) MessageHeader(io.nuls.protocol.message.base.MessageHeader) NulsException(io.nuls.kernel.exception.NulsException) NulsByteBuffer(io.nuls.kernel.utils.NulsByteBuffer)

Aggregations

NulsByteBuffer (io.nuls.kernel.utils.NulsByteBuffer)17 NulsException (io.nuls.kernel.exception.NulsException)14 IOException (java.io.IOException)9 NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)5 Account (io.nuls.account.model.Account)4 MultiSigAccount (io.nuls.account.model.MultiSigAccount)4 Transaction (io.nuls.kernel.model.Transaction)3 ValidateResult (io.nuls.kernel.validate.ValidateResult)3 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)2 AliasPo (io.nuls.account.storage.po.AliasPo)2 AliasTransaction (io.nuls.account.tx.AliasTransaction)2 ECKey (io.nuls.core.tools.crypto.ECKey)2 VarInt (io.nuls.kernel.utils.VarInt)2 TransferTransaction (io.nuls.protocol.model.tx.TransferTransaction)2 UnsupportedEncodingException (java.io.UnsupportedEncodingException)2 ArrayList (java.util.ArrayList)2 MultipleAddressTransferModel (io.nuls.account.ledger.model.MultipleAddressTransferModel)1 TransactionDataResult (io.nuls.account.ledger.model.TransactionDataResult)1 UnconfirmedTxPo (io.nuls.account.ledger.storage.po.UnconfirmedTxPo)1 Alias (io.nuls.account.model.Alias)1