use of io.nuls.kernel.exception.NulsException in project nuls by nuls-io.
the class ContractSdkResource method createContractTx.
@POST
@Path("/sdk/create")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "create contact transaction")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success") })
public RpcClientResult createContractTx(@ApiParam(name = "createForm", value = "create contact transaction", required = true) CreateContractTx createContractTx) {
if (!AddressTool.validAddress(createContractTx.getSender())) {
return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
}
if (createContractTx.getGasLimit() < 0 || createContractTx.getPrice() < 0) {
return Result.getFailed(ContractErrorCode.PARAMETER_ERROR).toRpcClientResult();
}
if (createContractTx.getUtxos().isEmpty()) {
// utxo not null and size not zero.
return Result.getFailed(AccountErrorCode.DATA_PARSE_ERROR).toRpcClientResult();
}
Long gasLimit = createContractTx.getGasLimit();
Long price = createContractTx.getPrice();
Na value = Na.ZERO;
long totalGas = LongUtils.mul(gasLimit, price);
Na totalNa = Na.valueOf(totalGas);
byte[] senderBytes = AddressTool.getAddress(createContractTx.getSender());
/**
* first create a new contract address.
*/
Address contractAddress = null;
try {
contractAddress = AccountTool.createContractAddress();
} catch (NulsException e) {
Log.error(e);
return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
}
byte[] contractAddressBytes = contractAddress.getAddressBytes();
// 组装txData
String contractCode = createContractTx.getContractCode();
byte[] contractCodeBytes = Hex.decode(contractCode);
CreateContractData txData = new CreateContractData();
txData.setSender(senderBytes);
txData.setContractAddress(contractAddressBytes);
txData.setValue(value.getValue());
txData.setGasLimit(gasLimit);
txData.setPrice(price);
txData.setCodeLen(contractCodeBytes.length);
txData.setCode(contractCodeBytes);
Object[] args = createContractTx.getArgs();
if (args != null) {
txData.setArgsCount((byte) args.length);
if (args.length > 0) {
txData.setArgs(ContractUtil.twoDimensionalArray(args));
}
}
/**
* create create contract tx data
*/
CreateContractTransaction tx = new CreateContractTransaction();
String remark = createContractTx.getRemark();
if (StringUtils.isNotBlank(remark)) {
try {
tx.setRemark(remark.getBytes(NulsConfig.DEFAULT_ENCODING));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
tx.setTime(TimeService.currentTimeMillis());
tx.setTxData(txData);
List<Coin> coinList = ConvertCoinTool.convertCoinList(createContractTx.getUtxos());
CoinDataResult coinDataResult = CoinDataTool.getCoinData(senderBytes, totalNa, tx.size(), TransactionFeeCalculator.MIN_PRICE_PRE_1024_BYTES, coinList);
if (!coinDataResult.isEnough()) {
return RpcClientResult.getFailed(TransactionErrorCode.INSUFFICIENT_BALANCE);
}
/**
* build coin data
*/
CoinData coinData = new CoinData();
coinData.setFrom(coinDataResult.getCoinList());
if (coinDataResult.getChange() != null) {
coinData.getTo().add(coinDataResult.getChange());
}
tx.setCoinData(coinData);
// 重置为0,重新计算交易对象的size
tx.setSize(0);
if (tx.getSize() > TxMaxSizeValidator.MAX_TX_SIZE) {
return Result.getFailed(TransactionErrorCode.DATA_SIZE_ERROR).toRpcClientResult();
}
return this.buildReturnInfo(tx, AddressTool.getStringAddressByBytes(contractAddressBytes));
}
use of io.nuls.kernel.exception.NulsException in project nuls by nuls-io.
the class BlockServiceImpl method saveBlock.
/**
* 保存区块到存储中
* Save the block to the store.
*
* @param block 完整区块/whole block
* @return 操作结果/operating result
* @throws NulsException 保存区块有可能出现异常,请捕获后谨慎处理/There may be exceptions to the save block, please handle it carefully after capture.
*/
@Override
public Result saveBlock(Block block) throws NulsException {
if (null == block || block.getHeader() == null || block.getTxs() == null) {
return Result.getFailed(ProtocolErroeCode.BLOCK_IS_NULL);
}
long height = block.getHeader().getHeight();
List<Transaction> savedList = new ArrayList<>();
for (Transaction transaction : block.getTxs()) {
transaction.setBlockHeight(height);
boolean needRollback = false;
Result result = transactionService.commitTx(transaction, block.getHeader());
if (result.isSuccess()) {
result = ledgerService.saveTx(transaction);
} else {
needRollback = true;
}
if (result.isSuccess()) {
savedList.add(transaction);
} else {
if (needRollback) {
this.transactionService.rollbackCommit(transaction, block.getHeader());
}
this.rollbackTxList(savedList, block.getHeader(), false);
return result;
}
}
Result result = this.blockHeaderStorageService.saveBlockHeader(PoConvertUtil.toBlockHeaderPo(block));
if (result.isFailed()) {
this.rollbackTxList(savedList, block.getHeader(), false);
return result;
}
try {
accountLedgerService.saveConfirmedTransactionList(block.getTxs());
// 保存合约相关交易
contractService.saveConfirmedTransactionList(block.getTxs());
} catch (Exception e) {
Log.warn("save local tx failed", e);
}
return Result.getSuccess();
}
use of io.nuls.kernel.exception.NulsException in project nuls by nuls-io.
the class BlockHeaderStorageServiceImpl method getBlockHeaderPo.
/**
* 根据区块hash查询区块头数据
* Query block header data according to block hash.
*
* @param hashBytes 区块头摘要/block hash
* @return BlockHeaderPo 区块头数据
*/
private BlockHeaderPo getBlockHeaderPo(byte[] hashBytes) {
byte[] bytes = dbService.get(ProtocolStorageConstant.DB_NAME_BLOCK_HEADER, hashBytes);
if (null == bytes) {
return null;
}
BlockHeaderPo po = new BlockHeaderPo();
try {
po.parse(bytes, 0);
} catch (NulsException e) {
Log.error(e);
}
NulsDigestData hash = new NulsDigestData();
try {
hash.parse(hashBytes, 0);
} catch (NulsException e) {
Log.error(e);
}
po.setHash(hash);
return po;
}
use of io.nuls.kernel.exception.NulsException in project nuls by nuls-io.
the class TransactionServiceImplTest method initTxList.
private void initTxList() {
List<Transaction> list = new ArrayList<>();
ECKey ecKey1 = new ECKey();
ECKey ecKey2 = new ECKey();
ECKey ecKey3 = new ECKey();
ECKey ecKey4 = new ECKey();
ECKey ecKey5 = new ECKey();
ECKey ecKey6 = new ECKey();
Transaction tx = createCoinBaseTransaction(ecKey1, ecKey2, ecKey3, ecKey4, ecKey5, ecKey6);
list.add(tx);
Transaction yellowPunishTx = createYellowPunishTx(ecKey1, ecKey2, ecKey3, ecKey4, ecKey5, ecKey6);
list.add(yellowPunishTx);
// RedPunishTransaction redPunishTransaction = createRedPunishTx(ecKey1, ecKey4, ecKey5, ecKey6);
// list.add(redPunishTransaction);
TransferTransaction transferTransaction1 = createTransferTransaction(ecKey1, null, ecKey2, Na.ZERO);
TransferTransaction transferTransaction2 = createTransferTransaction(ecKey1, null, ecKey3, Na.ZERO);
list.add(transferTransaction1);
list.add(transferTransaction2);
createSetAliasTransaction(ecKey1, "alias");
// createSetAliasTransaction(ecKey1, "alias1");
// createSetAliasTransaction(ecKey2, "alias");
CreateAgentTransaction tx1 = createRegisterAgentTransaction(ecKey1, ecKey2, "agentName");
CreateAgentTransaction tx2 = createRegisterAgentTransaction(ecKey2, ecKey3, "agentName");
CreateAgentTransaction tx3 = createRegisterAgentTransaction(ecKey4, ecKey5, "agentName2");
CreateAgentTransaction tx4 = createRegisterAgentTransaction(ecKey1, ecKey3, "agentName3");
list.add(tx1);
list.add(tx2);
list.add(tx3);
list.add(tx4);
DepositTransaction join1 = createDepositTransaction(ecKey1, tx1.getHash(), Na.parseNuls(200000));
DepositTransaction join2 = createDepositTransaction(ecKey1, tx2.getHash(), Na.parseNuls(200000));
DepositTransaction join3 = createDepositTransaction(ecKey1, tx3.getHash(), Na.parseNuls(200000));
DepositTransaction join4 = createDepositTransaction(ecKey1, tx4.getHash(), Na.parseNuls(200000));
DepositTransaction join5 = createDepositTransaction(ecKey1, tx3.getHash(), Na.parseNuls(200000));
DepositTransaction join6 = createDepositTransaction(ecKey1, tx3.getHash(), Na.parseNuls(200000));
DepositTransaction join7 = createDepositTransaction(ecKey1, tx3.getHash(), Na.parseNuls(200000));
list.add(join1);
list.add(join3);
list.add(join2);
list.add(join4);
list.add(join5);
list.add(join6);
list.add(join7);
try {
createCancelDepositTransaction(ecKey1, NulsDigestData.fromDigestHex("txHash"));
} catch (NulsException e) {
Log.error(e);
}
StopAgentTransaction stop1 = createStopAgentTransaction(ecKey1, tx1.getHash());
StopAgentTransaction stop2 = createStopAgentTransaction(ecKey1, tx2.getHash());
StopAgentTransaction stop3 = createStopAgentTransaction(ecKey4, tx3.getHash());
StopAgentTransaction stop4 = createStopAgentTransaction(ecKey1, tx4.getHash());
list.add(stop1);
list.add(stop2);
list.add(stop3);
list.add(stop4);
this.allList = list;
}
use of io.nuls.kernel.exception.NulsException in project nuls by nuls-io.
the class ContractBalanceManager method getCoinListByAddress.
public List<Coin> getCoinListByAddress(byte[] address) {
List<Coin> coinList = new ArrayList<>();
List<Entry<byte[], byte[]>> rawList = contractUtxoStorageService.loadAllCoinList();
for (Entry<byte[], byte[]> coinEntry : rawList) {
Coin coin = new Coin();
try {
coin.parse(coinEntry.getValue(), 0);
} catch (NulsException e) {
Log.info("parse coin form db error");
continue;
}
if (Arrays.equals(coin.getAddress(), address)) {
coin.setOwner(coinEntry.getKey());
coin.setKey(asString(coinEntry.getKey()));
coinList.add(coin);
}
}
return coinList;
}
Aggregations