Coverage Summary for Class: Storage (org.ethereum.vm.program)

Class Class, % Method, % Line, %
Storage 100% (1/1) 5.9% (2/34) 11.1% (6/54)


1 /* 2  * This file is part of RskJ 3  * Copyright (C) 2017 RSK Labs Ltd. 4  * (derived from ethereumJ library, Copyright (c) 2016 <ether.camp>) 5  * 6  * This program is free software: you can redistribute it and/or modify 7  * it under the terms of the GNU Lesser General Public License as published by 8  * the Free Software Foundation, either version 3 of the License, or 9  * (at your option) any later version. 10  * 11  * This program is distributed in the hope that it will be useful, 12  * but WITHOUT ANY WARRANTY; without even the implied warranty of 13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14  * GNU Lesser General Public License for more details. 15  * 16  * You should have received a copy of the GNU Lesser General Public License 17  * along with this program. If not, see <http://www.gnu.org/licenses/>. 18  */ 19  20 package org.ethereum.vm.program; 21  22 import co.rsk.core.Coin; 23 import co.rsk.core.RskAddress; 24 import co.rsk.crypto.Keccak256; 25 import co.rsk.trie.Trie; 26 import org.ethereum.core.AccountState; 27 import org.ethereum.core.Repository; 28 import org.ethereum.vm.DataWord; 29 import org.ethereum.vm.program.invoke.ProgramInvoke; 30 import org.ethereum.vm.program.listener.ProgramListener; 31 import org.ethereum.vm.program.listener.ProgramListenerAware; 32  33 import java.math.BigInteger; 34 import java.util.Iterator; 35 import java.util.Set; 36  37 /* 38  * A Storage is a proxy class for Repository. It encapsulates a repository providing tracing services. 39  * It is only used by Program. 40  * It does not provide any other functionality different from tracing. 41  */ 42 public class Storage implements Repository, ProgramListenerAware { 43  44  private final Repository repository; 45  private final RskAddress addr; 46  private ProgramListener traceListener; 47  48  public Storage(ProgramInvoke programInvoke) { 49  this.addr = new RskAddress(programInvoke.getOwnerAddress()); 50  this.repository = programInvoke.getRepository(); 51  } 52  53  @Override 54  public void setTraceListener(ProgramListener listener) { 55  this.traceListener = listener; 56  } 57  58  @Override 59  public Trie getTrie() { 60  return repository.getTrie(); 61  } 62  63  @Override 64  public AccountState createAccount(RskAddress addr) { 65  return repository.createAccount(addr); 66  } 67  68  @Override 69  public void setupContract(RskAddress addr) { 70  repository.setupContract(addr); 71  } 72  73  @Override 74  public boolean isExist(RskAddress addr) { 75  return repository.isExist(addr); 76  } 77  78  @Override 79  public AccountState getAccountState(RskAddress addr) { 80  return repository.getAccountState(addr); 81  } 82  83  @Override 84  public void delete(RskAddress addr) { 85  if (canListenTrace(addr)) { 86  traceListener.onStorageClear(); 87  } 88  repository.delete(addr); 89  } 90  91  @Override 92  public void hibernate(RskAddress addr) { 93  repository.hibernate(addr); 94  } 95  96  @Override 97  public BigInteger increaseNonce(RskAddress addr) { 98  return repository.increaseNonce(addr); 99  } 100  101  @Override 102  public void setNonce(RskAddress addr, BigInteger nonce) { 103  repository.setNonce(addr, nonce); 104  } 105  106  @Override 107  public BigInteger getNonce(RskAddress addr) { 108  return repository.getNonce(addr); 109  } 110  111  @Override 112  public void saveCode(RskAddress addr, byte[] code) { 113  repository.saveCode(addr, code); 114  } 115  116  @Override 117  public byte[] getCode(RskAddress addr) { 118  return repository.getCode(addr); 119  } 120  121  @Override 122  public int getCodeLength(RskAddress addr) { 123  return repository.getCodeLength(addr); 124  } 125  126  @Override 127  public Keccak256 getCodeHashNonStandard(RskAddress addr) { 128  return repository.getCodeHashNonStandard(addr); 129  } 130  131  @Override 132  public Keccak256 getCodeHashStandard(RskAddress addr) { 133  return repository.getCodeHashStandard(addr); 134  } 135  136  137  @Override 138  public boolean isContract(RskAddress addr) { 139  return repository.isContract(addr); 140  } 141  142  @Override 143  public void addStorageRow(RskAddress addr, DataWord key, DataWord value) { 144  if (canListenTrace(addr)) { 145  traceListener.onStoragePut(key, value); 146  } 147  repository.addStorageRow(addr, key, value); 148  } 149  150  @Override 151  public void addStorageBytes(RskAddress addr, DataWord key, byte[] value) { 152  if (canListenTrace(addr)) { 153  traceListener.onStoragePut(key, value); 154  } 155  repository.addStorageBytes(addr, key, value); 156  } 157  158  private boolean canListenTrace(RskAddress addr) { 159  return this.addr.equals(addr) && traceListener != null; 160  } 161  162  @Override 163  public DataWord getStorageValue(RskAddress addr, DataWord key) { 164  return repository.getStorageValue(addr, key); 165  } 166  167  @Override 168  public Iterator<DataWord> getStorageKeys(RskAddress addr) { 169  return repository.getStorageKeys(addr); 170  } 171  172  @Override 173  public int getStorageKeysCount(RskAddress addr) { 174  return repository.getStorageKeysCount(addr); 175  } 176  177  @Override 178  public byte[] getStorageBytes(RskAddress addr, DataWord key) { 179  return repository.getStorageBytes(addr, key); 180  } 181  182  @Override 183  public Coin getBalance(RskAddress addr) { 184  return repository.getBalance(addr); 185  } 186  187  @Override 188  public Coin addBalance(RskAddress addr, Coin value) { 189  return repository.addBalance(addr, value); 190  } 191  192  @Override 193  public Set<RskAddress> getAccountsKeys() { 194  return repository.getAccountsKeys(); 195  } 196  197  @Override 198  public Repository startTracking() { 199  return repository.startTracking(); 200  } 201  202  @Override 203  public void commit() { 204  repository.commit(); 205  } 206  207  @Override 208  public void save() { 209  repository.save(); 210  } 211  212  @Override 213  public void rollback() { 214  repository.rollback(); 215  } 216  217  @Override 218  public byte[] getRoot() { 219  return repository.getRoot(); 220  } 221  222  @Override 223  public void updateAccountState(RskAddress addr, AccountState accountState) { 224  throw new UnsupportedOperationException(); 225  } 226 }