Advertisement
Guest User

Class version of PHP Bitcoin Address Validator

a guest
Dec 25th, 2013
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. // From http://pastebin.com/vmRQC7ha
  3. //hex input must be in uppercase, with no leading 0x
  4.  
  5. class BitCoinValidator {
  6.  
  7.     public $addressversion = "00"; //this is a hex byte
  8.  
  9.     public function __construct($testnet = false)
  10.     {
  11.         $this->addressversion = ($testnet) ? "6F" : "00"; //TestNet vs ProductionNet
  12.     }
  13.     public function decodeHex($hex)
  14.     {
  15.         $hex=strtoupper($hex);
  16.         $chars="0123456789ABCDEF";
  17.         $return="0";
  18.         for($i=0;$i<strlen($hex);$i++)
  19.         {
  20.             $current=(string)strpos($chars,$hex[$i]);
  21.             $return=(string)bcmul($return,"16",0);
  22.             $return=(string)bcadd($return,$current,0);
  23.         }
  24.         return $return;
  25.     }
  26.  
  27.     public function encodeHex($dec)
  28.     {
  29.         $chars="0123456789ABCDEF";
  30.         $return="";
  31.         while (bccomp($dec,0)==1)
  32.         {
  33.             $dv=(string)bcdiv($dec,"16",0);
  34.             $rem=(integer)bcmod($dec,"16");
  35.             $dec=$dv;
  36.             $return=$return.$chars[$rem];
  37.         }
  38.         return strrev($return);
  39.     }
  40.  
  41.     public function decodeBase58($base58)
  42.     {
  43.         $origbase58=$base58;
  44.        
  45.         $chars="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
  46.         $return="0";
  47.         for($i=0;$i<strlen($base58);$i++)
  48.         {
  49.             $current=(string)strpos($chars,$base58[$i]);
  50.             $return=(string)bcmul($return,"58",0);
  51.             $return=(string)bcadd($return,$current,0);
  52.         }
  53.        
  54.         $return=$this->encodeHex($return);
  55.        
  56.         //leading zeros
  57.         for($i=0;$i<strlen($origbase58)&&$origbase58[$i]=="1";$i++)
  58.         {
  59.             $return="00".$return;
  60.         }
  61.        
  62.         if(strlen($return)%2!=0)
  63.         {
  64.             $return="0".$return;
  65.         }
  66.        
  67.         return $return;
  68.     }
  69.  
  70.     public function encodeBase58($hex)
  71.     {
  72.         if(strlen($hex)%2!=0)
  73.         {
  74.             die("encodeBase58: uneven number of hex characters");
  75.         }
  76.         $orighex=$hex;
  77.        
  78.         $chars="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
  79.         $hex=$this->decodeHex($hex);
  80.         $return="";
  81.         while (bccomp($hex,0)==1)
  82.         {
  83.             $dv=(string)bcdiv($hex,"58",0);
  84.             $rem=(integer)bcmod($hex,"58");
  85.             $hex=$dv;
  86.             $return=$return.$chars[$rem];
  87.         }
  88.         $return=strrev($return);
  89.        
  90.         //leading zeros
  91.         for($i=0;$i<strlen($orighex)&&substr($orighex,$i,2)=="00";$i+=2)
  92.         {
  93.             $return="1".$return;
  94.         }
  95.        
  96.         return $return;
  97.     }
  98.  
  99.     public function hash160ToAddress($hash160)
  100.     {
  101.         $hash160=$this->addressversion.$hash160;
  102.         $check=pack("H*" , $hash160);
  103.         $check=hash("sha256",hash("sha256",$check,true));
  104.         $check=substr($check,0,8);
  105.         $hash160=strtoupper($hash160.$check);
  106.         return $this->encodeBase58($hash160);
  107.     }
  108.  
  109.     public function addressToHash160($addr)
  110.     {
  111.         $addr=$this->decodeBase58($addr);
  112.         $addr=substr($addr,2,strlen($addr)-10);
  113.         return $addr;
  114.     }
  115.  
  116.     public function _checkAddress($addr)
  117.     {
  118.         $addr=$this->decodeBase58($addr);
  119.         if(strlen($addr)!=50)
  120.         {
  121.             return false;
  122.         }
  123.         $version=substr($addr,0,2);
  124.         if(hexdec($version)>hexdec($this->addressversion))
  125.         {
  126.             return false;
  127.         }
  128.         $check=substr($addr,0,strlen($addr)-8);
  129.         $check=pack("H*" , $check);
  130.         $check=strtoupper(hash("sha256",hash("sha256",$check,true)));
  131.         $check=substr($check,0,8);
  132.         return $check==substr($addr,strlen($addr)-8);
  133.     }
  134.  
  135.     public function hash160($data)
  136.     {
  137.         $data=pack("H*" , $data);
  138.         return strtoupper(hash("ripemd160",hash("sha256",$data,true)));
  139.     }
  140.  
  141.     public function pubKeyToAddress($pubkey)
  142.     {
  143.         return $this->hash160ToAddress($this->hash160($pubkey));
  144.     }
  145.  
  146.     public function remove0x($string)
  147.     {
  148.         if(substr($string,0,2)=="0x"||substr($string,0,2)=="0X")
  149.         {
  150.             $string=substr($string,2);
  151.         }
  152.         return $string;
  153.     }
  154.     public static function checkAddress($addr, $testnet = false)
  155.     {
  156.         $obj = new self($testnet);
  157.         return $obj->_checkAddress($addr);
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement