PHPを使用して65バイトの公開鍵をビットコインアドレスに変換するために必要な指示に従おうとしています。指示は非常に明確です。PHPでそれを行うことの実用性について誰かが私を助けることができますか?
指示は
1 - 対応する公開鍵を取得します (65 バイト、1 バイト 0x04、X 座標に対応する 32 バイト、Y 座標に対応する 32 バイト)
0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
2 - 公開鍵で SHA-256 ハッシュを実行する
600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
3 - SHA-256 の結果に対して RIPEMD-160 ハッシュを実行する
010966776006953D5567439E5E39F86A0D273BEE
4 - RIPEMD-160 ハッシュ (メイン ネットワークの場合は 0x00) の前にバージョン バイトを追加します。
00010966776006953D5567439E5E39F86A0D273BEE
5 - 拡張された RIPEMD-160 の結果に対して SHA-256 ハッシュを実行する
445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094
6 - 前の SHA-256 ハッシュの結果に対して SHA-256 ハッシュを実行します
D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30
7 - 2 番目の SHA-256 ハッシュの最初の 4 バイトを取得します。これはアドレスのチェックサムです
D61967F6
8 - ポイント 4 の拡張 RIPEMD-160 ハッシュの末尾に、ポイント 7 の 4 チェックサム バイトを追加します。これは、25 バイトのバイナリ ビットコイン アドレスです。
00010966776006953D5567439E5E39F86A0D273BEED61967F6
9 - Base58Check エンコーディングを使用して、結果をバイト文字列から base58 文字列に変換します。これは、最も一般的に使用されるビットコイン アドレス形式です。
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
私の最初の試みは
// step 1
$publickey='0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6';
$step1=$publickey;
echo "step1 ".$publickey."<br>";
// step 2
$step2=hash("sha256",$step1);
echo "step2 ".$step2."<br>";
// step 3
$step3=hash('ripemd160',$step2);
echo "step3 ".$step3."<br>";
// step 4
$step4="00".$step3;
echo "step4 ".$step4."<br>";
// step 5
$step5=hash("sha256",$step4);
echo "step5 ".$step5."<br>";
// step 6
$step6=hash("sha256",$step5);
echo "step6 ".$step6."<br>";
// step 7
$checksum=substr($step6,0,8);
echo "step7 ".$checksum."<br>";
// step 8
$step8=$step4.$checksum;
echo "step8 ".$step8."<br>";
//step 9
$step9=base58_encode($step8);
echo "step9 ".$step9."<br><br>";
これは最初のステップで失敗します。どんな助けでも感謝します。
これが出力です
step1 0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
step2 32511e82d56dcea68eb774094e25bab0f8bdd9bc1eca1ceeda38c7a43aceddce
step3 7528c664cdc34c5ce809778eb688d32f89a538c0
step4 007528c664cdc34c5ce809778eb688d32f89a538c0
step5 86e76f4ff0bf0387339ac70a552e0fed615f7def34cc4809df1429e243f6c1fa
step6 b885b7225b370e7ff27ee0afb4f89b52b8675d5dc342d63de3abe7535f86cadb
step7 b885b722
step8 007528c664cdc34c5ce809778eb688d32f89a538c0b885b722
step9 1
Base58関数は
function base58_encode($input)
{
$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
$base_count = strval(strlen($alphabet));
$encoded = '';
while (floatval($input) >= floatval($base_count))
{
$div = bcdiv($input, $base_count);
$mod = bcmod($input, $base_count);
$encoded = substr($alphabet, intval($mod), 1) . $encoded;
$input = $div;
}
if (floatval($input) > 0)
{
$encoded = substr($alphabet, intval($input), 1) . $encoded;
}
return($encoded);
}