Search in sources :

Example 1 with AccountCapsule

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);
        }
    }
}
Also used : AccountCapsule(org.tron.core.capsule.AccountCapsule) Transaction(org.tron.protos.Protocol.Transaction) TransferContract(org.tron.protos.Protocol.Transaction.Contract.ContractType.TransferContract) TransferAssetContract(org.tron.protos.Protocol.Transaction.Contract.ContractType.TransferAssetContract)

Example 2 with AccountCapsule

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);
    });
}
Also used : GenesisBlock(org.tron.core.config.args.GenesisBlock) AccountCapsule(org.tron.core.capsule.AccountCapsule) Args(org.tron.core.config.args.Args) WitnessCapsule(org.tron.core.capsule.WitnessCapsule) ByteString(com.google.protobuf.ByteString)

Example 3 with AccountCapsule

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;
}
Also used : AccountCapsule(org.tron.core.capsule.AccountCapsule) ByteString(com.google.protobuf.ByteString) ContractValidateException(org.tron.core.exception.ContractValidateException) TransferContract(org.tron.protos.Contract.TransferContract) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) ContractValidateException(org.tron.core.exception.ContractValidateException) BalanceInsufficientException(org.tron.core.exception.BalanceInsufficientException) ContractExeException(org.tron.core.exception.ContractExeException)

Example 4 with AccountCapsule

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;
}
Also used : AccountCapsule(org.tron.core.capsule.AccountCapsule) ByteString(com.google.protobuf.ByteString) ContractValidateException(org.tron.core.exception.ContractValidateException) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) ByteString(com.google.protobuf.ByteString) TransferAssetContract(org.tron.protos.Contract.TransferAssetContract)

Example 5 with AccountCapsule

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;
}
Also used : AccountCapsule(org.tron.core.capsule.AccountCapsule) AccountStore(org.tron.core.db.AccountStore) ByteString(com.google.protobuf.ByteString) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) TransferAssetContract(org.tron.protos.Contract.TransferAssetContract) ContractExeException(org.tron.core.exception.ContractExeException)

Aggregations

AccountCapsule (org.tron.core.capsule.AccountCapsule)42 ContractExeException (org.tron.core.exception.ContractExeException)22 ContractValidateException (org.tron.core.exception.ContractValidateException)20 TransactionResultCapsule (org.tron.core.capsule.TransactionResultCapsule)16 Test (org.junit.Test)15 InvalidProtocolBufferException (com.google.protobuf.InvalidProtocolBufferException)9 DateTime (org.joda.time.DateTime)7 ByteString (com.google.protobuf.ByteString)5 Before (org.junit.Before)5 AssetIssueCapsule (org.tron.core.capsule.AssetIssueCapsule)5 BalanceInsufficientException (org.tron.core.exception.BalanceInsufficientException)5 WitnessCapsule (org.tron.core.capsule.WitnessCapsule)3 Args (org.tron.core.config.args.Args)3 GenesisBlock (org.tron.core.config.args.GenesisBlock)3 Contract (org.tron.protos.Contract)3 AccountStore (org.tron.core.db.AccountStore)2 TransferAssetContract (org.tron.protos.Contract.TransferAssetContract)2 RamUsageEstimator (com.carrotsearch.sizeof.RamUsageEstimator)1 Lists (com.google.common.collect.Lists)1 Maps (com.google.common.collect.Maps)1