use of org.tron.core.capsule.AccountCapsule in project java-tron by tronprotocol.
the class Manager method validateFreq.
void validateFreq(TransactionCapsule trx) throws HighFreqException {
List<org.tron.protos.Protocol.Transaction.Contract> contracts = trx.getInstance().getRawData().getContractList();
for (Transaction.Contract contract : contracts) {
if (contract.getType() == TransferContract || contract.getType() == TransferAssetContract) {
byte[] address = TransactionCapsule.getOwner(contract);
AccountCapsule accountCapsule = this.getAccountStore().get(address);
long balacne = accountCapsule.getBalance();
long latestOperationTime = accountCapsule.getLatestOperationTime();
int latstTransNumberInBlock = this.head.getTransactions().size();
doValidateFreq(balacne, latstTransNumberInBlock, latestOperationTime);
}
}
}
use of org.tron.core.capsule.AccountCapsule in project java-tron by tronprotocol.
the class Manager method initWitness.
/**
* save witnesses into database.
*/
private void initWitness() {
final Args args = Args.getInstance();
final GenesisBlock genesisBlockArg = args.getGenesisBlock();
genesisBlockArg.getWitnesses().forEach(key -> {
byte[] keyAddress = ByteArray.fromHexString(key.getAddress());
ByteString address = ByteString.copyFrom(keyAddress);
if (!this.accountStore.has(keyAddress)) {
final AccountCapsule accountCapsule = new AccountCapsule(ByteString.EMPTY, address, AccountType.AssetIssue, 0L);
this.accountStore.put(keyAddress, accountCapsule);
}
final WitnessCapsule witnessCapsule = new WitnessCapsule(address, key.getVoteCount(), key.getUrl());
witnessCapsule.setIsJobs(true);
this.witnessStore.put(keyAddress, witnessCapsule);
this.wits.add(witnessCapsule);
});
}
use of org.tron.core.capsule.AccountCapsule in project java-tron by tronprotocol.
the class TransferActuator method validate.
@Override
public boolean validate() throws ContractValidateException {
try {
if (!contract.is(TransferContract.class)) {
throw new ContractValidateException("contract type error,expected type [TransferContract],real type[" + contract.getClass() + "]");
}
TransferContract transferContract = this.contract.unpack(TransferContract.class);
Preconditions.checkNotNull(transferContract.getOwnerAddress(), "OwnerAddress is null");
Preconditions.checkNotNull(transferContract.getToAddress(), "ToAddress is null");
Preconditions.checkNotNull(transferContract.getAmount(), "Amount is null");
if (transferContract.getOwnerAddress().equals(transferContract.getToAddress())) {
throw new ContractValidateException("Cannot transfer trx to yourself.");
}
if (!dbManager.getAccountStore().has(transferContract.getOwnerAddress().toByteArray())) {
throw new ContractValidateException("Validate TransferContract error, no OwnerAccount.");
}
AccountCapsule ownerAccount = dbManager.getAccountStore().get(transferContract.getOwnerAddress().toByteArray());
long balance = ownerAccount.getBalance();
long laststOperationTime = ownerAccount.getLatestOperationTime();
long now = System.currentTimeMillis();
// TODO:
// if (now - laststOperationTime < balance) {
// throw new ContractValidateException();
// }
// if account with to_address is not existed, create it.
ByteString toAddress = transferContract.getToAddress();
if (!dbManager.getAccountStore().has(toAddress.toByteArray())) {
AccountCapsule account = new AccountCapsule(toAddress, AccountType.Normal);
dbManager.getAccountStore().put(toAddress.toByteArray(), account);
}
if (ownerAccount.getBalance() < calcFee()) {
throw new ContractValidateException("Validate TransferContract error, insufficient fee.");
}
long amount = transferContract.getAmount();
if (amount < 0) {
throw new ContractValidateException("Amount is less than 0.");
}
} catch (Exception ex) {
ex.printStackTrace();
throw new ContractValidateException(ex.getMessage());
}
return true;
}
use of org.tron.core.capsule.AccountCapsule in project java-tron by tronprotocol.
the class TransferAssetActuator method validate.
@Override
public boolean validate() throws ContractValidateException {
try {
TransferAssetContract transferAssetContract = this.contract.unpack(TransferAssetContract.class);
Preconditions.checkNotNull(transferAssetContract.getOwnerAddress(), "OwnerAddress is null");
Preconditions.checkNotNull(transferAssetContract.getToAddress(), "ToAddress is null");
Preconditions.checkNotNull(transferAssetContract.getAssetName(), "AssetName is null");
Preconditions.checkNotNull(transferAssetContract.getAmount(), "Amount is null");
if (transferAssetContract.getOwnerAddress().equals(transferAssetContract.getToAddress())) {
throw new ContractValidateException("Cannot transfer asset to yourself.");
}
byte[] ownerKey = transferAssetContract.getOwnerAddress().toByteArray();
if (!this.dbManager.getAccountStore().has(ownerKey)) {
throw new ContractValidateException();
}
// if account with to_address is not existed, create it.
ByteString toAddress = transferAssetContract.getToAddress();
if (!dbManager.getAccountStore().has(toAddress.toByteArray())) {
AccountCapsule account = new AccountCapsule(toAddress, AccountType.Normal);
dbManager.getAccountStore().put(toAddress.toByteArray(), account);
}
byte[] nameKey = transferAssetContract.getAssetName().toByteArray();
if (!this.dbManager.getAssetIssueStore().has(nameKey)) {
throw new ContractValidateException();
}
long amount = transferAssetContract.getAmount();
AccountCapsule ownerAccount = this.dbManager.getAccountStore().get(ownerKey);
Map<String, Long> asset = ownerAccount.getAssetMap();
if (asset.isEmpty()) {
throw new ContractValidateException();
}
Long assetAmount = asset.get(ByteArray.toStr(nameKey));
if (amount <= 0 || null == assetAmount || amount > assetAmount || assetAmount <= 0) {
throw new ContractValidateException();
}
} catch (InvalidProtocolBufferException e) {
throw new ContractValidateException();
}
return true;
}
use of org.tron.core.capsule.AccountCapsule in project java-tron by tronprotocol.
the class TransferAssetActuator method execute.
@Override
public boolean execute(TransactionResultCapsule ret) throws ContractExeException {
long fee = calcFee();
if (!this.contract.is(TransferAssetContract.class)) {
throw new ContractExeException();
}
if (this.dbManager == null) {
throw new ContractExeException();
}
try {
TransferAssetContract transferAssetContract = this.contract.unpack(TransferAssetContract.class);
AccountStore accountStore = this.dbManager.getAccountStore();
byte[] ownerKey = transferAssetContract.getOwnerAddress().toByteArray();
byte[] toKey = transferAssetContract.getToAddress().toByteArray();
ByteString assertName = transferAssetContract.getAssetName();
long amount = transferAssetContract.getAmount();
AccountCapsule ownerAccountCapsule = accountStore.get(ownerKey);
if (!ownerAccountCapsule.reduceAssetAmount(assertName, amount)) {
throw new ContractExeException("reduceAssetAmount failed !");
}
accountStore.put(ownerKey, ownerAccountCapsule);
AccountCapsule toAccountCapsule = accountStore.get(toKey);
toAccountCapsule.addAssetAmount(assertName, amount);
accountStore.put(toKey, toAccountCapsule);
ret.setStatus(fee, code.SUCESS);
} catch (InvalidProtocolBufferException e) {
ret.setStatus(fee, code.FAILED);
throw new ContractExeException();
}
return true;
}
Aggregations