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 }