Preliminary block checkings.
[NovacoinLibrary.git] / Novacoin / CNovacoinAddress.cs
index d66555e..c652b22 100644 (file)
@@ -1,8 +1,25 @@
-\feffusing System;
+\feff/**
+*  Novacoin classes library
+*  Copyright (C) 2015 Alex D. (balthazar.ad@gmail.com)
+
+*  This program is free software: you can redistribute it and/or modify
+*  it under the terms of the GNU Affero General Public License as
+*  published by the Free Software Foundation, either version 3 of the
+*  License, or (at your option) any later version.
+
+*  This program is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU Affero General Public License for more details.
+
+*  You should have received a copy of the GNU Affero General Public License
+*  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
 using System.Collections.Generic;
 using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System;
+using System.Diagnostics.Contracts;
 
 namespace Novacoin
 {
@@ -23,17 +40,19 @@ namespace Novacoin
     public class CNovacoinAddress
     {
         private byte nVersion;
-        private List<byte> addrData;
+        private byte[] addrData = new byte[20];
 
         /// <summary>
         /// Initialize with custom data and version
         /// </summary>
         /// <param name="nVersionIn"></param>
         /// <param name="addrDataIn"></param>
-        public CNovacoinAddress(byte nVersionIn, IEnumerable<byte> addrDataIn)
+        public CNovacoinAddress(byte nVersionIn, byte[] addrDataIn)
         {
+            Contract.Requires<ArgumentException>(addrDataIn.Length == 20, "Your data doesn't look like a valid hash160 of some value.");
+
             nVersion = nVersionIn;
-            addrData = addrDataIn.ToList();
+            addrDataIn.CopyTo(addrData, 0);
         }
 
         /// <summary>
@@ -43,7 +62,7 @@ namespace Novacoin
         public CNovacoinAddress(CKeyID keyID)
         {
             nVersion = (byte)AddrType.PUBKEY_ADDRESS;
-            addrData = new List<byte>(keyID.hashBytes);
+            addrData = keyID;
         }
 
         /// <summary>
@@ -53,37 +72,64 @@ namespace Novacoin
         public CNovacoinAddress(CScriptID scriptID)
         {
             nVersion = (byte)AddrType.SCRIPT_ADDRESS;
-            addrData = new List<byte>(scriptID.hashBytes);
+            addrData = scriptID;
         }
 
         /// <summary>
-        /// Basic sanity checking
+        /// Initialize new instance from base58 string
         /// </summary>
-        /// <returns></returns>
-        public bool IsValid()
+        /// <param name="strNovacoinAddress"></param>
+        public CNovacoinAddress(string strNovacoinAddress)
         {
-            // Address data is normally generated by RIPEMD-160 hash function
-            int nExpectedSize = 20;
+            var RawAddrData = AddressTools.Base58DecodeCheck(strNovacoinAddress);
 
-            switch ((AddrType) nVersion)
+            if (RawAddrData.Length != 21)
             {
-                case AddrType.PUBKEY_ADDRESS:
-                    nExpectedSize = 20; // Hash of public key
-                    break;
-                case AddrType.SCRIPT_ADDRESS:
-                    nExpectedSize = 20; // Hash of CScript
-                    break;
-                case AddrType.PUBKEY_ADDRESS_TEST:
-                    nExpectedSize = 20;
-                    break;
-                case AddrType.SCRIPT_ADDRESS_TEST:
-                    nExpectedSize = 20;
-                    break;
-                default:
-                    return false;
+                throw new ArgumentException("Though you have provided a correct Base58 representation of some data, this data doesn't represent a valid Novacoin address.");
             }
 
-            return addrData.Count == nExpectedSize;
+            nVersion = RawAddrData[0];
+            Array.Copy(RawAddrData, 1, addrData, 0, 20);
+        }
+
+        /// <summary>
+        /// 20 bytes, Hash160 of script or public key
+        /// </summary>
+        public static implicit operator byte[](CNovacoinAddress addr)
+        {
+            return addr.addrData;
+        }
+
+        /// <summary>
+        /// Basic sanity checking
+        /// </summary>
+        public bool IsValid
+        {
+            get
+            {
+                // Address data is normally generated by RIPEMD-160 hash function
+                int nExpectedSize = 20;
+
+                switch ((AddrType)nVersion)
+                {
+                    case AddrType.PUBKEY_ADDRESS:
+                        nExpectedSize = 20; // Hash of public key
+                        break;
+                    case AddrType.SCRIPT_ADDRESS:
+                        nExpectedSize = 20; // Hash of CScript
+                        break;
+                    case AddrType.PUBKEY_ADDRESS_TEST:
+                        nExpectedSize = 20;
+                        break;
+                    case AddrType.SCRIPT_ADDRESS_TEST:
+                        nExpectedSize = 20;
+                        break;
+                    default:
+                        return false;
+                }
+
+                return addrData.Length == nExpectedSize;
+            }
         }
 
         /// <summary>
@@ -92,7 +138,7 @@ namespace Novacoin
         /// <returns>Base58(data + checksum)</returns>
         public override string ToString()
         {
-            List<byte> r = new List<byte>();
+            var r = new List<byte>();
 
             r.Add(nVersion);
             r.AddRange(addrData);