@@ -70,7 +70,7 @@ contract PrivateDataStorageLogic is Storage {
70
70
exchangeKeyHash : _exchangeKeyHash,
71
71
encryptedDataKey : encryptedDataKey,
72
72
state : PrivateDataExchangeState.Proposed,
73
- stateExpired : now + privateDataExchangeProposeTimeout
73
+ stateExpired : _nowSeconds () + privateDataExchangeProposeTimeout
74
74
});
75
75
privateDataExchanges.push (exchange);
76
76
@@ -88,12 +88,12 @@ contract PrivateDataStorageLogic is Storage {
88
88
require (msg .sender == exchange.passportOwner, "only passport owner allowed " );
89
89
require (PrivateDataExchangeState.Proposed == exchange.state, "exchange must be in proposed state " );
90
90
require (msg .value >= exchange.dataRequesterValue, "need to stake at least data requester amount " );
91
- require (now < exchange.stateExpired, "exchange state expired " );
91
+ require (_nowSeconds () < exchange.stateExpired, "exchange state expired " );
92
92
93
93
exchange.passportOwnerValue = msg .value ;
94
94
exchange.encryptedDataKey = _encryptedDataKey;
95
95
exchange.state = PrivateDataExchangeState.Accepted;
96
- exchange.stateExpired = now + privateDataExchangeAcceptTimeout;
96
+ exchange.stateExpired = _nowSeconds () + privateDataExchangeAcceptTimeout;
97
97
98
98
emit PrivateDataExchangeAccepted (_exchangeIdx, exchange.dataRequester, msg .sender );
99
99
}
@@ -103,7 +103,7 @@ contract PrivateDataStorageLogic is Storage {
103
103
require (_exchangeIdx < privateDataExchanges.length , "invalid exchange index " );
104
104
PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx];
105
105
require (PrivateDataExchangeState.Accepted == exchange.state, "exchange must be in accepted state " );
106
- require (now > exchange.stateExpired || msg .sender == exchange.dataRequester, "exchange must be either expired or be finished by the data requester " );
106
+ require (_nowSeconds () > exchange.stateExpired || msg .sender == exchange.dataRequester, "exchange must be either expired or be finished by the data requester " );
107
107
108
108
exchange.state = PrivateDataExchangeState.Closed;
109
109
@@ -122,7 +122,7 @@ contract PrivateDataStorageLogic is Storage {
122
122
PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx];
123
123
require (PrivateDataExchangeState.Proposed == exchange.state, "exchange must be in proposed state " );
124
124
require (msg .sender == exchange.dataRequester, "only data requester allowed " );
125
- require (now > exchange.stateExpired, "exchange must be expired " );
125
+ require (_nowSeconds () > exchange.stateExpired, "exchange must be expired " );
126
126
127
127
exchange.state = PrivateDataExchangeState.Closed;
128
128
@@ -141,7 +141,7 @@ contract PrivateDataStorageLogic is Storage {
141
141
PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx];
142
142
require (PrivateDataExchangeState.Accepted == exchange.state, "exchange must be in accepted state " );
143
143
require (msg .sender == exchange.dataRequester, "only data requester allowed " );
144
- require (now < exchange.stateExpired, "exchange must not be expired " );
144
+ require (_nowSeconds () < exchange.stateExpired, "exchange must not be expired " );
145
145
require (keccak256 (abi.encodePacked (_exchangeKey)) == exchange.exchangeKeyHash, "exchange key hash must match " );
146
146
147
147
bytes32 dataKey = _exchangeKey ^ exchange.encryptedDataKey;
@@ -202,4 +202,16 @@ contract PrivateDataStorageLogic is Storage {
202
202
return (initValue.initialized, initValue.value.dataIPFSHash, initValue.value.dataKeyHash);
203
203
}
204
204
205
+ function _nowSeconds () private view returns (uint256 ) {
206
+ uint256 t = now ;
207
+
208
+ // In Quorum blockchain timestamp is in nanoseconds, not seconds:
209
+ // https://github.com/jpmorganchase/quorum/issues/713
210
+ // https://github.com/jpmorganchase/quorum/issues/190
211
+ if (t > 150000000000000000 ) {
212
+ t /= 1000000000 ;
213
+ }
214
+
215
+ return t;
216
+ }
205
217
}
0 commit comments