Search in sources :

Example 1 with ByteArrayWrapper

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

the class CallContractTransaction method getAllRelativeAddress.

@Override
public List<byte[]> getAllRelativeAddress() {
    if (contractResult == null && contractService != null) {
        contractResult = contractService.getContractExecuteResult(this.hash);
    }
    if (contractResult != null) {
        List<byte[]> relativeAddress = super.getAllRelativeAddress();
        if (relativeAddress == null) {
            return new ArrayList<>();
        }
        if (relativeAddress.size() == 0) {
            return relativeAddress;
        }
        HashSet<ByteArrayWrapper> addressesSet = MapUtil.createHashSet(relativeAddress.size());
        relativeAddress.stream().forEach(address -> addressesSet.add(new ByteArrayWrapper(address)));
        // 合约转账(从合约转出)
        List<ContractTransfer> transfers = contractResult.getTransfers();
        if (transfers != null && transfers.size() > 0) {
            for (ContractTransfer transfer : transfers) {
                addressesSet.add(new ByteArrayWrapper(transfer.getFrom()));
                addressesSet.add(new ByteArrayWrapper(transfer.getTo()));
            }
        }
        // 解析合约事件中的合约地址
        List<byte[]> parseEventContractList = this.parseEventContract(contractResult.getEvents());
        for (byte[] contract : parseEventContractList) {
            addressesSet.add(new ByteArrayWrapper(contract));
        }
        List<byte[]> resultList = new ArrayList<>();
        for (ByteArrayWrapper wrapper : addressesSet) {
            resultList.add(wrapper.getBytes());
        }
        return resultList;
    } else {
        return super.getAllRelativeAddress();
    }
}
Also used : ByteArrayWrapper(io.nuls.kernel.utils.ByteArrayWrapper) ContractTransfer(io.nuls.contract.dto.ContractTransfer)

Example 2 with ByteArrayWrapper

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

the class ConsensusTool method returnContractSenderNa.

private static List<Coin> returnContractSenderNa(List<Transaction> txList, long unlockHeight) {
    // 去重, 可能存在同一个sender发出的几笔合约交易,需要把退还的GasNa累加到一起
    Map<ByteArrayWrapper, Na> returnMap = new HashMap<>();
    List<Coin> returnList = new ArrayList<>();
    if (txList != null && txList.size() > 0) {
        int txType;
        for (Transaction tx : txList) {
            txType = tx.getType();
            if (txType == ContractConstant.TX_TYPE_CREATE_CONTRACT || txType == ContractConstant.TX_TYPE_CALL_CONTRACT || txType == ContractConstant.TX_TYPE_DELETE_CONTRACT) {
                ContractTransaction contractTx = (ContractTransaction) tx;
                ContractResult contractResult = contractTx.getContractResult();
                if (contractResult == null) {
                    contractResult = contractService.getContractExecuteResult(tx.getHash());
                    if (contractResult == null) {
                        Log.error("get contract tx contractResult error: " + tx.getHash().getDigestHex());
                        continue;
                    }
                }
                contractTx.setContractResult(contractResult);
                // 终止合约不消耗Gas,跳过
                if (txType == ContractConstant.TX_TYPE_DELETE_CONTRACT) {
                    continue;
                }
                // 减差额作为退还Gas
                ContractData contractData = (ContractData) tx.getTxData();
                long realGasUsed = contractResult.getGasUsed();
                long txGasUsed = contractData.getGasLimit();
                long returnGas = 0;
                Na returnNa = Na.ZERO;
                if (txGasUsed > realGasUsed) {
                    returnGas = txGasUsed - realGasUsed;
                    returnNa = Na.valueOf(LongUtils.mul(returnGas, contractData.getPrice()));
                    // 用于计算本次矿工共识奖励 -> 需扣除退还给sender的Gas部分, Call,Create,DeleteContractTransaction 覆写getFee方法来处理
                    contractTx.setReturnNa(returnNa);
                    ByteArrayWrapper sender = new ByteArrayWrapper(contractData.getSender());
                    Na senderNa = returnMap.get(sender);
                    if (senderNa == null) {
                        senderNa = Na.ZERO.add(returnNa);
                    } else {
                        senderNa = senderNa.add(returnNa);
                    }
                    returnMap.put(sender, senderNa);
                }
            }
        }
        Set<Map.Entry<ByteArrayWrapper, Na>> entries = returnMap.entrySet();
        Coin returnCoin;
        for (Map.Entry<ByteArrayWrapper, Na> entry : entries) {
            returnCoin = new Coin(entry.getKey().getBytes(), entry.getValue(), unlockHeight);
            returnList.add(returnCoin);
        }
    }
    return returnList;
}
Also used : ContractResult(io.nuls.contract.dto.ContractResult) ContractTransaction(io.nuls.contract.entity.tx.ContractTransaction) ContractData(io.nuls.contract.entity.txdata.ContractData) ByteArrayWrapper(io.nuls.kernel.utils.ByteArrayWrapper) DepositTransaction(io.nuls.consensus.poc.protocol.tx.DepositTransaction) YellowPunishTransaction(io.nuls.consensus.poc.protocol.tx.YellowPunishTransaction) CreateAgentTransaction(io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction) ContractTransaction(io.nuls.contract.entity.tx.ContractTransaction) CoinBaseTransaction(io.nuls.protocol.model.tx.CoinBaseTransaction)

Aggregations

ByteArrayWrapper (io.nuls.kernel.utils.ByteArrayWrapper)2 CreateAgentTransaction (io.nuls.consensus.poc.protocol.tx.CreateAgentTransaction)1 DepositTransaction (io.nuls.consensus.poc.protocol.tx.DepositTransaction)1 YellowPunishTransaction (io.nuls.consensus.poc.protocol.tx.YellowPunishTransaction)1 ContractResult (io.nuls.contract.dto.ContractResult)1 ContractTransfer (io.nuls.contract.dto.ContractTransfer)1 ContractTransaction (io.nuls.contract.entity.tx.ContractTransaction)1 ContractData (io.nuls.contract.entity.txdata.ContractData)1 CoinBaseTransaction (io.nuls.protocol.model.tx.CoinBaseTransaction)1