@@ -84,21 +84,6 @@ library BlocksStorage {
8484 );
8585 }
8686
87- function _initialize (
88- BlocksData storage self ,
89- BlockHeaderData memory startBlockHeader_ ,
90- bytes32 startBlockHash_ ,
91- uint256 startBlockHeight_ ,
92- uint256 startBlockWork_ ,
93- uint256 pendingBlockCount_
94- ) private {
95- require (! _isInitialized (self), BlocksStorageAlreadyInitialized ());
96-
97- _addBlock (self, startBlockHeader_, startBlockHash_, startBlockHeight_, startBlockWork_);
98-
99- self.pendingBlockCount = pendingBlockCount_;
100- }
101-
10287 function addBlock (
10388 BlocksData storage self ,
10489 BlockHeaderData memory blockHeader_ ,
@@ -109,6 +94,10 @@ library BlocksStorage {
10994 _addBlock (self, blockHeader_, blockHash_, blockHeight_, blockWork_);
11095 }
11196
97+ function getPendingBlockCount (BlocksData storage self ) internal view returns (uint256 ) {
98+ return self.pendingBlockCount;
99+ }
100+
112101 function getBlockHashByBlockHeight (
113102 BlocksData storage self ,
114103 uint256 blockHeight_
@@ -159,6 +148,33 @@ library BlocksStorage {
159148 return getBlockStatus (self, blockHash_) == status_;
160149 }
161150
151+ function getMainchainHeight (BlocksData storage self ) internal view returns (uint256 ) {
152+ return self.currentBlockHeight;
153+ }
154+
155+ function getBlockData (
156+ BlocksData storage self ,
157+ bytes32 blockHash_
158+ ) internal view returns (BlockData memory ) {
159+ return self.blocksData[blockHash_];
160+ }
161+
162+ function getNextMainchainBlock (
163+ BlocksData storage self ,
164+ bytes32 blockHash_
165+ ) internal view returns (bytes32 ) {
166+ return self.mainchain[blockHash_];
167+ }
168+
169+ function isInMainchain (
170+ BlocksData storage self ,
171+ bytes32 blockHash_
172+ ) internal view returns (bool ) {
173+ BlockData storage blockData = self.blocksData[blockHash_];
174+
175+ return self.mainchain[blockData.header.prevBlockHash] == blockHash_;
176+ }
177+
162178 function getBlockStatus (
163179 BlocksData storage self ,
164180 bytes32 blockHash_
@@ -192,18 +208,33 @@ library BlocksStorage {
192208 return 0 ;
193209 }
194210
195- uint256 [] memory blocksTime = new uint256 [](MEDIAN_PAST_BLOCKS);
196- uint256 blocksTimeIndex = MEDIAN_PAST_BLOCKS - 1 ;
211+ uint256 [] memory blocksTime_ = new uint256 [](MEDIAN_PAST_BLOCKS);
212+ uint256 blocksTimeIndex_ = MEDIAN_PAST_BLOCKS;
197213
198214 for (uint256 i = blockHeight_ - MEDIAN_PAST_BLOCKS; i < blockHeight_; ++ i) {
199- blocksTime[blocksTimeIndex -- ] = self.blocksData[toBlockHash_].header.time;
215+ blocksTime_[ -- blocksTimeIndex_ ] = self.blocksData[toBlockHash_].header.time;
200216
201217 toBlockHash_ = self.blocksData[toBlockHash_].header.prevBlockHash;
202218 }
203219
204- LibSort.insertionSort (blocksTime );
220+ LibSort.insertionSort (blocksTime_ );
205221
206- return uint32 (blocksTime[MEDIAN_PAST_BLOCKS / 2 ]);
222+ return uint32 (blocksTime_[MEDIAN_PAST_BLOCKS / 2 ]);
223+ }
224+
225+ function _initialize (
226+ BlocksData storage self ,
227+ BlockHeaderData memory startBlockHeader_ ,
228+ bytes32 startBlockHash_ ,
229+ uint256 startBlockHeight_ ,
230+ uint256 startBlockWork_ ,
231+ uint256 pendingBlockCount_
232+ ) private {
233+ require (! _isInitialized (self), BlocksStorageAlreadyInitialized ());
234+
235+ _addBlock (self, startBlockHeader_, startBlockHash_, startBlockHeight_, startBlockWork_);
236+
237+ self.pendingBlockCount = pendingBlockCount_;
207238 }
208239
209240 function _addBlock (
@@ -225,7 +256,9 @@ library BlocksStorage {
225256
226257 bytes32 mainchainHead_ = self.heightToBlockHash[self.currentBlockHeight];
227258
228- if (self.blocksData[mainchainHead_].cumulativeWork < newBlockCumulativeWork_) {
259+ if (self.blocksData[mainchainHead_].cumulativeWork <= newBlockCumulativeWork_) {
260+ self.currentBlockHeight = blockHeight_;
261+
229262 _updateMainchain (self, blockHash_);
230263 }
231264 }
@@ -241,7 +274,7 @@ library BlocksStorage {
241274 blockHash_ = prevBlockHash_;
242275 blockData = self.blocksData[blockHash_];
243276 prevBlockHash_ = blockData.header.prevBlockHash;
244- } while (self.mainchain[prevBlockHash_] != blockHash_);
277+ } while (self.mainchain[prevBlockHash_] != blockHash_ && prevBlockHash_ != 0 );
245278 }
246279
247280 function _onlyInitialized (BlocksData storage self ) private view {
0 commit comments