/// <param name="block">Block reference</param>
/// <param name="nBlockPos">Block position reference</param>
/// <returns>Result of operation</returns>
- public bool GetBlockByTransactionID(uint256 TxID, ref CBlock block, ref long nBlockPos)
+ public bool GetBlockByTransactionID(uint256 TxID, out CBlock block, out long nBlockPos)
{
+ block = null;
+ nBlockPos = -1;
+
var queryResult = dbConn.Query<CBlockStoreItem>("select b.* from [BlockStorage] b left join [MerkleNodes] m on (b.[ItemID] = m.[nParentBlockID]) where m.[TransactionHash] = ?", (byte[])TxID);
if (queryResult.Count == 1)
{
CBlockStoreItem blockCursor = queryResult[0];
+ nBlockPos = blockCursor.nBlockPos;
+
return blockCursor.ReadFromFile(ref fStreamReadWrite, out block);
}
// TODO: proof-of-stake validation
uint256 hashProofOfStake = 0, targetProofOfStake = 0;
- if (!StakeModifier.CheckProofOfStake(block.vtx[1], block.header.nBits, ref hashProofOfStake, ref targetProofOfStake))
+ if (!StakeModifier.CheckProofOfStake(block.vtx[1], block.header.nBits, out hashProofOfStake, out targetProofOfStake))
{
return false; // do not error here as we expect this during initial block download
}
return GetKernelStakeModifier(hashBlockFrom, ref nStakeModifier, ref nStakeModifierHeight, ref nStakeModifierTime);
}
- public static bool CheckStakeKernelHash(uint nBits, uint256 hashBlockFrom, uint nTimeBlockFrom, uint nTxPrevOffset, CTransaction txPrev, COutPoint prevout, uint nTimeTx, ref uint256 hashProofOfStake, ref uint256 targetProofOfStake)
+ public static bool CheckStakeKernelHash(uint nBits, uint256 hashBlockFrom, uint nTimeBlockFrom, uint nTxPrevOffset, CTransaction txPrev, COutPoint prevout, uint nTimeTx, out uint256 hashProofOfStake, out uint256 targetProofOfStake)
{
+ hashProofOfStake = targetProofOfStake = 0;
+
if (nTimeTx < txPrev.nTime)
{
return false; // Transaction timestamp violation
return (uint)hashChecksum.Low64;
}
- internal static bool CheckProofOfStake(CTransaction tx, uint nBits, ref uint256 hashProofOfStake, ref uint256 targetProofOfStake)
+ public static bool CheckProofOfStake(CTransaction tx, uint nBits, out uint256 hashProofOfStake, out uint256 targetProofOfStake)
{
+ hashProofOfStake = targetProofOfStake = 0;
+
if (!tx.IsCoinStake)
{
return false; // called on non-coinstake
// Read block header
- long nBlockPos = 0;
- CBlock block = null;
- if (!CBlockStore.Instance.GetBlockByTransactionID(txin.prevout.hash, ref block, ref nBlockPos))
+ long nBlockPos;
+ CBlock block;
+ if (!CBlockStore.Instance.GetBlockByTransactionID(txin.prevout.hash, out block, out nBlockPos))
{
return false; // unable to read block of previous transaction
}
return false; // vin[0] signature check failed
}
- if (!CheckStakeKernelHash(nBits, block.header.Hash, block.header.nTime, (uint)(nTxPos - nBlockPos), txPrev, txin.prevout, tx.nTime, ref hashProofOfStake, ref targetProofOfStake))
+ if (!CheckStakeKernelHash(nBits, block.header.Hash, block.header.nTime, (uint)(nTxPos - nBlockPos), txPrev, txin.prevout, tx.nTime, out hashProofOfStake, out targetProofOfStake))
{
return false; // check kernel failed on coinstake
}