Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F10615196
blockindex.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
2 KB
Subscribers
None
blockindex.cpp
View Options
// Copyright (c) 2009-2020 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include
<blockindex.h>
/**
* Turn the lowest '1' bit in the binary representation of a number into a '0'.
*/
static
inline
int
InvertLowestOne
(
int
n
)
{
return
n
&
(
n
-
1
);
}
/** Compute what height to jump back to with the CBlockIndex::pskip pointer. */
static
inline
int
GetSkipHeight
(
int
height
)
{
if
(
height
<
2
)
{
return
0
;
}
// Determine which height to jump back to. Any number strictly lower than
// height is acceptable, but the following expression seems to perform well
// in simulations (max 110 steps to go back up to 2**18 blocks).
return
(
height
&
1
)
?
InvertLowestOne
(
InvertLowestOne
(
height
-
1
))
+
1
:
InvertLowestOne
(
height
);
}
bool
CBlockIndex
::
UpdateChainStats
()
{
if
(
pprev
==
nullptr
)
{
nChainTx
=
nTx
;
nChainSize
=
nSize
;
return
true
;
}
if
(
pprev
->
HaveTxsDownloaded
())
{
nChainTx
=
pprev
->
nChainTx
+
nTx
;
nChainSize
=
pprev
->
nChainSize
+
nSize
;
return
true
;
}
nChainTx
=
0
;
nChainSize
=
0
;
return
false
;
}
const
CBlockIndex
*
CBlockIndex
::
GetAncestor
(
int
height
)
const
{
if
(
height
>
nHeight
||
height
<
0
)
{
return
nullptr
;
}
const
CBlockIndex
*
pindexWalk
=
this
;
int
heightWalk
=
nHeight
;
while
(
heightWalk
>
height
)
{
int
heightSkip
=
GetSkipHeight
(
heightWalk
);
int
heightSkipPrev
=
GetSkipHeight
(
heightWalk
-
1
);
if
(
pindexWalk
->
pskip
!=
nullptr
&&
(
heightSkip
==
height
||
(
heightSkip
>
height
&&
!
(
heightSkipPrev
<
heightSkip
-
2
&&
heightSkipPrev
>=
height
))))
{
// Only follow pskip if pprev->pskip isn't better than pskip->pprev.
pindexWalk
=
pindexWalk
->
pskip
;
heightWalk
=
heightSkip
;
}
else
{
assert
(
pindexWalk
->
pprev
);
pindexWalk
=
pindexWalk
->
pprev
;
heightWalk
--
;
}
}
return
pindexWalk
;
}
CBlockIndex
*
CBlockIndex
::
GetAncestor
(
int
height
)
{
return
const_cast
<
CBlockIndex
*>
(
const_cast
<
const
CBlockIndex
*>
(
this
)
->
GetAncestor
(
height
));
}
void
CBlockIndex
::
BuildSkip
()
{
if
(
pprev
)
{
pskip
=
pprev
->
GetAncestor
(
GetSkipHeight
(
nHeight
));
}
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Sat, Nov 23, 10:01 (1 d, 17 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4510138
Default Alt Text
blockindex.cpp (2 KB)
Attached To
rSTAGING Bitcoin ABC staging
Event Timeline
Log In to Comment