<?php
// step 1
$publickey='0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6';
$step1=hexStringToByteString($publickey);
echo "step1 ".$publickey."<br>";
// step 2
$step2=hash("sha256",$step1); echo "step2 ".$step2."<br>";
// step 3
$step3=hash('ripemd160',hexStringToByteString
($step2)); echo "step3 ".$step3."<br>";
// step 4
$step4="00".$step3;
echo "step4 ".$step4."<br>";
// step 5
$step5=hash("sha256",hexStringToByteString
($step4)); echo "step5 ".$step5."<br>";
// step 6
$step6=hash("sha256",hexStringToByteString
($step5)); echo "step6 ".$step6."<br>";
// step 7
echo "step7 ".$checksum."<br>";
// step 8
$step8=$step4.$checksum;
echo "step8 ".$step8."<br>";
// step 9
// base conversion is from hex to base58 via decimal.
// Leading hex zero converts to 1 in base58 but it is dropped
// in the intermediate decimal stage. Simply added back manually.
$step9="1".bc_base58_encode(bc_hexdec($step8));
echo "step9 ".$step9."<br><br>";
function hexStringToByteString($hexString){
$byteString="";
for ($i=0;$i<$len;$i=$i+2){
$byteString.=chr($charnum); }
return $byteString;
}
// BCmath version for huge numbers
function bc_arb_encode($num, $basestr) {
Throw new Exception('You need the BCmath extension.');
}
$rep = '';
while( true ){
break;
}
}
$rem = bcmod($num, $base); $rep = $basestr[intval($rem)] . $rep; }
return $rep;
}
function bc_arb_decode($num, $basestr) {
Throw new Exception('You need the BCmath extension.');
}
$dec = '0';
for($i=0; $i < $cnt; $i++) {
$pos = strpos($basestr, $num_arr[$i]); if( $pos === false ) {
Throw new Exception
(sprintf('Unknown character %s at offset %d', $num_arr[$i], $i)); }
}
return $dec;
}
// base 58 alias
function bc_base58_encode($num) {
return bc_arb_encode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}
function bc_base58_decode($num) {
return bc_arb_decode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}
//hexdec with BCmath
function bc_hexdec($num) {
return bc_arb_decode
(strtolower($num), '0123456789abcdef'); }
function bc_dechex($num) {
return bc_arb_encode($num, '0123456789abcdef');
}
?>
PD9waHAKCi8vIHN0ZXAgMQoKJHB1YmxpY2tleT0nMDQ1MDg2M0FENjRBODdBRThBMkZFODNDMUFGMUE4NDAzQ0I1M0Y1M0U0ODZEODUxMURBRDhBMDQ4ODdFNUIyMzUyMkNENDcwMjQzNDUzQTI5OUZBOUU3NzIzNzcxNjEwM0FCQzExQTFERjM4ODU1RUQ2RjJFRTE4N0U5QzU4MkJBNic7Cgokc3RlcDE9aGV4U3RyaW5nVG9CeXRlU3RyaW5nKCRwdWJsaWNrZXkpOwoKZWNobyAic3RlcDEgIi4kcHVibGlja2V5LiI8YnI+IjsKCi8vIHN0ZXAgMgoKJHN0ZXAyPWhhc2goInNoYTI1NiIsJHN0ZXAxKTsKZWNobyAic3RlcDIgIi4kc3RlcDIuIjxicj4iOwoKLy8gc3RlcCAzCgokc3RlcDM9aGFzaCgncmlwZW1kMTYwJyxoZXhTdHJpbmdUb0J5dGVTdHJpbmcoJHN0ZXAyKSk7CmVjaG8gInN0ZXAzICIuJHN0ZXAzLiI8YnI+IjsKCi8vIHN0ZXAgNAoKJHN0ZXA0PSIwMCIuJHN0ZXAzOwplY2hvICJzdGVwNCAiLiRzdGVwNC4iPGJyPiI7CgovLyBzdGVwIDUKCiRzdGVwNT1oYXNoKCJzaGEyNTYiLGhleFN0cmluZ1RvQnl0ZVN0cmluZygkc3RlcDQpKTsKZWNobyAic3RlcDUgIi4kc3RlcDUuIjxicj4iOwoKLy8gc3RlcCA2Cgokc3RlcDY9aGFzaCgic2hhMjU2IixoZXhTdHJpbmdUb0J5dGVTdHJpbmcoJHN0ZXA1KSk7CmVjaG8gInN0ZXA2ICIuJHN0ZXA2LiI8YnI+IjsKCi8vIHN0ZXAgNwoKJGNoZWNrc3VtPXN1YnN0cigkc3RlcDYsMCw4KTsKZWNobyAic3RlcDcgIi4kY2hlY2tzdW0uIjxicj4iOwoKLy8gc3RlcCA4Cgokc3RlcDg9JHN0ZXA0LiRjaGVja3N1bTsKZWNobyAic3RlcDggIi4kc3RlcDguIjxicj4iOwoKLy8gc3RlcCA5Ci8vIGJhc2UgY29udmVyc2lvbiBpcyBmcm9tIGhleCB0byBiYXNlNTggdmlhIGRlY2ltYWwuIAovLyBMZWFkaW5nIGhleCB6ZXJvIGNvbnZlcnRzIHRvIDEgaW4gYmFzZTU4IGJ1dCBpdCBpcyBkcm9wcGVkCi8vIGluIHRoZSBpbnRlcm1lZGlhdGUgZGVjaW1hbCBzdGFnZS4gIFNpbXBseSBhZGRlZCBiYWNrIG1hbnVhbGx5LgoKJHN0ZXA5PSIxIi5iY19iYXNlNThfZW5jb2RlKGJjX2hleGRlYygkc3RlcDgpKTsKZWNobyAic3RlcDkgIi4kc3RlcDkuIjxicj48YnI+IjsKCgpmdW5jdGlvbiBoZXhTdHJpbmdUb0J5dGVTdHJpbmcoJGhleFN0cmluZyl7CiAgICAkbGVuPXN0cmxlbigkaGV4U3RyaW5nKTsKCiAgICAkYnl0ZVN0cmluZz0iIjsKICAgIGZvciAoJGk9MDskaTwkbGVuOyRpPSRpKzIpewogICAgICAgICRjaGFybnVtPWhleGRlYyhzdWJzdHIoJGhleFN0cmluZywkaSwyKSk7CiAgICAgICAgJGJ5dGVTdHJpbmcuPWNocigkY2hhcm51bSk7CiAgICB9CgpyZXR1cm4gJGJ5dGVTdHJpbmc7Cn0KCi8vIEJDbWF0aCB2ZXJzaW9uIGZvciBodWdlIG51bWJlcnMKZnVuY3Rpb24gYmNfYXJiX2VuY29kZSgkbnVtLCAkYmFzZXN0cikgewogICAgaWYoICEgZnVuY3Rpb25fZXhpc3RzKCdiY2FkZCcpICkgewogICAgICAgIFRocm93IG5ldyBFeGNlcHRpb24oJ1lvdSBuZWVkIHRoZSBCQ21hdGggZXh0ZW5zaW9uLicpOwogICAgfQoKICAgICRiYXNlID0gc3RybGVuKCRiYXNlc3RyKTsKICAgICRyZXAgPSAnJzsKCiAgICB3aGlsZSggdHJ1ZSApewogICAgICAgIGlmKCBzdHJsZW4oJG51bSkgPCAyICkgewogICAgICAgICAgICBpZiggaW50dmFsKCRudW0pIDw9IDAgKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkcmVtID0gYmNtb2QoJG51bSwgJGJhc2UpOwogICAgICAgICRyZXAgPSAkYmFzZXN0cltpbnR2YWwoJHJlbSldIC4gJHJlcDsKICAgICAgICAkbnVtID0gYmNkaXYoYmNzdWIoJG51bSwgJHJlbSksICRiYXNlKTsKICAgIH0KICAgIHJldHVybiAkcmVwOwp9CgpmdW5jdGlvbiBiY19hcmJfZGVjb2RlKCRudW0sICRiYXNlc3RyKSB7CiAgICBpZiggISBmdW5jdGlvbl9leGlzdHMoJ2JjYWRkJykgKSB7CiAgICAgICAgVGhyb3cgbmV3IEV4Y2VwdGlvbignWW91IG5lZWQgdGhlIEJDbWF0aCBleHRlbnNpb24uJyk7CiAgICB9CgogICAgJGJhc2UgPSBzdHJsZW4oJGJhc2VzdHIpOwogICAgJGRlYyA9ICcwJzsKCiAgICAkbnVtX2FyciA9IHN0cl9zcGxpdCgoc3RyaW5nKSRudW0pOwogICAgJGNudCA9IHN0cmxlbigkbnVtKTsKICAgIGZvcigkaT0wOyAkaSA8ICRjbnQ7ICRpKyspIHsKICAgICAgICAkcG9zID0gc3RycG9zKCRiYXNlc3RyLCAkbnVtX2FyclskaV0pOwogICAgICAgIGlmKCAkcG9zID09PSBmYWxzZSApIHsKICAgICAgICAgICAgVGhyb3cgbmV3IEV4Y2VwdGlvbihzcHJpbnRmKCdVbmtub3duIGNoYXJhY3RlciAlcyBhdCBvZmZzZXQgJWQnLCAkbnVtX2FyclskaV0sICRpKSk7CiAgICAgICAgfQogICAgICAgICRkZWMgPSBiY2FkZChiY211bCgkZGVjLCAkYmFzZSksICRwb3MpOwogICAgfQogICAgcmV0dXJuICRkZWM7Cn0KCgovLyBiYXNlIDU4IGFsaWFzCmZ1bmN0aW9uIGJjX2Jhc2U1OF9lbmNvZGUoJG51bSkgeyAgIAogICAgcmV0dXJuIGJjX2FyYl9lbmNvZGUoJG51bSwgJzEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXonKTsKfQpmdW5jdGlvbiBiY19iYXNlNThfZGVjb2RlKCRudW0pIHsKICAgIHJldHVybiBiY19hcmJfZGVjb2RlKCRudW0sICcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6Jyk7Cn0KCi8vaGV4ZGVjIHdpdGggQkNtYXRoCmZ1bmN0aW9uIGJjX2hleGRlYygkbnVtKSB7CiAgICByZXR1cm4gYmNfYXJiX2RlY29kZShzdHJ0b2xvd2VyKCRudW0pLCAnMDEyMzQ1Njc4OWFiY2RlZicpOwp9CmZ1bmN0aW9uIGJjX2RlY2hleCgkbnVtKSB7CiAgICByZXR1cm4gYmNfYXJiX2VuY29kZSgkbnVtLCAnMDEyMzQ1Njc4OWFiY2RlZicpOwp9Cj8+