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();
}
}
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;
}
Aggregations