X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=Novacoin%2FScriptCode.cs;h=ab0db3fe04b795a77ee2235f977dbb762da1528a;hb=1dcac5faa2b1477034f82466ffb16170fa2e9bb6;hp=458445ab435920e9bcb53a664543378219b69d8d;hpb=a321c6c1bc2759c319738de280a542187b45a372;p=NovacoinLibrary.git
diff --git a/Novacoin/ScriptCode.cs b/Novacoin/ScriptCode.cs
index 458445a..ab0db3f 100644
--- a/Novacoin/ScriptCode.cs
+++ b/Novacoin/ScriptCode.cs
@@ -247,23 +247,18 @@ namespace Novacoin
/// Found instruction.
/// IEnumerable out param which is used to get the push arguments.
/// Result of operation
- public static bool GetOp(ref ByteQueue codeBytes, out instruction opcodeRet, out byte[] bytesRet)
+ public static bool GetOp(ref InstructionQueue codeBytes, out instruction opcodeRet, out byte[] bytesRet)
{
bytesRet = new byte[0];
- opcodeRet = instruction.OP_INVALIDOPCODE;
+ instruction opcode = opcodeRet = instruction.OP_INVALIDOPCODE;
- instruction opcode;
-
- try
+ // Read instruction
+ byte opVal = 0xff;
+ if (!codeBytes.TryGet(ref opVal))
{
- // Read instruction
- opcode = (instruction)codeBytes.Get();
- }
- catch (ByteQueueException)
- {
- // No instruction found there
return false;
}
+ opcode = (instruction)opVal;
// Immediate operand
if (opcode <= instruction.OP_PUSHDATA4)
@@ -297,7 +292,7 @@ namespace Novacoin
nSize = BitConverter.ToInt32(codeBytes.Get(4), 0);
}
}
- catch (ByteQueueException)
+ catch (InstructionQueueException)
{
// Unable to read operand length
return false;
@@ -305,13 +300,8 @@ namespace Novacoin
if (nSize > 0)
{
- // If nSize is greater than zero then there is some data available
- try
- {
- // Read found number of bytes into list of OP_PUSHDATAn arguments.
- bytesRet = codeBytes.Get(nSize);
- }
- catch (ByteQueueException)
+ // Trying to read found number of bytes into list of OP_PUSHDATAn arguments.
+ if (!codeBytes.TryGet(nSize, ref bytesRet))
{
// Unable to read data
return false;
@@ -551,8 +541,8 @@ namespace Novacoin
instruction opcode1, opcode2;
// Compare
- var bq1 = script1.GetByteQueue();
- var bq2 = script2.GetByteQueue();
+ var bq1 = script1.GetInstructionQueue();
+ var bq2 = script2.GetInstructionQueue();
byte[] args1, args2;
@@ -666,14 +656,9 @@ namespace Novacoin
/// Input number
/// Hash type flag
///
- public static Hash256 SignatureHash(CScript script, CTransaction txTo, int nIn, int nHashType)
+ public static uint256 SignatureHash(CScript script, CTransaction txTo, int nIn, int nHashType)
{
- if (nIn >= txTo.vin.Length)
- {
- var sb = new StringBuilder();
- sb.AppendFormat("ERROR: SignatureHash() : nIn={0} out of range\n", nIn);
- throw new ArgumentOutOfRangeException("nIn", sb.ToString());
- }
+ Contract.Requires(nIn < txTo.vin.Length, "nIn out of range.");
// Init a copy of transaction
var txTmp = new CTransaction(txTo);
@@ -742,7 +727,7 @@ namespace Novacoin
var txBytes = (byte[])txTmp;
var nHashTypeBytes = BitConverter.GetBytes(nHashType);
- return Hash256.Compute256(ref txBytes, ref nHashTypeBytes);
+ return CryptoUtils.ComputeHash256(ref txBytes, ref nHashTypeBytes);
}
//
@@ -777,13 +762,9 @@ namespace Novacoin
/// Stack reference
private static void popstack(ref List stack)
{
- int nCount = stack.Count;
- if (nCount == 0)
- {
- throw new StackMachineException("Stack is empty");
- }
+ Contract.Requires(stack.Count > 0, "Stack is empty.");
- stack.RemoveAt(nCount - 1);
+ stack.RemoveAt(stack.Count - 1);
}
///
@@ -794,8 +775,8 @@ namespace Novacoin
/// Byte sequence
private static byte[] stacktop(ref List stack, int nDepth)
{
- Contract.Requires(nDepth < 0, "Positive stack depth makes no sense.");
- Contract.Requires(stack.Count + nDepth > 0, "Value exceeds real stack depth.");
+ Contract.Requires(nDepth < 0, "Positive or zero stack depth makes no sense.");
+ Contract.Requires(stack.Count + nDepth >= 0, "Value exceeds real stack depth.");
return stack[stack.Count + nDepth];
}
@@ -863,11 +844,13 @@ namespace Novacoin
var falseBytes = new byte[0];
var trueBytes = new byte[] { 0x01 };
- var CodeQueue = script.GetByteQueue();
+ var CodeQueue = script.GetInstructionQueue();
var altStack = new List();
+#if !DEBUG
try
{
+#endif
instruction opcode;
byte[] pushArg;
@@ -1509,25 +1492,25 @@ namespace Novacoin
{
return false;
}
- Hash hash = null;
+ byte[] hash = null;
var data = stacktop(ref stack, -1);
switch (opcode)
{
case instruction.OP_HASH160:
- hash = Hash160.Compute160(data);
+ hash = CryptoUtils.ComputeHash160(data);
break;
case instruction.OP_HASH256:
- hash = Hash256.Compute256(data);
+ hash = CryptoUtils.ComputeHash256(data);
break;
case instruction.OP_SHA1:
- hash = SHA1.Compute1(data);
+ hash = CryptoUtils.ComputeSha1(data);
break;
case instruction.OP_SHA256:
- hash = SHA256.Compute256(data);
+ hash = CryptoUtils.ComputeSha256(data);
break;
case instruction.OP_RIPEMD160:
- hash = RIPEMD160.Compute160(data);
+ hash = CryptoUtils.ComputeRipeMD160(data);
break;
}
popstack(ref stack);
@@ -1703,12 +1686,14 @@ namespace Novacoin
return false;
}
}
+#if !DEBUG
}
catch (Exception)
{
// If there are any exceptions then just return false.
return false;
}
+#endif
if (vfExec.Count() != 0)
{