use of io.nuls.contract.entity.tx.ContractTransaction 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;
}
Aggregations