Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
destream-blockchain
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
2
Issues
2
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DeStream-public
destream-blockchain
Commits
47bc6254
Commit
47bc6254
authored
Oct 23, 2018
by
Sergei Zubov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve code quality
parent
6cb9d329
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
93 additions
and
38 deletions
+93
-38
DeStreamTxInListExtensions.cs
Sources/NBitcoin/Utils/DeStreamTxInListExtensions.cs
+5
-0
ConsensusErrors.cs
...ces/Stratis.Bitcoin.Features.Consensus/ConsensusErrors.cs
+1
-1
ConsensusOptions.cs
...es/Stratis.Bitcoin.Features.Consensus/ConsensusOptions.cs
+0
-1
DeStreamConsensusErrors.cs
...tis.Bitcoin.Features.Consensus/DeStreamConsensusErrors.cs
+9
-0
DeStreamRuleContextOverrides.cs
...itcoin.Features.Consensus/DeStreamRuleContextOverrides.cs
+24
-6
DeStreamBlockFeeRule.cs
...tures.Consensus/Rules/CommonRules/DeStreamBlockFeeRule.cs
+19
-23
DeStreamCoinviewRule.cs
...tures.Consensus/Rules/CommonRules/DeStreamCoinviewRule.cs
+19
-4
DeStreamLoadCoinviewRule.cs
...s.Consensus/Rules/CommonRules/DeStreamLoadCoinviewRule.cs
+6
-2
DeStreamConsensusRules.cs
...itcoin.Features.Consensus/Rules/DeStreamConsensusRules.cs
+1
-1
DeStreamMempoolCoinView.cs
...is.Bitcoin.Features.MemoryPool/DeStreamMempoolCoinView.cs
+3
-0
DeStreamMempoolManager.cs
...tis.Bitcoin.Features.MemoryPool/DeStreamMempoolManager.cs
+3
-0
DeStreamMempoolValidator.cs
...s.Bitcoin.Features.MemoryPool/DeStreamMempoolValidator.cs
+3
-0
No files found.
Sources/NBitcoin/Utils/DeStreamTxInListExtensions.cs
View file @
47bc6254
...
...
@@ -14,5 +14,10 @@ namespace NBitcoin
{
return
txInList
.
Where
(
p
=>
p
.
PrevOut
.
Hash
==
uint256
.
Zero
).
Select
(
p
=>
p
.
PrevOut
.
N
);
}
public
static
bool
IsChangePointer
(
this
TxIn
txInList
)
{
return
txInList
.
PrevOut
.
Hash
==
uint256
.
Zero
;
}
}
}
\ No newline at end of file
Sources/Stratis.Bitcoin.Features.Consensus/ConsensusErrors.cs
View file @
47bc6254
...
...
@@ -5,7 +5,7 @@ namespace Stratis.Bitcoin.Features.Consensus
/// <summary>
/// A class that holds consensus errors.
/// </summary>
public
static
class
ConsensusErrors
public
static
partial
class
ConsensusErrors
{
public
static
readonly
ConsensusError
InvalidPrevTip
=
new
ConsensusError
(
"invalid-prev-tip"
,
"invalid previous tip"
);
public
static
readonly
ConsensusError
HighHash
=
new
ConsensusError
(
"high-hash"
,
"proof of work failed"
);
...
...
Sources/Stratis.Bitcoin.Features.Consensus/ConsensusOptions.cs
View file @
47bc6254
...
...
@@ -28,7 +28,6 @@ namespace Stratis.Bitcoin.Features.Consensus
/// <param name="network">The network.</param>
public
virtual
int
GetStakeMinConfirmations
(
int
height
,
Network
network
)
{
return
0
;
if
(
network
.
IsTest
())
return
height
<
CoinstakeMinConfirmationActivationHeightTestnet
?
10
:
20
;
...
...
Sources/Stratis.Bitcoin.Features.Consensus/DeStreamConsensusErrors.cs
0 → 100644
View file @
47bc6254
using
Stratis.Bitcoin.Consensus
;
namespace
Stratis.Bitcoin.Features.Consensus
{
public
static
partial
class
ConsensusErrors
{
public
static
readonly
ConsensusError
BadBlockNoFeeOutput
=
new
ConsensusError
(
"bad-blk-feeoutput"
,
"no fee output in coinbase or coinstake transactions"
);
}
}
\ No newline at end of file
Sources/Stratis.Bitcoin.Features.Consensus/DeStreamRuleContextOverrides.cs
View file @
47bc6254
...
...
@@ -4,25 +4,41 @@ using Stratis.Bitcoin.Consensus;
namespace
Stratis.Bitcoin.Features.Consensus
{
/// <inheritdoc />
public
class
DeStreamPosRuleContext
:
PosRuleContext
public
interface
IDeStreamRuleContext
{
internal
DeStreamPosRuleContext
()
/// <summary>
/// ScriptPubKeys of inputs spent in transaction
/// </summary>
List
<
Script
>
InputScriptPubKeys
{
get
;
set
;
}
/// <summary>
/// Sum of inputs spent in transaction
/// </summary>
Money
TotalIn
{
get
;
set
;
}
}
/// <inheritdoc cref="PosRuleContext" />
public
class
DeStreamRuleContext
:
PosRuleContext
,
IDeStreamRuleContext
{
internal
DeStreamRuleContext
()
{
}
public
DeStream
Pos
RuleContext
(
ValidationContext
validationContext
,
NBitcoin
.
Consensus
consensus
,
public
DeStreamRuleContext
(
ValidationContext
validationContext
,
NBitcoin
.
Consensus
consensus
,
ChainedHeader
consensusTip
)
:
base
(
validationContext
,
consensus
,
consensusTip
)
{
}
/// <inheritdoc />
public
List
<
Script
>
InputScriptPubKeys
{
get
;
set
;
}
/// <inheritdoc />
public
Money
TotalIn
{
get
;
set
;
}
}
/// <inheritdoc />
public
class
DeStreamPowRuleContext
:
PowRuleContext
/// <inheritdoc
cref="PowRuleContext"
/>
public
class
DeStreamPowRuleContext
:
PowRuleContext
,
IDeStreamRuleContext
{
internal
DeStreamPowRuleContext
()
{
...
...
@@ -33,8 +49,10 @@ namespace Stratis.Bitcoin.Features.Consensus
{
}
/// <inheritdoc />
public
List
<
Script
>
InputScriptPubKeys
{
get
;
set
;
}
/// <inheritdoc />
public
Money
TotalIn
{
get
;
set
;
}
}
}
\ No newline at end of file
Sources/Stratis.Bitcoin.Features.Consensus/Rules/CommonRules/DeStreamBlockFeeRule.cs
View file @
47bc6254
...
...
@@ -7,12 +7,18 @@ using Stratis.Bitcoin.Consensus.Rules;
namespace
Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
{
/// <summary>
/// A rule that verifies fee is charged from all spent funds and transferred to <see cref="Network.DeStreamWallet"/>
/// </summary>
[
ExecutionRule
]
public
class
DeStreamBlockFeeRule
:
ConsensusRule
{
public
override
Task
RunAsync
(
RuleContext
context
)
{
// Actual fee is funds that are transferred to fee wallet in mined/staked block
long
actualFee
=
this
.
GetActualFee
(
context
.
ValidationContext
.
Block
);
// Expected fee is charged from all moved funds (not change)
long
expectedFee
;
switch
(
context
)
{
...
...
@@ -20,16 +26,17 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
expectedFee
=
this
.
GetExpectedFee
(
context
.
ValidationContext
.
Block
,
deStreamPowRuleContext
.
TotalIn
,
deStreamPowRuleContext
.
InputScriptPubKeys
);
break
;
case
DeStream
Pos
RuleContext
deStreamPosRuleContext
:
case
DeStreamRuleContext
deStreamPosRuleContext
:
expectedFee
=
this
.
GetExpectedFee
(
context
.
ValidationContext
.
Block
,
deStreamPosRuleContext
.
TotalIn
,
deStreamPosRuleContext
.
InputScriptPubKeys
);
break
;
default
:
throw
new
Exception
();
throw
new
NotSupportedException
(
$"Rule context must be
{
nameof
(
DeStreamPowRuleContext
)}
or
{
nameof
(
DeStreamRuleContext
)}
"
);
}
if
(
Math
.
Abs
(
actualFee
-
expectedFee
)
>
Money
.
CENT
)
throw
new
Exception
();
ConsensusErrors
.
BadTransactionFeeOutOfRange
.
Throw
();
return
Task
.
CompletedTask
;
}
...
...
@@ -40,32 +47,21 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
.
Where
(
p
=>
this
.
Parent
.
Network
.
IsDeStreamAddress
(
p
.
ScriptPubKey
.
GetDestinationAddress
(
this
.
Parent
.
Network
)?.
ToString
())).
ToList
();
if
(
outputsToFeeWallet
.
Count
()
!=
1
)
throw
new
Exception
();
if
(
outputsToFeeWallet
.
Count
!=
1
)
ConsensusErrors
.
BadBlockNoFeeOutput
.
Throw
();
return
outputsToFeeWallet
.
Single
().
Value
;
}
private
long
GetExpectedFee
(
Block
block
,
Money
totalIn
,
ICollection
<
Script
>
inputScriptPubKeys
)
{
long
totalFee
=
0
;
foreach
(
Transaction
transaction
in
block
.
Transactions
.
Where
(
p
=>
!
p
.
IsCoinBase
&&
!
p
.
IsCoinStake
))
{
IList
<
Script
>
changeScriptPubKeys
=
transaction
.
Outputs
.
Select
(
q
=>
q
.
ScriptPubKey
)
.
Intersect
(
inputScriptPubKeys
)
.
Concat
(
transaction
.
Inputs
.
GetChangePointers
()
.
Select
(
p
=>
transaction
.
Outputs
[
p
].
ScriptPubKey
))
return
block
.
Transactions
.
Where
(
p
=>
!
p
.
IsCoinBase
&&
!
p
.
IsCoinStake
).
Sum
(
p
=>
this
.
GetFeeInTransaction
(
p
,
totalIn
,
p
.
Outputs
.
Select
(
q
=>
q
.
ScriptPubKey
).
Intersect
(
inputScriptPubKeys
)
.
Concat
(
p
.
Inputs
.
GetChangePointers
()
.
Select
(
q
=>
p
.
Outputs
[
q
].
ScriptPubKey
))
.
Distinct
()
.
ToList
();
long
feeInTransaction
=
this
.
GetFeeInTransaction
(
transaction
,
totalIn
,
changeScriptPubKeys
);
totalFee
+=
feeInTransaction
;
}
return
totalFee
;
.
ToList
()));
}
private
long
GetFeeInTransaction
(
Transaction
transaction
,
Money
totalIn
,
...
...
@@ -75,7 +71,7 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
.
Where
(
p
=>
!
changeScriptPubKeys
.
Contains
(
p
.
ScriptPubKey
))
.
Sum
(
p
=>
p
.
Value
)
*
this
.
Parent
.
Network
.
FeeRate
;
if
(
Math
.
Abs
(
totalIn
.
Satoshi
-
transaction
.
TotalOut
.
Satoshi
-
feeInTransaction
)
>
Money
.
CENT
)
throw
new
Exception
();
ConsensusErrors
.
BadTransactionFeeOutOfRange
.
Throw
();
return
(
long
)
(
feeInTransaction
*
this
.
Parent
.
Network
.
DeStreamFeePart
);
}
...
...
Sources/Stratis.Bitcoin.Features.Consensus/Rules/CommonRules/DeStreamCoinviewRule.cs
View file @
47bc6254
using
System.Collections.Generic
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Threading.Tasks
;
using
Microsoft.Extensions.Logging
;
...
...
@@ -9,6 +10,9 @@ using Stratis.Bitcoin.Utilities;
namespace
Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
{
/// <summary>
/// CoinViewRule that prevents verifing ChangePointer input
/// </summary>
public
abstract
class
DeStreamCoinViewRule
:
CoinViewRule
{
public
override
async
Task
RunAsync
(
RuleContext
context
)
...
...
@@ -45,7 +49,7 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
// be in ConnectBlock because they require the UTXO set.
for
(
int
j
=
0
;
j
<
tx
.
Inputs
.
Count
;
j
++)
{
prevheights
[
j
]
=
tx
.
Inputs
[
j
].
PrevOut
.
Hash
==
uint256
.
Zero
prevheights
[
j
]
=
tx
.
Inputs
[
j
].
IsChangePointer
()
?
0
:
(
int
)
view
.
AccessCoins
(
tx
.
Inputs
[
j
].
PrevOut
.
Hash
).
Height
;
}
...
...
@@ -75,7 +79,7 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
var
txData
=
new
PrecomputedTransactionData
(
tx
);
for
(
int
inputIndex
=
0
;
inputIndex
<
tx
.
Inputs
.
Count
;
inputIndex
++)
{
if
(
tx
.
Inputs
[
inputIndex
].
PrevOut
.
Hash
==
uint256
.
Zero
)
if
(
tx
.
Inputs
[
inputIndex
].
IsChangePointer
()
)
continue
;
this
.
Parent
.
PerformanceCounter
.
AddProcessedInputs
(
1
);
...
...
@@ -126,6 +130,7 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
this
.
Logger
.
LogTrace
(
"(-)"
);
}
/// <inheritdoc />
public
override
void
CheckInputs
(
Transaction
transaction
,
UnspentOutputSet
inputs
,
int
spendHeight
)
{
this
.
Logger
.
LogTrace
(
"({0}:{1})"
,
nameof
(
spendHeight
),
spendHeight
);
...
...
@@ -175,6 +180,7 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
this
.
Logger
.
LogTrace
(
"(-)"
);
}
/// <inheritdoc />
public
override
long
GetTransactionSignatureOperationCost
(
Transaction
transaction
,
UnspentOutputSet
inputs
,
DeploymentFlags
flags
)
{
...
...
@@ -185,8 +191,10 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
return
signatureOperationCost
;
if
(
flags
.
ScriptFlags
.
HasFlag
(
ScriptVerify
.
P2SH
))
{
signatureOperationCost
+=
this
.
GetP2SHSignatureOperationsCount
(
transaction
,
inputs
)
*
this
.
PowConsensusOptions
.
WitnessScaleFactor
;
}
signatureOperationCost
+=
(
from
t
in
transaction
.
Inputs
.
RemoveChangePointer
()
let
prevout
=
inputs
.
GetOutputFor
(
t
)
...
...
@@ -195,6 +203,7 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
return
signatureOperationCost
;
}
/// <inheritdoc />
protected
override
uint
GetP2SHSignatureOperationsCount
(
Transaction
transaction
,
UnspentOutputSet
inputs
)
{
if
(
transaction
.
IsCoinBase
)
...
...
@@ -211,8 +220,11 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
return
sigOps
;
}
///<inheritdoc />
protected
override
void
UpdateUTXOSet
(
RuleContext
context
,
Transaction
transaction
)
{
// Saves script pub keys and total amount of spent inputs to context
this
.
Logger
.
LogTrace
(
"()"
);
ChainedHeader
index
=
context
.
ValidationContext
.
ChainedHeader
;
...
...
@@ -225,11 +237,14 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
.
Select
(
p
=>
view
.
GetOutputFor
(
p
).
ScriptPubKey
));
deStreamPowRuleContext
.
TotalIn
=
view
.
GetValueIn
(
transaction
);
break
;
case
DeStream
Pos
RuleContext
deStreamPosRuleContext
:
case
DeStreamRuleContext
deStreamPosRuleContext
:
deStreamPosRuleContext
.
InputScriptPubKeys
.
AddRange
(
transaction
.
Inputs
.
RemoveChangePointer
()
.
Select
(
p
=>
view
.
GetOutputFor
(
p
).
ScriptPubKey
));
deStreamPosRuleContext
.
TotalIn
=
view
.
GetValueIn
(
transaction
);
break
;
default
:
throw
new
NotSupportedException
(
$"Rule context must be
{
nameof
(
DeStreamPowRuleContext
)}
or
{
nameof
(
DeStreamRuleContext
)}
"
);
}
view
.
Update
(
transaction
,
index
.
Height
);
...
...
Sources/Stratis.Bitcoin.Features.Consensus/Rules/CommonRules/DeStreamLoadCoinviewRule.cs
View file @
47bc6254
using
System.Collections.Generic
;
using
System
;
using
System.Collections.Generic
;
using
System.Threading.Tasks
;
using
Microsoft.Extensions.Logging
;
using
NBitcoin
;
...
...
@@ -25,9 +26,12 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules.CommonRules
case
DeStreamPowRuleContext
deStreamPowRuleContext
:
deStreamPowRuleContext
.
InputScriptPubKeys
=
new
List
<
Script
>();
break
;
case
DeStream
Pos
RuleContext
deStreamPosRuleContext
:
case
DeStreamRuleContext
deStreamPosRuleContext
:
deStreamPosRuleContext
.
InputScriptPubKeys
=
new
List
<
Script
>();
break
;
default
:
throw
new
NotSupportedException
(
$"Rule context must be
{
nameof
(
DeStreamPowRuleContext
)}
or
{
nameof
(
DeStreamRuleContext
)}
"
);
}
using
(
new
StopwatchDisposable
(
o
=>
this
.
Parent
.
PerformanceCounter
.
AddUTXOFetchingTime
(
o
)))
...
...
Sources/Stratis.Bitcoin.Features.Consensus/Rules/DeStreamConsensusRules.cs
View file @
47bc6254
...
...
@@ -40,7 +40,7 @@ namespace Stratis.Bitcoin.Features.Consensus.Rules
public
override
RuleContext
CreateRuleContext
(
ValidationContext
validationContext
,
ChainedHeader
consensusTip
)
{
return
new
DeStream
Pos
RuleContext
(
validationContext
,
this
.
Network
.
Consensus
,
consensusTip
);
return
new
DeStreamRuleContext
(
validationContext
,
this
.
Network
.
Consensus
,
consensusTip
);
}
}
}
\ No newline at end of file
Sources/Stratis.Bitcoin.Features.MemoryPool/DeStreamMempoolCoinView.cs
View file @
47bc6254
...
...
@@ -10,6 +10,9 @@ using Stratis.Bitcoin.Utilities;
namespace
Stratis.Bitcoin.Features.MemoryPool
{
/// <summary>
/// Creates <see cref="DeStreamUnspentOutputSet"/> and ChangePointer input
/// </summary>
public
class
DeStreamMempoolCoinView
:
MempoolCoinView
{
public
DeStreamMempoolCoinView
(
CoinView
inner
,
ITxMempool
memPool
,
SchedulerLock
mempoolLock
,
IMempoolValidator
mempoolValidator
)
:
base
(
inner
,
memPool
,
mempoolLock
,
mempoolValidator
)
...
...
Sources/Stratis.Bitcoin.Features.MemoryPool/DeStreamMempoolManager.cs
View file @
47bc6254
...
...
@@ -7,6 +7,9 @@ using Stratis.Bitcoin.Utilities;
namespace
Stratis.Bitcoin.Features.MemoryPool
{
/// <summary>
/// Creates <see cref="DeStreamMempoolCoinView"/>
/// </summary>
public
class
DeStreamMempoolManager
:
MempoolManager
{
public
DeStreamMempoolManager
(
MempoolSchedulerLock
mempoolLock
,
ITxMempool
memPool
,
IMempoolValidator
validator
,
IDateTimeProvider
dateTimeProvider
,
MempoolSettings
mempoolSettings
,
IMempoolPersistence
mempoolPersistence
,
CoinView
coinView
,
ILoggerFactory
loggerFactory
,
Network
network
)
:
base
(
mempoolLock
,
memPool
,
validator
,
dateTimeProvider
,
mempoolSettings
,
mempoolPersistence
,
coinView
,
loggerFactory
,
network
)
...
...
Sources/Stratis.Bitcoin.Features.MemoryPool/DeStreamMempoolValidator.cs
View file @
47bc6254
...
...
@@ -12,6 +12,9 @@ using Stratis.Bitcoin.Utilities;
namespace
Stratis.Bitcoin.Features.MemoryPool
{
/// <summary>
/// Creates <see cref="DeStreamMempoolCoinView"/> and prevents verifing ChangePointer input
/// </summary>
public
class
DeStreamMempoolValidator
:
MempoolValidator
{
public
DeStreamMempoolValidator
(
ITxMempool
memPool
,
MempoolSchedulerLock
mempoolLock
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment