pool/web/yaamp/modules/explorer/util.php
Tanguy Pruvot 6d6fd9337f stratum: new algos, attempt to allow old sha merkleroot
blake (SFR) and whirlpool (J) tested ok with a sha256d merkleroot

So add a stratum setting to allow single sha256 merkle root...
The shares are now valid on the pool side, but remains to find
an old wallet to test... like Whirlcoin or blakecoin

keccak not tested, could have the same problem about merkle/miners
2015-10-07 05:04:04 +02:00

174 lines
3.7 KiB
PHP

<?php
define("ADDRESSVERSION","00"); //this is a hex byte
function decodeHex($hex)
{
$hex=strtoupper($hex);
$chars="0123456789ABCDEF";
$return="0";
for($i=0;$i<strlen($hex);$i++)
{
$current=(string)strpos($chars,$hex[$i]);
$return=(string)bcmul($return,"16",0);
$return=(string)bcadd($return,$current,0);
}
return $return;
}
function encodeHex($dec)
{
$chars="0123456789ABCDEF";
$return="";
while (bccomp($dec,0)==1)
{
$dv=(string)bcdiv($dec,"16",0);
$rem=(integer)bcmod($dec,"16");
$dec=$dv;
$return=$return.$chars[$rem];
}
return strrev($return);
}
function decodeBase58($base58)
{
$origbase58=$base58;
$chars="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
$return="0";
for($i=0;$i<strlen($base58);$i++)
{
$current=(string)strpos($chars,$base58[$i]);
$return=(string)bcmul($return,"58",0);
$return=(string)bcadd($return,$current,0);
}
$return=encodeHex($return);
//leading zeros
for($i=0;$i<strlen($origbase58)&&$origbase58[$i]=="1";$i++)
{
$return="00".$return;
}
if(strlen($return)%2!=0)
{
$return="0".$return;
}
return $return;
}
function encodeBase58($hex)
{
if(strlen($hex)%2!=0)
{
die("encodeBase58: uneven number of hex characters");
}
$orighex=$hex;
$chars="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
$hex=decodeHex($hex);
$return="";
while (bccomp($hex,0)==1)
{
$dv=(string)bcdiv($hex,"58",0);
$rem=(integer)bcmod($hex,"58");
$hex=$dv;
$return=$return.$chars[$rem];
}
$return=strrev($return);
//leading zeros
for($i=0;$i<strlen($orighex)&&substr($orighex,$i,2)=="00";$i+=2)
{
$return="1".$return;
}
return $return;
}
function hash160ToAddress($hash160,$addressversion=ADDRESSVERSION)
{
$hash160=$addressversion.$hash160;
$check=pack("H*" , $hash160);
$check=hash("sha256",hash("sha256",$check,true));
$check=substr($check,0,8);
$hash160=strtoupper($hash160.$check);
return encodeBase58($hash160);
}
function addressToHash160($addr)
{
$addr=decodeBase58($addr);
$addr=substr($addr,2,strlen($addr)-10);
return $addr;
}
function checkAddress($addr,$addressversion=ADDRESSVERSION)
{
$addr=decodeBase58($addr);
if(strlen($addr)!=50)
{
return false;
}
$version=substr($addr,0,2);
if(hexdec($version)>hexdec($addressversion))
{
return false;
}
$check=substr($addr,0,strlen($addr)-8);
$check=pack("H*" , $check);
$check=strtoupper(hash("sha256",hash("sha256",$check,true)));
$check=substr($check,0,8);
return $check==substr($addr,strlen($addr)-8);
}
function hash160($data)
{
$data=pack("H*" , $data);
return strtoupper(hash("ripemd160",hash("sha256",$data,true)));
}
function pubKeyToAddress($pubkey)
{
return hash160ToAddress(hash160($pubkey));
}
function remove0x($string)
{
if(substr($string,0,2)=="0x"||substr($string,0,2)=="0X")
{
$string=substr($string,2);
}
return $string;
}
// version is used for multi algo coins
function versionToAlgo($coin, $version)
{
// could be filled by block json (chain analysis)
$algos['MYR'] = array(
0=>'sha256', 1=>'scrypt', 2=>'groestl', 3=>'skein', 4=>'qubit'
);
$algos['DGB'] = array(
0=>'scrypt', 1=>'sha256', 2=>'groestl', 3=>'skein', 4=>'qubit'
);
$algos['J'] = array(
2 =>'sha256', 3=>'x11', 4=>'x13', 5=>'x15', 6=>'scrypt',
7 =>'nist5', 8 =>'groestl', 9=>'penta', 10=>'whirl',
11=>'luffa', 12=>'keccak', 13=>'quark', 15=>'bastion'
);
$algos['SFR'] = array(
0=>'sha256', 1=>'scrypt', 2=>'groestl', 3=>'x11', 4=>'blake'
);
$symbol = $coin->symbol;
if (!empty($coin->symbol2)) $symbol = $coin->symbol2;
if ($symbol == 'J')
return arraySafeVal($algos[$symbol], $version, '');
else if (isset($algos[$symbol]))
return arraySafeVal($algos[$symbol], ($version >> 9) & 7, '');
return false;
}