X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=Novacoin%2FCScript.cs;h=229b60b8284554c5b370eefb2f3bc15fbf650eb1;hb=be9d844557911f95165d2c9875c4f5b2822cfc92;hp=902e3b2bbafd5dd77aa2be096983cbd9c7cfbb4e;hpb=a321c6c1bc2759c319738de280a542187b45a372;p=NovacoinLibrary.git diff --git a/Novacoin/CScript.cs b/Novacoin/CScript.cs index 902e3b2..229b60b 100644 --- a/Novacoin/CScript.cs +++ b/Novacoin/CScript.cs @@ -54,7 +54,7 @@ namespace Novacoin /// public ByteQueue GetByteQueue() { - return new ByteQueue(codeBytes); + return new ByteQueue(ref codeBytes); } /// @@ -157,7 +157,7 @@ namespace Novacoin } var count = 0; - var bq1 = new ByteQueue(codeBytes); + var bq1 = new ByteQueue(ref codeBytes); byte[] pushData; instruction opcode; @@ -203,7 +203,7 @@ namespace Novacoin var count = 0; var newScript = new CScript(); - var bq1 = new ByteQueue(codeBytes); + var bq1 = new ByteQueue(ref codeBytes); while (ScriptCode.GetOp(ref bq1, out opcode, out pushData)) { @@ -239,7 +239,7 @@ namespace Novacoin { get { - var wCodeBytes = new ByteQueue(codeBytes); + var wCodeBytes = new ByteQueue(ref codeBytes); instruction opcode; // Current instruction byte[] pushArgs; // OP_PUSHDATAn argument @@ -265,7 +265,7 @@ namespace Novacoin { get { - var wCodeBytes = new ByteQueue(codeBytes); + var wCodeBytes = new ByteQueue(ref codeBytes); byte[] pushArgs; // OP_PUSHDATAn argument instruction opcode; // Current instruction @@ -352,14 +352,14 @@ namespace Novacoin /// /// Legacy mode flag /// Amount of sigops - public int GetSigOpCount(bool fAccurate) + public uint GetSigOpCount(bool fAccurate) { - var wCodeBytes = new ByteQueue(codeBytes); + var wCodeBytes = new ByteQueue(ref codeBytes); instruction opcode; // Current instruction byte[] pushArgs; // OP_PUSHDATAn argument - int nCount = 0; + uint nCount = 0; var lastOpcode = instruction.OP_INVALIDOPCODE; // Scan instructions sequence @@ -373,7 +373,7 @@ namespace Novacoin { if (fAccurate && lastOpcode >= instruction.OP_1 && lastOpcode <= instruction.OP_16) { - nCount += ScriptCode.DecodeOP_N(lastOpcode); + nCount += (uint)ScriptCode.DecodeOP_N(lastOpcode); } else { @@ -391,7 +391,7 @@ namespace Novacoin /// /// pay-to-script-hash scriptPubKey /// SigOps count - public int GetSigOpCount(CScript scriptSig) + public uint GetSigOpCount(CScript scriptSig) { if (!IsPayToScriptHash) { @@ -402,12 +402,19 @@ namespace Novacoin // get the last item that the scriptSig // pushes onto the stack: ByteQueue wScriptSig = scriptSig.GetByteQueue(); + int nScriptSigSize = scriptSig.Size; instruction opcode; // Current instruction - byte[] pushArgs; // OP_PUSHDATAn argument + byte[] pushArgs = new byte[0]; // OP_PUSHDATAn argument + - while (ScriptCode.GetOp(ref wScriptSig, out opcode, out pushArgs)) + while (wScriptSig.Index < nScriptSigSize) { + if (!ScriptCode.GetOp(ref wScriptSig, out opcode, out pushArgs)) + { + return 0; + } + if (opcode > instruction.OP_16) { return 0; @@ -493,6 +500,14 @@ namespace Novacoin return script.codeBytes.ToArray(); } + /// + /// Script size + /// + public int Size + { + get { return codeBytes.Count; } + } + public CScriptID ScriptID { get { return new CScriptID(Hash160.Compute160(codeBytes.ToArray())); } @@ -505,7 +520,7 @@ namespace Novacoin public override string ToString() { var sb = new StringBuilder(); - var wCodeBytes = new ByteQueue(codeBytes); + var wCodeBytes = new ByteQueue(ref codeBytes); instruction opcode; // Current instruction byte[] pushArgs; // OP_PUSHDATAn argument