From b7b31fba1b1b0163185e7fe9b4a4efc341366f0e Mon Sep 17 00:00:00 2001 From: ashu Date: Tue, 28 May 2019 18:36:58 +0800 Subject: [PATCH 1/2] create2 new storage-key review code revise code --- .../common/runtime/vm/program/Program.java | 4 ++-- .../common/runtime/vm/program/Storage.java | 19 ++++++++----------- .../org/tron/common/storage/DepositImpl.java | 13 ++++++------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/tron/common/runtime/vm/program/Program.java b/src/main/java/org/tron/common/runtime/vm/program/Program.java index 1cfd76cddc8..e075592fcc4 100644 --- a/src/main/java/org/tron/common/runtime/vm/program/Program.java +++ b/src/main/java/org/tron/common/runtime/vm/program/Program.java @@ -453,8 +453,8 @@ public void createContract(DataWord value, DataWord memStart, DataWord memSize) createContractImpl(value, programCode, newAddress, false); } - private void createContractImpl(DataWord value, byte[] programCode, byte[] newAddress - , boolean isCreate2) { + private void createContractImpl(DataWord value, byte[] programCode, byte[] newAddress, + boolean isCreate2) { byte[] senderAddress = convertToTronAddress(this.getContractAddress().getLast20Bytes()); if (logger.isDebugEnabled()) { diff --git a/src/main/java/org/tron/common/runtime/vm/program/Storage.java b/src/main/java/org/tron/common/runtime/vm/program/Storage.java index 9aa96d19076..3a910d8779f 100644 --- a/src/main/java/org/tron/common/runtime/vm/program/Storage.java +++ b/src/main/java/org/tron/common/runtime/vm/program/Storage.java @@ -8,7 +8,6 @@ import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteUtil; -import org.tron.core.capsule.ContractCapsule; import org.tron.core.capsule.StorageRowCapsule; import org.tron.core.db.StorageRowStore; @@ -21,26 +20,25 @@ public class Storage { @Getter private final Map rowCache = new HashMap<>(); + @Getter + private byte[] address; + private static final int PREFIX_BYTES = 16; public Storage(byte[] address, StorageRowStore store) { addrHash = addrHash(address); + this.address = address; this.store = store; } - public Storage(byte[] address, StorageRowStore store, ContractCapsule contract) { - byte[] trxHash; - if (contract == null) { - trxHash = new byte[0]; - } else { - trxHash = contract.getTrxHash(); - } - addrHash = addrHash(address, trxHash); - this.store = store; + public void generateAddrHash(byte[] trxId) { + // update addreHash for create2 + addrHash = addrHash(address, trxId); } public Storage(Storage storage) { this.addrHash = storage.addrHash.clone(); + this.address = storage.getAddress().clone(); this.store = storage.store; storage.getRowCache().forEach((DataWord rowKey, StorageRowCapsule row) -> { StorageRowCapsule newRow = new StorageRowCapsule(row); @@ -90,7 +88,6 @@ private static byte[] addrHash(byte[] address, byte[] trxHash) { return Hash.sha3(ByteUtil.merge(address, trxHash)); } - public void commit() { rowCache.forEach((DataWord rowKey, StorageRowCapsule row) -> { if (row.isDirty()) { diff --git a/src/main/java/org/tron/common/storage/DepositImpl.java b/src/main/java/org/tron/common/storage/DepositImpl.java index c9cf2beda26..18adb12f8c3 100644 --- a/src/main/java/org/tron/common/storage/DepositImpl.java +++ b/src/main/java/org/tron/common/storage/DepositImpl.java @@ -329,22 +329,21 @@ public synchronized Storage getStorage(byte[] address) { if (storageCache.containsKey(key)) { return storageCache.get(key); } - Storage storage; if (this.parent != null) { Storage parentStorage = parent.getStorage(address); if (VMConfig.getEnergyLimitHardFork()) { + // deep copy storage = new Storage(parentStorage); } else { storage = parentStorage; } } else { - if (VMConfig.allowTvmConstantinople()) { - ContractCapsule contract = getContract(address); - storage = new Storage(address, dbManager.getStorageRowStore(), contract); - } else { - storage = new Storage(address, dbManager.getStorageRowStore()); - } + storage = new Storage(address, dbManager.getStorageRowStore()); + } + ContractCapsule contract = getContract(address); + if (contract != null) { + storage.generateAddrHash(contract.getTrxHash()); } return storage; } From dfff2c72c2412ffbc4dfef09aff777dcd5327b09 Mon Sep 17 00:00:00 2001 From: jeancky Date: Wed, 29 May 2019 16:41:29 +0800 Subject: [PATCH 2/2] update condition --- src/main/java/org/tron/common/runtime/RuntimeImpl.java | 2 +- src/main/java/org/tron/common/storage/DepositImpl.java | 2 +- src/main/java/org/tron/core/capsule/ReceiptCapsule.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/tron/common/runtime/RuntimeImpl.java b/src/main/java/org/tron/common/runtime/RuntimeImpl.java index bd4bfa678b6..757e7238559 100644 --- a/src/main/java/org/tron/common/runtime/RuntimeImpl.java +++ b/src/main/java/org/tron/common/runtime/RuntimeImpl.java @@ -315,7 +315,7 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu public long getTotalEnergyLimit(AccountCapsule creator, AccountCapsule caller, TriggerSmartContract contract, long feeLimit, long callValue) throws ContractValidateException { - if (VMConfig.allowTvmConstantinople() && Objects.isNull(creator)) { + if (Objects.isNull(creator) && VMConfig.allowTvmConstantinople()) { return getAccountEnergyLimitWithFixRatio(caller, feeLimit, callValue); } // according to version diff --git a/src/main/java/org/tron/common/storage/DepositImpl.java b/src/main/java/org/tron/common/storage/DepositImpl.java index 18adb12f8c3..17da1d21b36 100644 --- a/src/main/java/org/tron/common/storage/DepositImpl.java +++ b/src/main/java/org/tron/common/storage/DepositImpl.java @@ -342,7 +342,7 @@ public synchronized Storage getStorage(byte[] address) { storage = new Storage(address, dbManager.getStorageRowStore()); } ContractCapsule contract = getContract(address); - if (contract != null) { + if (contract != null && !ByteUtil.isNullOrZeroArray(contract.getTrxHash())) { storage.generateAddrHash(contract.getTrxHash()); } return storage; diff --git a/src/main/java/org/tron/core/capsule/ReceiptCapsule.java b/src/main/java/org/tron/core/capsule/ReceiptCapsule.java index 0778818846e..3976fc9bd12 100644 --- a/src/main/java/org/tron/core/capsule/ReceiptCapsule.java +++ b/src/main/java/org/tron/core/capsule/ReceiptCapsule.java @@ -106,7 +106,7 @@ public void payEnergyBill(Manager manager, AccountCapsule origin, AccountCapsule return; } - if (VMConfig.allowTvmConstantinople() && Objects.isNull(origin)) { + if (Objects.isNull(origin) && VMConfig.allowTvmConstantinople()) { payEnergyBill(manager, caller, receipt.getEnergyUsageTotal(), energyProcessor, now); return; }