我正在尝试按照使用 php 将 65 字节公钥转换为比特币地址所需的说明进行操作。说明非常明确。任何人都可以帮助我在 php 中执行此操作的实用性吗?
说明是
1 - 取对应生成的公钥(65字节,1字节0x04,32字节对应X坐标,32字节对应Y坐标)
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 - 取第二个 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);
}